首页
社区
课程
招聘
[原创]去除WinRAR 5.01(32位) NAG窗口
发表于: 2019-1-23 14:18 4109

[原创]去除WinRAR 5.01(32位) NAG窗口

2019-1-23 14:18
4109
    前阵子重装系统,顺手下了一个免费的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期)

收藏
免费 2
支持
分享
最新回复 (3)
雪    币: 26185
活跃值: (63317)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
2
感谢分享!
2019-1-23 15:27
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
2019-1-23 15:44
0
雪    币: 7121
活跃值: (125793)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了
感谢楼主分享
2019-5-31 06:57
0
游客
登录 | 注册 方可回帖
返回
//