使用匯編語言實現(xiàn)if else 循環(huán)函數(shù)調(diào)用的具體方法
需要使用匯編來演示如下代碼 需要下載ollydbg匯編調(diào)試器 點擊File-Open隨意打開一個exe文件 我這里隨便找到c:/windows/explorer.exe文件
這里EIP的值表示下一次運行需要執(zhí)行的代碼位置
雙擊 EIP紅色地址 左邊代碼會自動跳轉(zhuǎn)到對應(yīng)的代碼行 有了以下環(huán)節(jié) 接下來添加代碼
如果替換的代碼 占用的字節(jié)數(shù) 小于原始的代碼數(shù) 會自動補充 nop空指令
一。實現(xiàn) if else
MOV EAX,1 表示將1立即數(shù) 設(shè)置給EAX寄存器
CMP EAX,1 比較EAX的值和1是否相等 Z標志位(如果減法運算 結(jié)果為0 該標志被置為1 不為0 標志位被置為0) 這里EAX=1 Z標志=1
JE 0101A572 表示有條件跳轉(zhuǎn) 當Z標志=1(也就是EAX=1) 自動跳轉(zhuǎn)到后面指定的0101A572 地址 就會執(zhí)行 move EBX,1
JNE 0101A578 表示有條件跳轉(zhuǎn) 當Z標志=0(也就是EAX!=1) 自動跳轉(zhuǎn)到后面指定的0101A578 地址 就會執(zhí)行 move ECX,1
如果需要調(diào)試 參考如下圖
二。實現(xiàn) 循環(huán)
MOV ECX,4 表示將4立即數(shù) 設(shè)置給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 表示有條件跳轉(zhuǎn) 當ECX!=0時 z標志位=0 跳轉(zhuǎn)到0101A564這個位置 繼續(xù)遞減 一直循環(huán)到 ECX=0時 此時z標志位=1
不執(zhí)行跳轉(zhuǎn)循環(huán)結(jié)束
也可以使用 LOOP 跳轉(zhuǎn)的位置來進行循環(huán) 該指令會自動將ECX的值 遞減1 不需要單獨控制ECX遞減 當ECX遞減到0時自動退出循環(huán)
loop
二。實現(xiàn) 函數(shù)調(diào)用
這里需要明白一下函數(shù)調(diào)用的實際過程 是先將 參數(shù)壓入棧中 在c語言中 stdcall 先壓入函數(shù)右邊的參數(shù) 這里假設(shè)有兩個參數(shù)10和20
棧的原理是 先入后出 壓入兩個參數(shù)后 call指令會自動壓入 函數(shù)調(diào)用完成后 下一個執(zhí)行指令的位置
PUSH 10 壓入第一個參數(shù)
PUSH 20 壓入第二個參數(shù)
CALL 0101A56D 調(diào)用函數(shù) 函數(shù)的入口地址是0101A56D 可以查看如下圖片中右下角堆棧的部分 分別壓入了 10,20 以及call后面的一句代碼的地址
0101A568 也就是call完成了執(zhí)行0101A568 這里的代碼
call 0101A56D 會自動跳轉(zhuǎn)到0101A56D 代碼的位置 這里取出棧中(ESP指向棧頂 棧頂是call完成后返回的地址) ESP棧頂+4(第二個參數(shù)) ESP棧頂+8(第一個參數(shù))
retn 8 表示 函數(shù)返回 返回 就會自動跳轉(zhuǎn)到棧頂指向的地址的代碼位置0101A568 就會執(zhí)行 (8這個數(shù) 表示自動將堆棧中兩個參數(shù)的值出棧 拋棄)
jmp 0101A57A
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
匯編語言80x86系統(tǒng)通用數(shù)據(jù)傳送指令詳解
這篇文章主要為大家介紹了匯編語言80x86系統(tǒng)通用的數(shù)據(jù)傳送指令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11匯編用串檢測scasb尋找數(shù)的位置實現(xiàn)
這篇文章主要介紹了匯編用串檢測scasb尋找數(shù)的位置實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2020-02-02Go 中的循環(huán)是如何轉(zhuǎn)為匯編的(方法詳解)
這篇文章主要介紹了Go 中的循環(huán)是如何轉(zhuǎn)為匯編的,本文通過循環(huán)的匯編代碼給大家講解的非常詳細,代碼簡單易懂,非常不錯,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05