PE病毒之程式碼重定位技術
阿新 • • 發佈:2018-11-27
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]
}
它是先計算病毒起始位置的差值,再加上全域性變數的值,最後算出重定位後的值。