如何去除迅雷v5.1.6.198中的广告(写给菜鸟)
作 者: blackeyes
调试环境: Win2000,
调试工具: Ollydbg1.10, SpyXX.exe, ExeScope
假 设: 不知道以前版本的解决方法
1. 让 '迅雷' 在 OD 中跑起来
打开OllyDbg, 载入
"C:\Program Files\Thunder Network\Thunder\Thunder.exe"
F9, 一会儿后, OllyDbg 说 程序退出了, 但 '迅雷' 却已经运行了, 已不在 OllyDbg的控制之下. 有点意思!
再用 OD attach, 却发现运行的是
"C:\Program Files\Thunder Network\Thunder\Program\Thunder5.exe"
刚开始没注意, 瞎折腾了好久(还是不够细心). 它还挺狡猾的.
关掉Thunder5.exe, 打开OllyDbg, 载入 Thunder5.exe, F9 运行, 一会儿后也退出. 不好玩了, 得想点办法!
用OllyDbg 载入 Thunder.exe, 先按Alt+E 到 Executable Modules 窗口,
再按 Ctrl+N, 到 Name in Thunder 窗口, 找可疑的API, 一下就盯上了 shell32.ShellExecuteA, 先试一下,
bp ShellExecuteA, 再F9, 果然断下, 右下 stack 窗口 如下:
0012FF18 000100C8 |hWnd = 000100C8 (class='#32769')
0012FF1C 00465020 |Operation = "open"
0012FF20 00D88468 |FileName = "C:\Program Files\Thunder Network\Thunder\Program\Thunder5.exe"
0012FF24 00D88400 |Parameters = " /172.30.72.81xxxyyyzzz7F5"
0012FF28 00464FF0 |DefDir = ""
0012FF2C 00000005 \IsShown = 5
好了, 这个 OllyDbg 不再动了, 让它一直停在这, 再重开一个新的OllyDbg 来调试 Thunder5.exe
以下所有的调试都是用这个新开的OllyDbg 来调试 Thunder5.exe, 不再重新说明了.
OllyDbg, 载入 Thunder5.exe, 点菜单 Debug->Arguments
设置为 /172.30.72.81xxxyyyzzz7F5, 这是我机器上的, 是变的, 实际以上面跟出来的为准了.
F9运行, 出现'迅雷' 的窗口, 再在 OD 中 按暂停, 运行, 都没什么问题, Thunder5.exe 完全在 OD 的控制之下, OK
2. 找广告窗口的参数的来源
用VC的 SpyXX.exe 可看到广告窗口的高度是0x3F, 下面就用OD调试这个3F是哪来的.
Ctrl+F2 重来, bp CreateWindowExA 下断, F9 几十次, 每次断下来的时候观察右下的 stack 窗口, 直到如下:
0012FBD4 00407CE0 /CALL to CreateWindowExA from Thunder5.00407CDB
0012FBD8 00010000 |ExtStyle = WS_EX_CONTROLPARENT
0012FBDC 0012FCE4 |Class = "TGradualPanel"
0012FBE0 00000000 |WindowName = NULL
0012FBE4 46000000 |Style = WS_CHILD|WS_CLIPSIBLINGS|WS_CLIPCHILDREN
0012FBE8 00000000 |X = 0
0012FBEC 00000000 |Y = 0
0012FBF0 00000374 |Width = 374 (884.)
0012FBF4 0000003F |Height = 3F (63.) ; 这就是我们要追的参数
0012FBF8 002003B0 |hParent = 002003B0 ('迅雷5',class='TfrmMain')
0012FBFC 00000000 |hMenu = NULL
0012FC00 00400000 |hInst = 00400000
0012FC04 00000000 \lParam = NULL
到调用的地方去看, 还是从堆栈中来的:
00407C9C 55 PUSH EBP ; 在这儿应该是[ESP+14]==3F
00407C9D 8BEC MOV EBP,ESP
00407C9F 51 PUSH ECX
00407CA0 53 PUSH EBX
00407CA1 56 PUSH ESI
00407CA2 57 PUSH EDI
00407CA3 894D FC MOV DWORD PTR SS:[EBP-4],ECX
00407CA6 8BFA MOV EDI,EDX
00407CA8 8BF0 MOV ESI,EAX
00407CAA E8 11B3FFFF CALL Thunder5.00402FC0
00407CAF 8BD8 MOV EBX,EAX
00407CB1 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00407CB4 50 PUSH EAX
00407CB5 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
00407CB8 50 PUSH EAX
00407CB9 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
00407CBC 50 PUSH EAX
00407CBD 8B45 14 MOV EAX,DWORD PTR SS:[EBP+14]
00407CC0 50 PUSH EAX
00407CC1 8B45 18 MOV EAX,DWORD PTR SS:[EBP+18] ; 这就是 Height 参数
00407CC4 50 PUSH EAX ; 入栈
00407CC5 8B45 1C MOV EAX,DWORD PTR SS:[EBP+1C]
00407CC8 50 PUSH EAX
00407CC9 8B45 20 MOV EAX,DWORD PTR SS:[EBP+20]
00407CCC 50 PUSH EAX
00407CCD 8B45 24 MOV EAX,DWORD PTR SS:[EBP+24]
00407CD0 50 PUSH EAX
00407CD1 8B45 28 MOV EAX,DWORD PTR SS:[EBP+28]
00407CD4 50 PUSH EAX
00407CD5 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00407CD8 50 PUSH EAX
00407CD9 57 PUSH EDI
00407CDA 56 PUSH ESI
00407CDB E8 B4FFFFFF CALL <JMP.&user32.CreateWindowExA>
00407CE0 8BF0 MOV ESI,EAX
00407CE2 8BC3 MOV EAX,EBX
00407CE4 E8 C7B2FFFF CALL Thunder5.00402FB0
00407CE9 8BC6 MOV EAX,ESI
00407CEB 5F POP EDI
00407CEC 5E POP ESI
00407CED 5B POP EBX
00407CEE 59 POP ECX
00407CEF 5D POP EBP
00407CF0 C2 2400 RETN 24
在00407C9C停下的时候, 堆栈:
0012FC1C 0047D1CD RETURN to Thunder5.0047D1CD from Thunder5.00407C9C
0012FC20 00000000
0012FC24 00400000 ASCII "MZP"
0012FC28 00000000
0012FC2C 000E03D8
0012FC30 0000003F ; 注意
0012FC34 00000374
0012FC38 00000000
0012FC3C 00000000
0012FC40 46000000
再看前面的调用的地方, 还是从堆栈中来的:
0047D198 53 PUSH EBX ; 在这儿应该是[EDX+1C]==3F
0047D199 56 PUSH ESI
0047D19A 8BDA MOV EBX,EDX
0047D19C 8BF0 MOV ESI,EAX
0047D19E 8B43 04 MOV EAX,DWORD PTR DS:[EBX+4]
0047D1A1 50 PUSH EAX
0047D1A2 8B43 0C MOV EAX,DWORD PTR DS:[EBX+C]
0047D1A5 50 PUSH EAX
0047D1A6 8B43 10 MOV EAX,DWORD PTR DS:[EBX+10]
0047D1A9 50 PUSH EAX
0047D1AA 8B43 14 MOV EAX,DWORD PTR DS:[EBX+14]
0047D1AD 50 PUSH EAX
0047D1AE 8B43 18 MOV EAX,DWORD PTR DS:[EBX+18]
0047D1B1 50 PUSH EAX
0047D1B2 8B43 1C MOV EAX,DWORD PTR DS:[EBX+1C] ; Height 参数
0047D1B5 50 PUSH EAX ; 入栈
0047D1B6 6A 00 PUSH 0
0047D1B8 8B43 34 MOV EAX,DWORD PTR DS:[EBX+34]
0047D1BB 50 PUSH EAX
0047D1BC 8B43 20 MOV EAX,DWORD PTR DS:[EBX+20]
0047D1BF 50 PUSH EAX
0047D1C0 8B0B MOV ECX,DWORD PTR DS:[EBX]
0047D1C2 8D53 4C LEA EDX,DWORD PTR DS:[EBX+4C]
0047D1C5 8B43 08 MOV EAX,DWORD PTR DS:[EBX+8]
0047D1C8 E8 CFAAF8FF CALL Thunder5.00407C9C
0047D1CD 8986 80010000 MOV DWORD PTR DS:[ESI+180],EAX
0047D1D3 5E POP ESI
0047D1D4 5B POP EBX
0047D1D5 C3 RETN
Ctrl+F2 重来, 对 0047D198 用 Shift+F4 下条件断点 [EDX+1C]==3F
寄存器:
EAX 0170EC00 ***** 记住它, 下面重来有用
ECX 004AC960 Thunder5.004AC960
EDX 0012FC98 ***** EDX+1C = 0012FCB0 (还在堆栈中)
EBX 0170EC00
堆栈:
0012FC4C 0047D0EF RETURN to Thunder5.0047D0EF
...
0012FCA4 00000000
0012FCA8 00000000
0012FCAC 00000374
0012FCB0 0000003F *****
0012FCB4 001103C0
看前面的调用的地方, 在0047D0E9, 我们要知道是哪儿让 [0012FCB0]=0000003F,
0047D0E9所在的函数开始点是0047CFC8,
Ctrl+F2 重来, F2 对0047CFC8 下断, 前边好多次都不是我们要的, 直到 EAX=0170EC00
小技巧: 在这儿断下后F8跟到0047D198, EAX一样
0047CFC8 /$ 55 PUSH EBP ; EAX=0170EC00
0047CFC9 |. 8BEC MOV EBP,ESP
0047CFCB |. 81C4 40FFFFFF ADD ESP,-0C0
0047CFD1 |. 53 PUSH EBX
0047CFD2 |. 56 PUSH ESI
0047CFD3 |. 33D2 XOR EDX,EDX
0047CFD5 |. 8995 40FFFFFF MOV DWORD PTR SS:[EBP-C0],EDX
0047CFDB |. 8BF0 MOV ESI,EAX ; ***
0047CFDD |. 33C0 XOR EAX,EAX
0047CFDF |. 55 PUSH EBP
0047CFE0 |. 68 89D14700 PUSH Thunder5.0047D189
0047CFE5 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
0047CFE8 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
0047CFEB |. 8D95 74FFFFFF LEA EDX,DWORD PTR SS:[EBP-8C]
0047CFF1 |. 8BC6 MOV EAX,ESI
0047CFF3 |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
0047CFF5 |. FF91 98000000 CALL DWORD PTR DS:[ECX+98] ; 这里让 [0012FCB0]=0000003F
...
0047D0DF |. 8D95 74FFFFFF LEA EDX,DWORD PTR SS:[EBP-8C]
0047D0E5 |. 8BC6 MOV EAX,ESI ; **
0047D0E7 |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
0047D0E9 |. FF91 9C000000 CALL DWORD PTR DS:[ECX+9C] ; **call 0047D198**
0047D0EF |. 83BE 80010000>CMP DWORD PTR DS:[ESI+180],0
Ctrl+F2 重来, 到 0047CFC8 后, 当然要EAX=0170EC00 , 对0012FCB0 下硬件写入断点, F9, 几次后找到下面
0047CF25 |. 8B46 44 MOV EAX,DWORD PTR DS:[ESI+44]
0047CF28 |. 8943 10 MOV DWORD PTR DS:[EBX+10],EAX
0047CF2B |. 8B46 48 MOV EAX,DWORD PTR DS:[ESI+48]
0047CF2E |. 8943 14 MOV DWORD PTR DS:[EBX+14],EAX
0047CF31 |. 8B46 4C MOV EAX,DWORD PTR DS:[ESI+4C] ; ESI=170EC00
0047CF34 |. 8943 18 MOV DWORD PTR DS:[EBX+18],EAX ; EAX=3F, 这儿写入
0047CF37 |. 8B7E 30 MOV EDI,DWORD PTR DS:[ESI+30]
数据窗: [0170EC4C] == 0000003F
0170EC00 60 C9 4A 00 00 40 6F 01 00 00 00 00 00 00 00 00 `.J..@o.........
0170EC10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0170EC20 00 00 00 00 01 00 00 00 FA 91 41 00 0A 92 41 00 ..........A...A.
0170EC30 00 40 6F 01 00 00 00 00 24 DA 47 00 00 EC 70 01 .@o.....$.G...p.
0170EC40 00 00 00 00 00 00 00 00 74 03 00 00 3F 00 00 00 ........t...?...
0170EC50 EB 08 00 00 00 00 00 01 01 01 00 01 00 00 00 00 ................
在这儿对0170EC4C 下硬件写入断点, Ctrl+F2 重来, 找到下面
0047FA69 8943 48 MOV DWORD PTR DS:[EBX+48],EAX
0047FA6C 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; 从这儿来 (又是从堆栈中来!)
0047FA6F 8943 4C MOV DWORD PTR DS:[EBX+4C],EAX ; 到这儿去
0047FA72 8BC3 MOV EAX,EBX
看调用
00478F50 53 PUSH EBX
00478F51 56 PUSH ESI
00478F52 8BF0 MOV ESI,EAX
00478F54 8B46 48 MOV EAX,DWORD PTR DS:[ESI+48]
00478F57 50 PUSH EAX
00478F58 52 PUSH EDX ; 入栈
00478F59 8B4E 44 MOV ECX,DWORD PTR DS:[ESI+44]
00478F5C 8BC6 MOV EAX,ESI
00478F5E 8B56 40 MOV EDX,DWORD PTR DS:[ESI+40]
00478F61 8B18 MOV EBX,DWORD PTR DS:[EAX]
00478F63 FF93 84000000 CALL DWORD PTR DS:[EBX+84] ; 调用
00478F69 808E 98000000 0>OR BYTE PTR DS:[ESI+98],8
00478F70 5E POP ESI
00478F71 5B POP EBX
00478F72 C3 RETN
再看调用
00552A0B 8B08 MOV ECX,DWORD PTR DS:[EAX]
00552A0D FF51 68 CALL DWORD PTR DS:[ECX+68]
00552A10 B2 01 MOV DL,1
00552A12 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00552A15 8B80 BC040000 MOV EAX,DWORD PTR DS:[EAX+4BC]
00552A1B E8 6462F2FF CALL Thunder5.00478C84
00552A20 BA 3F000000 MOV EDX,3F ; 在这儿, 抓到你了!
00552A25 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00552A28 8B80 BC040000 MOV EAX,DWORD PTR DS:[EAX+4BC]
00552A2E E8 1D65F2FF CALL Thunder5.00478F50 ; CALL 00478F50
将00552A20的 MOV EDX,3F 改成 MOV EDX, 0 再运行, OK.
怎么跟警察破案似的, 根据一点线索往前推呀推, 直到揪出主犯.
3. 其它FORM中的广告, 用 EXESCOPE 就可简单搞定, 略去
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!