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...