7.破解的最简单例子
書上分析的那些東西,我手里沒有相關PE文件,我就自己隨便寫一個最簡單的,然后來破解下吧(代碼我最后公布):
先雙擊運行下,發現是這個樣子:
?
OK?看到的是?MessageInt.NO,點擊確定之后,程序就退出了。到底是個啥,當然此時我們也不知道,直接先定位到這個字符串附近,看看代碼啥意思:
雙擊
然后突然覺得應該是搜索MessageBoxW才對,這樣如果上層是if判斷實處NO或者YES啥的也方便看,結果:
發現只有一次調用。而且之前字符串查找的時候也只發現一個MessageInt.NO沒有發現什么別的YES啥的字符串,其實這個地方是我的問題,我不是說自己寫的Demo然后分析嗎,我開了優化,自動把代碼優化掉了。最后看我C++代碼就知道啦。所以這個地方把優化全都關閉了,或者VS的直接Debug生成程序。然后再分析:
直接查函數調用
?
OK是兩個,點進去看下:
jnz?如果不相等,直接跳轉到013B1758執行,否則執行繼續執行下一行。OK第一反應是直接把這個jnz改成je或者jz就好了。看看效果:
?
在匯編代碼區域右鍵,復制可執行文件。然后點擊保存,生成XXX.exe文件,雙擊XXX的EXE文件看效果:
OK?破解成功了。其實分析那塊匯編部分破解方式還有很多種,比如:
分析完是這樣,我都寫在注釋里了。
可以用IDA看一下:
繼續IDA按F5反編譯:
?
額...看到的是這么個東西。好吧。
然后我修訂了0x1234+0x5678的正確值
繼續執行,發現輸出YES。保存文件之后,重新點擊PE文件是破解了的。
IDA看下發現其實比較的地方那個值已經修改了:
還有其他的破解方式,大家自己探索吧,我把源代碼貼到下面(很簡單,經過上面也都看出來了)VS2015?C++
#include "stdafx.h" #include <iostream> #include <windows.h> using namespace std; int main(){DWORD dwNumber1 = 0x1234;DWORD dwNumber2 = 0x5678;if (dwNumber1 + dwNumber2 == 0x1234) {MessageBox(NULL ,L"MessageInt.YES" , L"Title", NULL);}else {MessageBox(NULL, L"MessageInt.NO", L"Title", NULL);}return 0; }?
總結
以上是生活随笔為你收集整理的7.破解的最简单例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6.栈、栈帧
- 下一篇: 8.继续分析一破解加密码获取-最最最简单