-
-
[原创]去除WinRAR 5.01(32位) NAG窗口
-
发表于:
2019-1-23 14:18
4109
-
[原创]去除WinRAR 5.01(32位) NAG窗口
前阵子重装系统,顺手下了一个免费的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栈帧,
附带一句,由于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窗口不再出现,连同广告窗口也没了,完美搞定~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)