去除WinRAR 5.01(32位) NAG窗口

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lixiangminghate/article/details/86604381

    前阵子重装系统,顺手下了一个免费的WinRAR(32位 版本号5.01)。用了没多久发现这货带NAG窗口,关闭NAG窗口后居然还跳出广告窗口,如下图,不胜其扰下决定去除NAG窗口。

    毕竟WinRAR是商业软件,鬼知道有没有反调试机制,先把它拖进WinDIE发现无壳,还是c++代码,可以动手(商业软件居然不加保护,你跟鬼收钱啊)!

    windbg(32位程序用windbg x86调试,如果用windbg x64进行调试,由于Wow64子系统的存在会影响分析过程)启动WinRAR(事后才发现用windbg调试虽然是无心之举,但给我省了很多事,后面会解释原因),等到WinRAR跳出NAG窗口时,break调试器,查看所有线程调用栈:

0:043> ~*kb

   0  Id: 1bfc.19f8 Suspend: 1 Teb: 00b14000 Unfrozen
 # ChildEBP RetAddr  Args to Child              
00 00cf7a60 74629004 00040cca 00000001 00000000 win32u!NtUserWaitMessage+0xc
01 00cf7aa0 74624b0a 00000000 00000001 ffffffff USER32!DialogBox2+0x103
02 00cf7ad0 74624a22 00080bf2 0148e4b0 00000000 USER32!InternalDialogBox+0xdf
03 00cf7ae8 7466b2e5 013e0000 01592404 00080bf2 USER32!DialogBoxIndirectParamAorW+0x32
*** ERROR: Module load completed but symbols could not be loaded for WinRAR.exe
04 00cf7b14 0144db3d 013e0000 014bc27c 00080bf2 USER32!DialogBoxParamW+0x55
WARNING: Stack unwind information not available. Following frames may be wrong.
05 00cf7b34 77a9de96 77b00000 b51aa700 00000002 WinRAR+0x6db3d
06 00cf7b38 77b00000 b51aa700 00000002 00000002 ntdll!_SEH_epilog4_GS+0xa
07 00cf7b6c 6f772e62 325f726d 6a706928 3e4c3a6e ntdll!RtlpHpStackTraceAllocAdd+0x225

线程19f8的#04栈帧打印了程序进入了USER32!DialogBoxParamW函数,看来是这个线程弹出的对话框!目光集中在这个线程,再看下#05栈帧,WinRAR+0x6db3d是WinRAR调用USER32!DialogBoxParamW的偏移。把WinRAR拖进IDA,定位到调用处的偏移:

    附带一句,由于ida给出的地址和windbg的实际运行的地址不同,所以在IDA中定位代码段类似做代码重定位,方法如下:

    1).windbg给出的偏移是从程序加载的基址开始计算,像WinRAR+0x6db3d这个返回地址,其距离加载基址0x6db3d字节;

    2).ida默认从.text节开始加载,对于未加壳的Win32程序,.text节所在地址减去0x1000得到程序加载的基址;

在View-"Open subviews"-Segments窗口中,IDA列出了各个节加载的地址(默认不显示PE头所在节),从中获得.text节的位置,如下图:

对于WinRAR,它在IDA中加载的地址是0x13E0000。

    3.从2中获得的基址,加上windbg给出的偏移,得到代码段在IDA中的地址:0x13E0000+0x6db3d=0x144DB3D。这正是我截图中的地址。

回到正题,这个代码片会弹出NAG窗口,而再往上的一个代码片,它的作用是直接退出函数:

.text:0144DAFC loc_144DAFC:                            ; CODE XREF: PopActiveDialog+29↑j
.text:0144DAFC                 mov     ecx, [esp+101Ch+var_4]
.text:0144DB03                 xor     ecx, esp
.text:0144DB05                 call    @__security_check_cookie@4 ; __security_check_cookie(x)
.text:0144DB0A                 add     esp, 101Ch
.text:0144DB10                 retn    8

而唯一调用这个代码片的代码居然是在整个函数的入口附近:

PopActiveDialog         PopActiveDialog proc near               ; CODE XREF: sub_144DB60+4F0↓p
PopActiveDialog                                                 ; sub_1491860+7B3↓p ...
PopActiveDialog
PopActiveDialog
PopActiveDialog                         mov     eax, 101Ch
PopActiveDialog+5                      call    __alloca_probe
PopActiveDialog+A                      mov     eax, ___security_cookie
PopActiveDialog+F                      xor     eax, esp
PopActiveDialog+11                     mov     [esp+101Ch+var_4], eax
PopActiveDialog+18                     cmp     byte_1541414, 0
PopActiveDialog+1F                     jz      short loc_144D76F
PopActiveDialog+21                     cmp     [esp+101Ch+arg_4], 0
PopActiveDialog+29                     jz      loc_144DAFC

如此可见,winrar判断自身是否被激活就在函数入口的两个jz指令上。根据我的调试,进入函数后byte_1541414的值等于1;程序不会跳转,会向下执行准备弹NAG窗口。所以要去除NAG窗口就很简单了,把第1个jz改成jnz即可!准备上ollydbg!

    然而上了ollydbg,才发现WinRAR针对ollydbg做了反调试:F9运行后,调试器会收到源源不断的异常事件,根本没法继续调试。

明明windbg运行的一马平川,为什么ollydbg就运行的这么艰难?我查了一下ollydbg和windbg异常处理的差异发现:

1.ollydbg默认在异常的first chance期间,将异常状态标记为Handled。由于异常状态标记为Handled,程序的异常处理部分被跳过,处理结果交给OS重新执行失败的指令;但是由于异常没有真正的解决,OS再一次将异常抛出给ollydbg处理,导致WinRAR反反复复的处理异常。

2.windbg默认在异常的first chance期间,将异常状态标记为UnHandled。由于异常状态标记为UnHandled,程序的异常处理代码开始工作,处理了异常并交给OS,所以能顺利的往下执行代码。

    知道了这个差异后,就好解决了,设置ollydbg调试选项,让调试器忽略这些异常(交给WinRAR去处理),设置后ollydbg就能运行到NAG窗口:

修改汇编指令后,NAG窗口不再出现,连同广告窗口也没了,完美搞定~

猜你喜欢

转载自blog.csdn.net/lixiangminghate/article/details/86604381