Pediy“瑞星”实现快速禁用
每次禁用都要输入验证码,不甚其烦。有没有快速禁用的方法呢?琢磨了一天,终于实现。
方便起见,我还是用softice。在虚拟机中装上瑞星,Ctrl+D进入softice,bpx LoadBitmapA下断后Ctrl+D返回桌面,右键右下脚瑞星托盘图标,选“禁用所有监控”,即被断下。再按F12,返回上一层函数,此时softice显示进入RsTray的地址空间。当前地址为001B:00ef4874,看看在哪个模块里,用mod命令见下图,
原来在rav文件夹下的dll文件中。显然这个就是我们的key dll了。 再次进入softice,先bd 0即禁用0号断点,,而后下断bpx SetFocus 并按下Ctrl+D被立即断下。
PUSH ECX ; /Arg10
MOV ECX,DWORD PTR SS:[ESP+24]
SUB EDX,ECX
PUSH EDX ; |Arg9
MOV EDX,DWORD PTR DS:[ESI+18C]
PUSH EDX ; |Arg8
MOV EDX,DWORD PTR DS:[ESI+188]
PUSH EDX ; |Arg7
MOV EDX,DWORD PTR DS:[ESI+184]
PUSH EDX ; |Arg6
MOV EDX,DWORD PTR DS:[ESI+180]
PUSH EDX ; |Arg5
MOV EDX,DWORD PTR DS:[10015CB0]
PUSH EDX ; |Arg4 => 00000000
MOV EDX,DWORD PTR DS:[EDI]
PUSH EDX ; |Arg3
PUSH EAX ; |Arg2
PUSH ECX ; |Arg1
LEA ECX,DWORD PTR DS:[ESI+1EC]
CALL 00ef6170 //关键call跟进
MOV EAX,DWORD PTR DS:[EDI]
PUSH 477 ; /ControlID = 477 (1143.)
PUSH EAX ; |hWnd //确认验证码的对话框窗口句柄
CALL DWORD PTR DS:[<&USER32.GetDlgItem>] ; \GetDlgItem //显示4位验证码的小图片窗口
MOV ESI,EAX
JE SHORT 00ef49CE
PUSH 0
PUSH 4
PUSH 0C5
PUSH ESI
CALL EBX
PUSH -1
PUSH 0
PUSH 0B1
PUSH ESI
CALL EBX
PUSH 0
PUSH 0
PUSH 0B7
PUSH ESI
CALL EBX
PUSH ESI ; /hWnd
CALL DWORD PTR DS:[<&USER32.SetFocus>] ; \SetFocus //断在这里
输入bd 1,暂时去除SetFocus断点的影响,Ctrl+D返回桌面,此时已经弹出了确认验证码的对话框,当前闪烁的输入焦点当然就是SetFocus的功劳了。显然已经生成了验证码,那么我们就要退回去看,不远处在001B:00ef498a处有个CALL 00ef6170 且push了很多参数,那就F8单步跟进瞧瞧。进入后单步几下来到如下图所示高亮的call处,
再跟进来到下面:
PUSH ESI
MOV ESI,ECX
MOV EAX,DWORD PTR DS:[ESI]
PUSH EAX ; /hWnd
CALL DWORD PTR DS:[<&USER32.IsWindow>] ; \IsWindow
TEST EAX,EAX
NZ SHORT 00ef6152
POP ESI
RETN
MOV ECX,ESI
CALL 00ef6080 //生成验证码的重要call继续跟进来到下面
MOV ECX,ESI
CALL 00ef5CB0
MOV EAX,1
POP ESI
RETN
00ef6080:
…………
XOR EBX,EBX
LEA EDI,DWORD PTR DS:[ESI+1C]
TEST BL,1
MOV ECX,ESI
JE SHORT 00ef60A4
CALL 00ef5DB0 // 算法call1
JMP SHORT 00ef60A9
CALL 00ef5E00 //算法call2
MOV ECX,ESI
MOV BYTE PTR DS:[ESI+EBX+8],AL //保存本次循环生成的一位验证码
…………………….
INC EBX
ADD EDI,4
CMP EBX,4 // 循环生成四位验证码
JL SHORT 00ef6096
算法call1
00ef5DB0 /$ 51 PUSH ECX
00ef5DB1 |. 56 PUSH ESI
00ef5DB2 |> E8 613D0000 /CALL 00ef9B18
00ef5DB7 |. 894424 04 |MOV DWORD PTR SS:[ESP+4],EAX
00ef5DBB |. 33F6 |XOR ESI,ESI
00ef5DBD |. 8D49 00 |LEA ECX,DWORD PTR DS:[ECX]
00ef5DC0 |> 8A4434 04 |/MOV AL,BYTE PTR SS:[ESP+ESI+4]
00ef5DC4 |. 3C 41 ||CMP AL,41
00ef5DC6 |. 7C 04 ||JL SHORT 00ef5DCC
00ef5DC8 |. 3C 5A ||CMP AL,5A
00ef5DCA |. 7E 08 ||JLE SHORT 00ef5DD4
00ef5DCC |> 3C 61 ||CMP AL,61
00ef5DCE |. 7C 19 ||JL SHORT 00ef5DE9
00ef5DD0 |. 3C 7A ||CMP AL,7A
00ef5DD2 |. 7F 15 ||JG SHORT 00ef5DE9
00ef5DD4 |> 0FBEC0 ||MOVSX EAX,AL
00ef5DD7 |. 50 ||PUSH EAX
00ef5DD8 |. 68 34170110 ||PUSH 10011734 ; ASCII "SOIlo"
00ef5DDD |. E8 DE340000 ||CALL 00ef92C0
00ef5DE2 |. 83C4 08 ||ADD ESP,8
00ef5DE5 |. 85C0 ||TEST EAX,EAX
00ef5DE7 |. 74 08 ||JE SHORT 00ef5DF1
00ef5DE9 |> 46 ||INC ESI
00ef5DEA |. 83FE 04 ||CMP ESI,4
00ef5DED |.^ 72 D1 |\JB SHORT 00ef5DC0
00ef5DEF |.^ EB C1 \JMP SHORT 00ef5DB2
00ef5DF1 |> 8A4434 04 MOV AL,BYTE PTR SS:[ESP+ESI+4]
00ef5DF5 |. 5E POP ESI
00ef5DF6 |. 59 POP ECX
00ef5DF7 \. C3 RETN
/算法call2
00ef5E00 /$ 51 PUSH ECX
00ef5E01 |. 56 PUSH ESI
00ef5E02 |> E8 113D0000 /CALL 00ef9B18
00ef5E07 |. 894424 04 |MOV DWORD PTR SS:[ESP+4],EAX
00ef5E0B |. 33F6 |XOR ESI,ESI
00ef5E0D |. 8D49 00 |LEA ECX,DWORD PTR DS:[ECX]
00ef5E10 |> 8A4434 04 |/MOV AL,BYTE PTR SS:[ESP+ESI+4]
00ef5E14 |. 3C 30 ||CMP AL,30
00ef5E16 |. 7C 19 ||JL SHORT 00ef5E31
00ef5E18 |. 3C 39 ||CMP AL,39
00ef5E1A |. 7F 15 ||JG SHORT 00ef5E31
00ef5E1C |. 0FBEC0 ||MOVSX EAX,AL
00ef5E1F |. 50 ||PUSH EAX
00ef5E20 |. 68 3C170110 ||PUSH 1001173C ; ASCII "015"
00ef5E25 |. E8 96340000 ||CALL 00ef92C0
00ef5E2A |. 83C4 08 ||ADD ESP,8
00ef5E2D |. 85C0 ||TEST EAX,EAX
00ef5E2F |. 74 08 ||JE SHORT 00ef5E39
00ef5E31 |> 46 ||INC ESI
00ef5E32 |. 83FE 04 ||CMP ESI,4
00ef5E35 |.^ 72 D9 |\JB SHORT 00ef5E10
00ef5E37 |.^ EB C9 \JMP SHORT 00ef5E02
00ef5E39 |> 8A4434 04 MOV AL,BYTE PTR SS:[ESP+ESI+4]
00ef5E3D |. 5E POP ESI
00ef5E3E |. 59 POP ECX
00ef5E3F \. C3 RETN
有兴趣的可以看看这些算法,不是很难。我的目的是要尽快找到爆破点,时间宝贵啊。注意到刚才有一句:MOV BYTE PTR DS:[ESI+EBX+8],AL //保存本次循环生成的一位验证码
那我就在验证码的保存地址上下内存读取断点,输入命令:Bpm 1b:f2401c r
Ctrl+d返回到桌面后随即被断下,这次读取是绘制验证码,继续Ctrl+d这次返回到桌面,随便输入4位验证码,确定后立即被断下,接着单步几下就到爆破点了。如下图
输入a 1b:00ef582a 回车后再输入xor eax,eax 回车即完成修改。爆破后直接跳到以下代码处。
00ef59B3 MOV EAX,DWORD PTR DS:[ESI+164]
00ef59B9 PUSH 1 ; /Result = 1
00ef59BB PUSH EAX ; |hWnd
00ef59BC MOV DWORD PTR DS:[ESI+22C],1 //这里置位禁用标志
00ef59C6 CALL DWORD PTR DS:[<&USER32.EndDialog>] ; \EndDialog
现在bd * ,然后Ctrl+d返回到桌面,试了一下不再需要输入验证码了,再执行几个驱动工具,瑞星也不报毒了,达到快速禁用的目的。接下来就是收尾工作,用od载入rspalvd.dll,修改后保存,再拷回原来的瑞星目录。这里有个小技巧,你可以把瑞星的几个监控进程结束掉,并以最快的速度覆盖原文件,这里可以打个时间差,否则你是改不了的。最后呼吁,请支持国产软件!
Happy birthday天易!
By 天易love 2010-1-23
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课