banner
lca

lca

真正的不自由,是在自己的心中设下牢笼。

《從零開始學IDA逆向》學習筆記-8(靜態逆向分析入門)

image

一般來說,逆向分析並不是對那些龐大的程序進行完整的逆向,只是分析特定位置的一個或幾個函數。

1、程序加載詳解#

打開菜單上的 VIEW-OPEN SUBVIEW-SEGMENTS,可以看到已經自動加載的程序區塊。

image

image

在區段的名稱(NAME)一列後面,是區段起始(START)終點(END)的地址。
RWX 這一列顯示初始狀態下這個區段是否有讀READ(R)、寫WRITE(W)以及執行EXECUTION(X)權限。
後面的DL兩列分別對應於DEBUGGER(調試器)LOADER(加載器)
第一列 (D) 為空,只有程序在調試模式時才會填充已經加載的區段,L 這一列顯示了加載器創建的區段,其他列的內容不是那麼重要。

2、查看關鍵字符串#

嘗試打開 exe 程序

image

在 help-register 處可輸入 name 和 serial。

image

隨意輸入字符,提示 No luck there,mate!

image

查看字符串,快捷鍵 shift + F12。

image

可以看到和程序一樣的提示。

image

雙擊上圖中的字符,跳轉到如下位置

image

在 0x00402169 地址上保存了這條字符串,在該地址上按D鍵可以查看具體的字節。

image

image

再一次按 A 鍵可以恢復顯示字符串,按 X 鍵更好的顯示右邊的引用。

image

3、查找關鍵函數#

上圖中,有兩個不同的函數引用了這條字符串。一個是sub_401362,另一個是sub_40137E

之所以是兩個不同的函數,因為 IDA 顯示引用都是 functions + XXXX 這種方式,如果他們屬於同一個函數,那麼只有 XXXX 這個值會改變,而前面的部分不變,但是 sub_後的地址是不一樣的。

image

sub_401362

image

sub_40137E

目前已經找到所有顯示註冊不成功信息的位置。

回到sub_401362函數,如圖所示,這裡調用了 messagebox API 函數來顯示 NO LUCK THERE MATE 這樣的消息。這個 API 函數接收 NO LUCK 字符串作為窗口標題,NO LUCK THERE MATE 字符串作為顯示的文本。

sub_40137E也一樣,意味著在兩個地方都會觸發註冊不成功的消息。有可能是處理不同的信息。如果要顯示註冊成功的消息,這兩處都要繞開。

接下來按 X 鍵查看程序對sub_401362函數的引用如下圖所示,只有一處引用。

image

轉到這個引用之前,重命名一下sub_401362 函數,比如說 CARTEL_ERROR。在函數地址上按N鍵,然後填寫這個新的名字。

image

來到引用了 CARTEL_ERROR 函數處

image

在調用 CARTEL_ERROR 函數之前又一個 jz 跳轉,為了區分成功 / 失敗的代碼塊,可以給這些代碼塊加上顏色),點擊代碼塊右上角顏色選擇器,如下圖所示。

image

續在 0x40124c 處按回車鍵,進入被調用的函數 0x40134d。

image

image

0x40134D 函數

image

0x40134D 函數改成 CARTEL_BUENO 名稱。

將引用他們的代碼塊變成綠色。

image

4、標記指令位置#

繼續來到 0x401243 代碼處的 jz 命令,打開菜單 JUMP-MARK POSITION(快捷鍵 alt + m),將其命名位 DECISION_FINAL,之後就能輕鬆回到這個位置。

image

image

打開菜單 Jump-Jump to marked position。

image

就可以輕鬆跳轉到對應的位置。

image

5、修改指令#

按照之前的分析,如果把 0x401243 處的 JZ 改成 JNZ,那麼輸入一個非法密碼的時候,程序也會執行註冊成功這條路徑。

注:keypatch

由於 7.6 版本沒有 keypatch 這個插件,嘗試安裝也沒能安裝上,所以換了個 ida 7.7 的綠色漢化版。

當前指令處右鍵,選擇keypatch-patch(快捷鍵:ctrl + alt + k)。

image

打開如下窗口:

image

修改內容如下:

image

修改後,點擊 patch,返回如下內容,後面的註釋告訴你修改了內容。

image

再一次右鍵點擊patching-apply patch to...,保存修改後的內容

image

保存為 exe 文件。

image

運行 crackme.exe 程序,隨意輸入內容,一共彈出兩個窗口,一個成功提示,一個失敗提示。

image

image

綜上,需要修改兩處的內容,才能繞過註冊。

image

如上圖所示,這裡顯示了另一處註冊失敗的消息,同時紅色代碼塊上方有一個 cmp 指令,比較用戶輸入的用戶名的字符是否小於 0x41,也就是字符 A。如果小於 0x41,則提示註冊失敗。

之前運行 crackme.exe 註冊時,輸入的時 111(0=30,1=31),顯然小於 0x41,所以當程序檢測到包含數字的時候,就顯示註冊失敗。這裡就不能把 jb 改成 jnb 了,不然輸入字符又會報錯了。

image

上圖中的虛線,顯示了程序將跳轉到這裡就報錯,所以如果將跳轉指令改成 nop,程序就不會跳轉了,而是繼續執行下一條指令,而不執行這裡的報錯。

切回圖形化顯示。

image

image

修改後整體界面混亂。

image

上圖可以看到修改後的 nop 字節,報錯信息也被孤立了。

重新保存修改後的文件。

測試完成後,支持任意字符輸入了。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。