一道逆向題
查殼后程序是一個32位無殼的程序
拉到od和ida中分析一下
經(jīng)過分析,


首先分析第一個字符串比較的call

取字符串的第一個字符,循環(huán)字符串n次(n為字符串的長度),將第一個字符相加n次,然后這個值=550也就是0x226
所以這里只要滿足 字符*n=550 就可以,經(jīng)過后面的分析這里n需要填10(見下文)
也就是?7開頭長度為10 的字符串
接下來調(diào)試程序
在段首004010770地址下個斷點(ida中main函數(shù)開頭的地址)

我們一路單步(F8)來到這里,這里必須跳轉(zhuǎn)(可以修改標(biāo)志寄存器的S位改變是否跳轉(zhuǎn)),不然程序是不會進行字符串比較的
下面那個call就是進行字符串比較的call了

我們單步(F7)進入,發(fā)現(xiàn)這里面有兩個跳轉(zhuǎn)
第一個jnz就是==550的判斷
第二個jnz是字符串是否相等的判斷

對應(yīng)ida中

這里我們看到一串類似base64的字符串
搜索字符串看一下

猜測這里他自定義了base64編碼表

解密得到
因為這里解密到的長度是10,所以上面的n才為10,不然加密后的字符串長度是不夠的

此時我們測試一下,
當(dāng)算法call執(zhí)行完成后我們修改字符串為 上面解密到的,我們看能不能成功

在內(nèi)存窗口中修改后

然后來到字符串比較的地方
我們可以看到要進行比較的兩個字符串是一樣的

所以現(xiàn)在
只需要讓我們輸入的字符串經(jīng)過算法call后等于?? =>=:<2>?=2
然后分析一下算法的call

算法call里主要就是這個call,然后這個call執(zhí)行了4次,我們點進去
分析
第一次執(zhí)行的是4
第二次1
第三次2
第四次3

此時只需要將? =>=:<2>?=2 反推回來
也就是
先每一位+1,再除啦第一位后面每一位-3,再每一位xor9? 就可以了
然后寫腳本

