160个Crackme009
文章目錄
- 查殼
- VB Decompiler分析程序
- 前置知識
- OD分析算法
- 寫出注冊機
- 驗證結果
查殼
先來查一下殼,這個程序是用VB寫的,和008是同一個作者,用的是用戶名和序列號的保護方式,難度可能會有所上升,所以得分析整個按鈕點擊事件的算法。
VB Decompiler分析程序
把程序拖到VB Decompiler里,這個可是VB的逆向神器啊。
重要的信息有兩個,一個是Native Code,說明是自然編譯的,程序在編譯的時候能夠被編譯為機器碼,以Native Code方式編譯的VB程序可以直接用OD調試。
另外一個就是Click的按鈕點擊事件了,因為整個程序只有一個OK按鈕,所以直接就能判定這個就ok按鈕的點擊事件。
記下偏移,來到0x401FF0處。
前置知識
想要分析出來這個Crackme,必須具備兩個VB的前置知識
- 第一個就是VB的變量特征,VB是采用寄存器接收變量地址,地址是指向一個結構體,首地址存放的是類型編號,首地址+0x8。如果是字符串則首地址+0x8的位置是字符串的地址
- 第二個VB反匯編中很多時候會在[ebp-0x34]這個堆棧地址中看到最終的計算的結果,至于為什么 待會就知道了
如果你不知道上面兩個規律 這個Crackme絕對會逆的一臉蒙蔽
OD分析算法
隨便輸入一個賬號密碼,直接來到按鈕事件開頭,開始分析整個算法。
首先函數會求出用戶名的長度,怎么知道是求的用戶名的長度呢?首先看堆棧找到參數的地址 數據窗口跟隨,然后首地址+0x8的地方 也就是我內存窗口選中的地址再次數據窗口跟隨。
就找到了真正的參數,這個就是VB變量的存放規則,幾乎無時無刻不在用。
接著步過這個函數,eax返回地址+0x8的位置就是用戶名的長度。
接著以字符串的長度為循環次開始循環。
首先取出用戶名的每一位,然后計算每一位的ASCII值,
然后將用戶名的ASCII值和前一位的ASCII值相加得出結果,再用vbaVarMove這個函數將結果保存到[ebp-0x34]這個地址。想要動態的看到所有的過程可以用上面的方法觀察堆棧參數,找到首地址+0x8的位置詳細分析。
直接跳過這輪循環在[ebp-0x34]的地址處查看最后的結果為0x2C4。
接著用vbaVarMul將用戶名ASCII的結果和0x499602D2相乘,也就是十進制的1234567890,然后再次通過vbaVarMove將計算結果保存到[ebp-0x34]。
然后用-替換掉計算結果的第4位
和結果的第9位
接著將最后計算的結果和原先輸入的密碼做比較,用堆棧的參數和VB的數據結構特點可以看到正確的注冊碼和原先輸入的密碼。
到這里,這個注冊算法就分析完成了
寫出注冊機
int CalcKey() {char szUserName[20] = { 0 }; __int64 result = 0;char key[50] = { 0 };printf("請輸入用戶名:");scanf_s("%s", szUserName, 20);int iUserNameLen = strlen(szUserName);//求出每一位用戶名的和for (int i = 0; i < iUserNameLen; i++){result += szUserName[i];}result *= 1234567890;//轉為字符串sprintf(key, "%I64d", result);//替換第4位和第9位key[3] = '-';key[8] = '-';printf("%s\n", key);return 0; }驗證結果
輸入用戶名,將計算的序列號填入。OK顯示正常,這個Crackme也就完成了。
需要相關文件的可以到我的Github下載:https://github.com/TonyChen56/160-Crackme
總結
以上是生活随笔為你收集整理的160个Crackme009的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 004 .NetReactor 3.6.
- 下一篇: 005 NsPack 1.4 之附加数据