界面看起來很普通
也沒有殼,直接搜索字符串找到關鍵代碼處
但是發現這些都是賦值,并沒有實現跳轉相關的函數。這里通過給彈窗函數下斷點,追一下返回函數來找觸發點。
再次點擊check
,觸發斷點,接著按ctrl+F9
返回到函數部分
再往上多找幾個跳轉就發現了獲取字符串的相關函數了。
從這里重新下斷點接著追,可以分析出以下函數內容
這里跟進這個call
里面看
這里主要是有一個地方注意,內存地址為0x405030
的位置的值,需要自己跟著看一下,算法還是挺簡單的。重復打開幾次軟件發現,這部分的值是固定的。
于是根據這個算法,可以計算出最后的值,然后填寫的密碼進行比較就可以了,寫出注冊機
#include <iostream>
#include <string>int main() {std::string username;printf("用戶名: ");std::getline(std::cin, username);int userLen = username.length();if ( userLen < 4) {printf("用戶名長度過短");return 0;}char str_00405030[8] = { 0x0c,0x0a,0x13,0x09,0x0c,0x0b,0x0a,0x08 };int eax = 0;int esi = 0;for (int ecx = 3; ecx < userLen; ecx++) {int dl = username[ecx];int bl = str_00405030[eax];esi += dl * bl;eax++;if(eax > 7)eax = 0 ;}printf("key: %d", esi);return 0;
}
搞定
其實這個程序總體代碼不多,翻源碼也是可以看到關鍵代碼的,但是在復雜的程序時就沒這么容易 了,所以采取了對窗口函數下斷的方式,雖然麻煩了,但是方法更加通用。