可以自己實現重定位的代碼

    在病毒裏面經常會使用到這種技術,因爲病毒的啓動往往不是通過windows來加載,那麼各個地址的重定位也就需要手工來完成,如果代碼本身就具備重定位功能的話,那麼手工加載病毒就會容易的多,可以輕易把病毒塞入一塊任意的由VirtualAlloc分配的內存.

    經典的代碼是這樣的

                      call delta                  ;//call這個動作發生的時候,會把返回地址退入堆棧的頂部,此時返回地址就是delta所在位置的絕對地址,當然call這個函數是通過相對偏移來調用的,不存在重定位的問題
  delta:              pop ebp                     ;//這裏取出返回地址,注意此地址是進程空間裏面的絕對地址
                      sub ebp, offset delta       ;//把絕對地址和相對偏移相減就可以獲得相對偏移與絕對地址的轉換關係
  
                      mov eax, [ebp
+kernel32]     ;//有了轉換關係之後就可以輕鬆調用各個由相對地址指定的數據段或者函數
  kernel32             dd     ?

 

    實際上我們做的工作就是windows加載時要做的工作,上面的代碼如果通過windows來加載完成,那麼相對偏移就會被windows重定位,與絕對地址的差值爲0.但是如果是手工加載,那麼這個差值就與加載地址密切相關了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章