某解压缩软件去广告

一、软件概况

    该软件打开之后会弹出广告页面,破解目的是去除该广告页面。

某解压缩软件去广告_第1张图片

    用Exeinfo初步判定,无壳,C++,64位:

某解压缩软件去广告_第2张图片

二、去广告过程

    利用X64Dbg分析。执行完毕后分析窗口句柄:

某解压缩软件去广告_第3张图片

    可以观察到类名为RarReminder的窗口,且其父窗口为0,初步猜测为广告窗口。

某解压缩软件去广告_第4张图片

    可以搜索到两组RARReminder字符串,在该两处地方设置断点,重新调试。调试结果分别如下:

某解压缩软件去广告_第5张图片

某解压缩软件去广告_第6张图片

    可以看到第一个断点是RegisterClassW,窗口注册函数,第二个断点是CreateWindowExW,窗口显示函数。经过逐步调试,可以确定该窗口即为广告窗口。将上述CreateWindowExW更改为nop,保存执行即可去除广告。

某解压缩软件去广告_第7张图片

    去除广告后的程序虽然没有了广告弹窗,但会出现提示注册窗口:

某解压缩软件去广告_第8张图片

    运行修改后程序,再次分析窗口句柄:

某解压缩软件去广告_第9张图片

    可以看到窗口类名为#32770,标题为请购买许可的窗口,其父句柄为Desktop。基本可以确定该窗口为注册窗口。搜索字符串#32770并跟踪至汇编窗口:

某解压缩软件去广告_第10张图片

    无明显函数调用,对ShowWindow与RegisterClass函数设置断点无果。考虑到该窗口为子窗口,且为模态对话框。在引用中搜索DialogBox:

某解压缩软件去广告_第11张图片

    其中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函数设置断点,即可找到注册窗口的模态对话框调用函数:

某解压缩软件去广告_第12张图片

    将调用函数用nop填充即可去除注册弹窗:

某解压缩软件去广告_第13张图片

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

某解压缩软件去广告_第14张图片

你可能感兴趣的:(日常灌水)