天天看點

代碼重定位技術

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]

}
           

它是先計算病毒起始位置的內插補點,再加上全局變量的值,最後算出重定位後的值。

繼續閱讀