基本上多數破解的思路是一樣的,就是將本來判斷為true的時候乾的事情改為邏輯值為false就做,因此常常需要替換一些彙編命令:
cmp a,b 比較a與b
mov a,b 把b的值送給a
ret 返回主程式
nop 無作用,英文“no operation”的簡寫,意思是“do nothing”(機器碼90)***機器碼的含義參看上面
(解釋:ultraedit開啟編輯exe檔案時你看到90,等同於彙編語句nop)
call 調用子程式
je 或jz 若相等則跳(機器碼74 或0F84)
jne或jnz 若不相等則跳(機器碼75或0F85)
jmp 無條件跳(機器碼EB)
jb 若小於則跳
ja 若大於則跳
jg 若大於則跳
jge 若大於等於則跳
jl 若小於則跳
jle 若小於等於則跳
pop 出棧
push 壓棧call 機器碼也是E8?
三.常見修改(機器碼)
74=>75 74=>90 74=>EB
75=>74 75=>90 75=>EB
jnz->nop
75->90(相應的機器碼修改)
jnz -> jmp
75 -> EB(相應的機器碼修改)
jnz -> jz
75->74 (正常) 0F 85 -> 0F 84(特殊情況下,有時,相應的機器碼修改)
四.兩種不同情況的不同修改方法
1.修改為jmp
je(jne,jz,jnz) =>jmp相應的機器碼EB (出錯資訊向上找到的第一個跳轉)jmp的作用是絕對跳,無條件跳,從而跳過下面的出錯資訊
xxxxxxxxxxxx 出錯資訊,例如:註冊碼不對,sorry,未註冊版不能...,"Function Not Avaible in Demo" 或 "Command Not Avaible" 或 "Can't save in Shareware/Demo"等 (我們希望把它跳過,不讓它出現)
。。。
。。。
xxxxxxxxxxxx 正確路線所在
2.修改為nop
je(jne,jz,jnz) =>nop相應的機器碼90 (正確資訊向上找到的第一個跳轉) nop的作用是抹掉這個跳轉,使這個跳轉無效,失去作用,從而使程式順利來到緊跟其後的正確資訊處
xxxxxxxxxxxx 正確資訊,例如:註冊成功,謝謝您的支援等(我們希望它不被跳過,讓它出現,程式一定要順利來到這裡)
。。。
。。。
xxxxxxxxxxxx 出錯資訊(我們希望不要跳到這裡,不讓它出現)它們在存貯器和寄存器、寄存器和輸入輸出連接埠之間傳送資料.
例如使用windbg時候
0:000> dd 0c366b28 l40c366b28 7e830c74 940f0108 c0b60fc0 01b805eb 執行ed 0c366b28 7e830c75修改為0:000> dd 0c366b28 l40c366b28 7e830c75 940f0108 c0b60fc0 01b805eb
cmp a,b 比較a與b
mov a,b 把b的值送給a
ret 返回主程式
nop 無作用,英文“no operation”的簡寫,意思是“do nothing”(機器碼90)***機器碼的含義參看上面
(解釋:ultraedit開啟編輯exe檔案時你看到90,等同於彙編語句nop)
call 調用子程式
je 或jz 若相等則跳(機器碼74 或0F84)
jne或jnz 若不相等則跳(機器碼75或0F85)
jmp 無條件跳(機器碼EB)
jb 若小於則跳
ja 若大於則跳
jg 若大於則跳
jge 若大於等於則跳
jl 若小於則跳
jle 若小於等於則跳
pop 出棧
push 壓棧