1. 程式人生 > >PE病毒之程式碼重定位技術

PE病毒之程式碼重定位技術

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] }

它是先計算病毒起始位置的差值,再加上全域性變數的值,最後算出重定位後的值。