代码重定位技术

int g_nTest;
__asm
{
                  call Dels
              Dels:
                  pop ebx
                  lea eax, g_nTest
                 sub eax, Dels
                 lea edx, [ebx + eax]
}

上面的这段代码是我们在编写病毒时用到的,目的是要计算出正确的全局变量g_nTest的地址,如果直接在病毒本体中写入一个全局变量,病毒感染目标后绝大多数情况是无法找到这个全局变量的,因为感染到目标程序以后的病毒起始位置改变了,通过上面几行简单的汇编代码,就可以做到动态寻址全局变量g_nTest。
原理是利用了全局变量跟病毒起始位置的差值是永远不会变的。

我们假设执行完pop ebx的值是0x801009,这个值是病毒起始位置,全局变量的值是0x401000,根据汇编代码接着会将g_nTest减去Dels,Dels是本体病毒起始位置,它是0x401009,差值是-0x09。
病毒起始位置加上差值就是重定位后的全局变量地址,也就是0x801009-0x9 = 0x801000。

还有一种方法如下:

int g_nTest;
__asm
{
                 call Dels
            Dels:
                 pop ebx
                 sub ebx, Dels
                 lea edx, [ebx + g_nTest]

}

它是先计算病毒起始位置的差值,再加上全局变量的值,最后算出重定位后的值。

你可能感兴趣的:(Windows逆向)