一、軟體概況
該軟體打開之後會彈出廣告頁面,破解目的是去除該廣告頁面。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR1EMVR0TyMGVPpHOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1czM4EDO0IjM1EzNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
用Exeinfo初步判定,無殼,C++,64位:
二、去廣告過程
利用X64Dbg分析。執行完畢後分析視窗句柄:
可以觀察到類名為RarReminder的視窗,且其父視窗為0,初步猜測為廣告視窗。
可以搜尋到兩組RARReminder字元串,在該兩處地方設定斷點,重新調試。調試結果分别如下:
可以看到第一個斷點是RegisterClassW,視窗注冊函數,第二個斷點是CreateWindowExW,視窗顯示函數。經過逐漸調試,可以确定該視窗即為廣告視窗。将上述CreateWindowExW更改為nop,儲存執行即可去除廣告。
去除廣告後的程式雖然沒有了廣告彈窗,但會出現提示注冊視窗:
運作修改後程式,再次分析視窗句柄:
可以看到視窗類名為#32770,标題為請購買許可的視窗,其父句柄為Desktop。基本可以确定該視窗為注冊視窗。搜尋字元串#32770并跟蹤至彙編視窗:
無明顯函數調用,對ShowWindow與RegisterClass函數設定斷點無果。考慮到該視窗為子視窗,且為模态對話框。在引用中搜尋DialogBox:
其中DialogBoxIndirectParamW函數從記憶體中的對話框模闆建立模式對話框。在顯示對話框之前,該函數将應用程式定義的值作為WM_INITDIALOG消息的lParam參數傳遞給對話框過程。應用程式可以使用此值初始化對話框控件。
INT_PTR DialogBoxIndirectParamW(
HINSTANCE hInstance,// 建立對話框的子產品句柄
LPCDLGTEMPLATEW hDialogTemplate,// DialogBoxIndirectParam用于建立對話框的模闆
HWND hWndParent,// 擁有該對話框的視窗的句柄
DLGPROC lpDialogFunc,// 指向對話框過程的指針
LPARAM dwInitParam//要傳遞給WM_INITDIALOG消息的lParam參數中的對話框的值
);
如果函數成功,則傳回值是在調用EndDialog函數時指定的nResult參數,該函數用于終止對話框。如果函數因hWndParent參數無效而失敗,則傳回值為零。在這種情況下,該函數傳回零,以便與以前版本的Windows相容。如果函數因任何其他原因而失敗,則傳回值為-1。要擷取擴充錯誤資訊,請調用GetLastError。
DialogBoxParamW函數則是從對話框模闆資源建立模式對話框。在顯示對話框之前,該函數将應用程式定義的值作為WM_INITDIALOG消息的lParam參數傳遞給對話框過程。應用程式可以使用此值初始化對話框控件。
INT_PTR DialogBoxParamW(
HINSTANCE hInstance,// 包含對話框模闆的子產品句柄。如果此參數為NULL,則使用目前可執行檔案
LPCWSTR lpTemplateName,// 對話框模闆。
HWND hWndParent,// 擁有該對話框的視窗的句柄
DLGPROC lpDialogFunc,// 指向對話框過程的指針
LPARAM dwInitParam//要傳遞給WM_INITDIALOG消息的lParam參數中的對話框的值
);
如果函數成功,則傳回值是在用于終止對話框的EndDialog函數的調用中指定的nResult參數的值。如果函數因hWndParent參數無效而失敗,則傳回值為零。在這種情況下,該函數傳回零,以便與以前版本的Windows相容。如果函數因任何其他原因而失敗,則傳回值為-1。要擷取擴充錯誤資訊,請調用GetLastError。
對DialogBoxParamW和DialogBoxIndirectParamW函數設定斷點,即可找到注冊視窗的模态對話框調用函數:
将調用函數用nop填充即可去除注冊彈窗:
三、64位程式中的函數調用
X86應用程式的函數調用有stdcall等方式,但X64應用程式隻有1種寄存器快速調用約定。前四個參數使用寄存器傳遞,如果參數超過4個,多餘參數就放在棧裡,入棧順序為從右到左,由函數調用方平衡棧空間。前4個參數存放的寄存器是固定的,分别是第1個參數RCX、第2個參數RDX、第3個參數R8、第4個參數R9,其他參數從右至左依次入棧。任何大于8位元組或者不是1位元組、2位元組、4位元組、8位元組的參數必須由引用來傳遞(位址傳遞)。所有浮點參數的傳遞都是使用XMM寄存器中完成,具體為XMM0、XMM1、XMM3、XMM3。