需要使用匯編來演示如下代碼 需要下載ollydbg匯編調試器 點擊File-Open隨意打開一個exe文件 我這里隨便找到c:/windows/explorer.exe文件
這里EIP的值表示下一次運行需要執行的代碼位置
雙擊 EIP紅色地址 左邊代碼會自動跳轉到對應的代碼行 有了以下環節 接下來添加代碼
如果替換的代碼 占用的字節數 小于原始的代碼數 會自動補充 nop空指令
一。實現 if else
MOV EAX,1 表示將1立即數 設置給EAX寄存器
CMP EAX,1 比較EAX的值和1是否相等 Z標志位(如果減法運算 結果為0 該標志被置為1 不為0 標志位被置為0) 這里EAX=1 Z標志=1
JE 0101A572 表示有條件跳轉 當Z標志=1(也就是EAX=1) 自動跳轉到后面指定的0101A572 地址 就會執行 move EBX,1
JNE 0101A578 表示有條件跳轉 當Z標志=0(也就是EAX!=1) 自動跳轉到后面指定的0101A578 地址 就會執行 move ECX,1
如果需要調試 參考如下圖
二。實現 循環
MOV ECX,4 表示將4立即數 設置給ECX寄存器
DEC ECX 將ECX的值 減去1
TEST ECX,ECX TEST指令是將ECX和ECX進去邏輯與 操作 1001&1001一定是自己1001 只有當ECX等于0時 0&0就是0 這個test指令 會修改Z標志
位 如果ECX等0 那么邏輯與 Z標志位就是1 ECX不等于0 Z標志位等于0 所以TEST ECX,ECX可以判斷ECX是否為0
JNE 0101A564 表示有條件跳轉 當ECX!=0時 z標志位=0 跳轉到0101A564這個位置 繼續遞減 一直循環到 ECX=0時 此時z標志位=1
不執行跳轉循環結束
也可以使用 LOOP 跳轉的位置來進行循環 該指令會自動將ECX的值 遞減1 不需要單獨控制ECX遞減 當ECX遞減到0時自動退出循環
loop
二。實現 函數調用
這里需要明白一下函數調用的實際過程 是先將 參數壓入棧中 在c語言中 stdcall 先壓入函數右邊的參數 這里假設有兩個參數10和20
棧的原理是 先入后出 壓入兩個參數后 call指令會自動壓入 函數調用完成后 下一個執行指令的位置
PUSH 10 壓入第一個參數
PUSH 20 壓入第二個參數
CALL 0101A56D 調用函數 函數的入口地址是0101A56D 可以查看如下圖片中右下角堆棧的部分 分別壓入了 10,20 以及call后面的一句代碼的地址
0101A568 也就是call完成了執行0101A568 這里的代碼
call 0101A56D 會自動跳轉到0101A56D 代碼的位置 這里取出棧中(ESP指向棧頂 棧頂是call完成后返回的地址) ESP棧頂+4(第二個參數) ESP棧頂+8(第一個參數)
retn 8 表示 函數返回 返回 就會自動跳轉到棧頂指向的地址的代碼位置0101A568 就會執行 (8這個數 表示自動將堆棧中兩個參數的值出棧 拋棄)
jmp 0101A57A
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持html5模板網。