天天看點

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

一、軟體概況

    該軟體打開之後會彈出廣告頁面,破解目的是去除該廣告頁面。

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

    用Exeinfo初步判定,無殼,C++,64位:

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

二、去廣告過程

    利用X64Dbg分析。執行完畢後分析視窗句柄:

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

    可以觀察到類名為RarReminder的視窗,且其父視窗為0,初步猜測為廣告視窗。

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

    可以搜尋到兩組RARReminder字元串,在該兩處地方設定斷點,重新調試。調試結果分别如下:

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用
某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

    可以看到第一個斷點是RegisterClassW,視窗注冊函數,第二個斷點是CreateWindowExW,視窗顯示函數。經過逐漸調試,可以确定該視窗即為廣告視窗。将上述CreateWindowExW更改為nop,儲存執行即可去除廣告。

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

    去除廣告後的程式雖然沒有了廣告彈窗,但會出現提示注冊視窗:

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

    運作修改後程式,再次分析視窗句柄:

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

    可以看到視窗類名為#32770,标題為請購買許可的視窗,其父句柄為Desktop。基本可以确定該視窗為注冊視窗。搜尋字元串#32770并跟蹤至彙編視窗:

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

    無明顯函數調用,對ShowWindow與RegisterClass函數設定斷點無果。考慮到該視窗為子視窗,且為模态對話框。在引用中搜尋DialogBox:

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

    其中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函數設定斷點,即可找到注冊視窗的模态對話框調用函數:

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

    将調用函數用nop填充即可去除注冊彈窗:

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

三、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。

某解壓縮軟體去廣告一、軟體概況三、64位程式中的函數調用

繼續閱讀