一般來說,逆向分析並不是對那些龐大的程序進行完整的逆向,只是分析特定位置的一個或幾個函數。
1、程序加載詳解#
打開菜單上的 VIEW-OPEN SUBVIEW-SEGMENTS,可以看到已經自動加載的程序區塊。
在區段的名稱(NAME)
一列後面,是區段起始(START)
和終點(END)
的地址。
RWX 這一列顯示初始狀態下這個區段是否有讀READ(R)
、寫WRITE(W)
以及執行EXECUTION(X)
權限。
後面的D
和L
兩列分別對應於DEBUGGER(調試器)
和LOADER(加載器)
。
第一列 (D) 為空,只有程序在調試模式時才會填充已經加載的區段,L 這一列顯示了加載器創建的區段,其他列的內容不是那麼重要。
2、查看關鍵字符串#
嘗試打開 exe 程序
在 help-register 處可輸入 name 和 serial。
隨意輸入字符,提示 No luck there,mate!
查看字符串,快捷鍵 shift + F12。
可以看到和程序一樣的提示。
雙擊上圖中的字符,跳轉到如下位置
在 0x00402169 地址上保存了這條字符串,在該地址上按D鍵
可以查看具體的字節。
再一次按 A 鍵可以恢復顯示字符串,按 X 鍵更好的顯示右邊的引用。
3、查找關鍵函數#
上圖中,有兩個不同的函數引用了這條字符串。一個是sub_401362
,另一個是sub_40137E
。
之所以是兩個不同的函數,因為 IDA 顯示引用都是 functions + XXXX 這種方式,如果他們屬於同一個函數,那麼只有 XXXX 這個值會改變,而前面的部分不變,但是 sub_後的地址是不一樣的。
sub_401362
sub_40137E
目前已經找到所有顯示註冊不成功信息的位置。
回到sub_401362函數,如圖所示,這裡調用了 messagebox API 函數來顯示 NO LUCK THERE MATE 這樣的消息。這個 API 函數接收 NO LUCK 字符串作為窗口標題,NO LUCK THERE MATE 字符串作為顯示的文本。
sub_40137E也一樣,意味著在兩個地方都會觸發註冊不成功的消息。有可能是處理不同的信息。如果要顯示註冊成功的消息,這兩處都要繞開。
接下來按 X 鍵查看程序對sub_401362函數的引用如下圖所示,只有一處引用。
轉到這個引用之前,重命名一下sub_401362 函數,比如說 CARTEL_ERROR。在函數地址上按N鍵
,然後填寫這個新的名字。
來到引用了 CARTEL_ERROR 函數處
在調用 CARTEL_ERROR 函數之前又一個 jz 跳轉,為了區分成功 / 失敗的代碼塊,可以給這些代碼塊加上顏色),點擊代碼塊右上角顏色選擇器,如下圖所示。
續在 0x40124c 處按回車鍵,進入被調用的函數 0x40134d。
0x40134D 函數
將0x40134D 函數改成 CARTEL_BUENO 名稱。
將引用他們的代碼塊變成綠色。
4、標記指令位置#
繼續來到 0x401243 代碼處的 jz 命令,打開菜單 JUMP-MARK POSITION(快捷鍵 alt + m),將其命名位 DECISION_FINAL,之後就能輕鬆回到這個位置。
打開菜單 Jump-Jump to marked position。
就可以輕鬆跳轉到對應的位置。
5、修改指令#
按照之前的分析,如果把 0x401243 處的 JZ 改成 JNZ,那麼輸入一個非法密碼的時候,程序也會執行註冊成功這條路徑。
注:keypatch
由於 7.6 版本沒有 keypatch 這個插件,嘗試安裝也沒能安裝上,所以換了個 ida 7.7 的綠色漢化版。
當前指令處右鍵,選擇keypatch-patch
(快捷鍵:ctrl + alt + k)。
打開如下窗口:
修改內容如下:
修改後,點擊 patch,返回如下內容,後面的註釋告訴你修改了內容。
再一次右鍵點擊patching-apply patch to...
,保存修改後的內容
保存為 exe 文件。
運行 crackme.exe 程序,隨意輸入內容,一共彈出兩個窗口,一個成功提示,一個失敗提示。
綜上,需要修改兩處的內容,才能繞過註冊。
如上圖所示,這裡顯示了另一處註冊失敗的消息,同時紅色代碼塊上方有一個 cmp 指令,比較用戶輸入的用戶名的字符是否小於 0x41,也就是字符 A。如果小於 0x41,則提示註冊失敗。
之前運行 crackme.exe 註冊時,輸入的時 111(0=30,1=31),顯然小於 0x41,所以當程序檢測到包含數字的時候,就顯示註冊失敗。這裡就不能把 jb 改成 jnb 了,不然輸入字符又會報錯了。
上圖中的虛線,顯示了程序將跳轉到這裡就報錯,所以如果將跳轉指令改成 nop,程序就不會跳轉了,而是繼續執行下一條指令,而不執行這裡的報錯。
切回圖形化顯示。
修改後整體界面混亂。
上圖可以看到修改後的 nop 字節,報錯信息也被孤立了。
重新保存修改後的文件。
測試完成後,支持任意字符輸入了。