WinRAR去广告

下载最新版本WinRAR,结果一打开就有广告,说好的体验30天呢。可能是之前装过的WinRAR还残留有注册表信息吧,广告如下:

WinRAR去广告_第1张图片

打开x32dbg,附加到WinRAR进程,在DestoryWindow这个API下断点,在调试器的命令行输入bp DestoryWindow即可,点击广告窗口的关闭按钮,在API中断下,栈回溯返回地址就能找到广告窗口的消息处理过程。在IDA中打开,找到对应广告窗口的消息处理函数,交叉引用回溯,可以看到窗口类的注册

WinRAR去广告_第2张图片

可以看到这个窗口类名为RarReminder,Reminder是提示,提醒之类的意思,太真实了。

继续看AdWndProc,可以发现一个诡异的URL

WinRAR去广告_第3张图片

ad开头肯定就是广告的链接了,而紧接着的0xF4E9F0函数就是广告的显示函数了。IDA反编译如下

HWND __thiscall sub_4BE9F0(LPVOID lpParam, int a2, HWND hWnd, int a4, int a5, char a6)
{
  LPVOID v6; // ebx
  HWND v7; // eax
  int v8; // edi
  int v9; // esi
  HINSTANCE v10; // ST28_4
  HWND v11; // eax
  HWND result; // eax
  bool v13; // zf
  WCHAR *v14; // esi
  struct tagRECT Rect; // [esp+Ch] [ebp-14h]

  v6 = lpParam;
  *((_DWORD *)lpParam + 2) = hWnd;
  *((_BYTE *)lpParam + 38) = a6;
  ShowWindow(hWnd, 0);
  sub_4BE560(a2);
  *((_DWORD *)v6 + 7) = a4;
  *((_DWORD *)v6 + 8) = a5;
  GetWindowRect(hWnd, &Rect);
  v7 = GetParent(hWnd);
  MapWindowPoints(0, v7, (LPPOINT)&Rect, 2u);
  if ( *((_DWORD *)v6 + 1) )
    DestroyWindow(*((HWND *)v6 + 1));
  v8 = Rect.left;
  v9 = Rect.right - Rect.left;
  v10 = *(HINSTANCE *)v6;
  v11 = GetParent(hWnd);
  result = CreateWindowExW(
             0,
             L"RarHtmlClassName",
             0,
             0x40000000u,
             v8,
             Rect.top,
             v9,
             Rect.bottom - Rect.top,
             v11,
             0,
             v10,
             v6);
  v13 = *((_DWORD *)v6 + 4) == 0;
  *((_DWORD *)v6 + 1) = result;
  if ( v13 )
  {
    if ( hWnd )
    {
      if ( !*((_DWORD *)v6 + 8) )
      {
        result = (HWND)*((_DWORD *)v6 + 7);
        if ( result )
        {
          result = (HWND)sub_4BE690(*((PCNZWCH *)v6 + 7));
          v14 = (WCHAR *)result;
          if ( result )
          {
            ShowWindow(hWnd, 5);
            SetWindowTextW(hWnd, v14);
            result = (HWND)j___free_base(v14);
          }
        }
      }
    }
  }
  else if ( result )
  {
    ShowWindow(result, 5);
    result = (HWND)UpdateWindow(*((HWND *)v6 + 1));
  }
  return result;
}

若直接将这个函数在开头就ret掉,那么广告的内容就没了,效果如下

WinRAR去广告_第4张图片

说明这个窗口本质上是个子窗口,不过我们可以通过修改这个函数内容来使广告内容变为我们想要的东西,这里懒得改了。

要去除广告窗口,就要将这个父窗口也去掉,这其实很容易,我们可以在消息处理的开头就修改控制流,直接跳转到调用DestoryWindow的地址即可去除广告。

WinRAR去广告_第5张图片

WinRAR去广告_第6张图片

patch后就算是去除广告了。

你可能感兴趣的:(逆向工程)