PE手動新增shellcode

2021-10-08 07:14:37 字數 2179 閱讀 7701

1、用ollydbg載入notepad,左下角command框中輸入bp messageboxa下斷點。檢視斷點即可得messagebox位址為:0x755b1060

2、call和jmp指令位址的計算

#include

#include

void

func()

intmain()

main 函式的反彙編

func()

;007c17a8 e8 8a f8 ff ff call func (

07c1037h)

return0;

007c17ad 33 c0 xor eax,eax

call的硬編碼是e8

然後f11跟進去

e9 c4 06

0000 jmp func (

0dd1700h)

jum的硬編碼是e9

8b f4                mov         esi,esp  

6a 00 push 0

6a 00 push 0

6a 00 push 0

6a 00 push 0

ff 15

98 b0 dd 00 call dword ptr [__imp__messageboxw@16

(0ddb098h)

這是messagebox的彙編

3、e8後面的值並不是我們真正要呼叫的位址,他是乙個相對值

公式如下:

e8後邊的值 = 真正要跳轉的位址 - (e8當前指令的位址 + e8當前指令所佔大小)

= 真正要跳轉的位址 - e8當前指令的下一行位址

所以我們通過硬編碼寫出這段shellcode

shellcode=

;\\將messagebox 4個引數壓入堆疊

0xe8

,0x00

,0x00

,0x00

,0x00

, \\ 呼叫messagebox

0xe9

,0x00

,0x00

,0x00

,0x00 \\跳到原程式的入口(addressofentrypoint)

找到第乙個節的空白區

pointertorawdata(0x0400)+sizeofrawdata(0x7800)=0x7c00

然後開始計算e8 e9後面的值

1、真正要跳轉的值是messagebox:0x755b1060

e8當前指令的下一行位址0x7b5d這裡是檔案中的要轉成記憶體中

記憶體中e8當前指令的下一行位址為:0x7b5d-pointertorawdata(0x400)+imagebase + virtualaddress= 0x0100875d

e8後面的值=0x755b1060-0x0100875d=0x745a8903

2、e9 需要jmp到原來的oep 739d

真正要跳轉的值 imagebase + addressofentrypoint = 0x0100739d

套公式e9後邊的值:0x0100739d - 0x01008762 = 0xffffec3b

3、修改oep

檔案中shellcode起始位址相對pointertorawdata偏移量:0x7b50 - 0x400 = 0x7750

對映到記憶體中,相對imagebase偏移:virtualaddress + 0x7750 = 0x8750

將原來的oep修改為,對映到記憶體後的shellcode起始位址(0x8750)。

儲存執行

手動新增訊息響應

windows系統中的程式大部分都是通過訊息和事件驅動的。在windows下的應用程式主要工作是進行訊息的迴圈處理,通過迴圈等待訊息的到來和事件 的發生,然後對不同的訊息和事件執行相關的 完成相應的操作。windows提供了大量的訊息,主要包括3種型別 標準訊息 通知訊息和命令訊息。當 然也可以根據...

dev gridcontrol控制項手動新增一行資料

我已經兩次遇到過這樣的問題,嘗試手動新增,整整兩天時間都沒有成功。網上說的方法基本都是繫結資料來源,偶爾有人說用setrowcellvalue方法,用法如下 gridview1.setrowcellvalue 0,gridview1.columns 0 qwe 即在0行0列的單元格設為qwe值,看起...

手動新增Picture Control控制項變數

環境 visual studio vs2013 問題 使用類嚮導新增控制項變數不成功,手動新增控制項變數 解決辦法 1.在dlg標頭檔案中新增如下 cstatic m stalogoimage cstatic m stapicture 2.在對應的原始檔dodataexchange函式裡新增如下 v...