8.继续分析一破解加密码获取-最最最简单的注册机
先看程序:
?
大體上是輸入密碼吧。
先第一個思路,直接破解密碼校驗的地方。直接改匯編代碼。
跟蹤字符串快速縮小范圍:Password?Is?Wrong
?
找到了,然后直接改:
?
OK破解成功:
現在換個思路,看看能不能直接把他的真實密碼拿出來。
上面看字符串的時候看到一個詭異的字符串112233,可以先懵一把,沒錯就是懵一把。
OK密碼不對。繼續開始分析。
?
然后是用了一個竅門就是在輸入的地方先輸入東西,因為調試還沒走到那,所以不會接受,然后一步一步調試,當過了某個call函數的時候,如果剛剛輸入的字符串突然出現了,那么就先鎖定這個字符串,一層一層卡位往里走(一開始從Pass...Yes往前倒著走,走著走著沒思路了),然后分析結果是下面這樣(分析都寫在注釋里了):
異或0x1的那個函數call?asd.00811100是這個(分析都寫在注釋里了):
?
然后是上上個圖的那個XXXXXXXX的位置,我覺得應該是做字符串比較呢,就是把輸入字符串異或0x1之后和某個字符串比較。但是里面還沒分析清楚,明天再說吧,今天來不及了。還有一個竅門就是知道是xor?0x1了之后我的所有輸入字符串都是00000了。這樣方便觀察。最后偷了個懶。在查找Password。。。字符串的時候我看到了112233,那么可以猜測一把,輸入串異或之后是和112233比較。所以直接112233異或1之后得到003322,然后測試一波:
?
然后C++實現了下代碼,如下,大家可以自己編譯之后分析學習
?
//?NXY.cpp?:?定義控制臺應用程序的入口點。//MessageBox(NULL,L"HelloWorld",NULL,MB_OK);#include?"stdafx.h"#include?<iostream>#include?<windows.h>#include?<string>using?namespace?std;VOID?MessageOut(const?string?&strMess)?{MessageBoxA(NULL,?strMess.c_str(),NULL,NULL);}string?GetXorString(const?string?&strResore)?{string?strXorResult?=?"";for?(int?index?=?0;?index?<?strResore.length();?index++)?{strXorResult?+=?strResore[index]?^?0x1;}return?strXorResult;}int?main(){string?strPassword?=?"112233";//cout<<GetXorString(strPassword);string?strInput?=?"";cin?>>?strInput;strPassword?==?GetXorString(strInput)???MessageOut("Password?Is?OK!")?:?MessageOut("Password?Is?Wrong");cout?<<?endl;return?0;}?
總結
以上是生活随笔為你收集整理的8.继续分析一破解加密码获取-最最最简单的注册机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7.破解的最简单例子
- 下一篇: MongoDB中的读写锁