首页
社区
课程
招聘
[原创]如何去除迅雷v5.1.6.198中的广告(写给菜鸟)
发表于: 2006-4-28 12:13 6443

[原创]如何去除迅雷v5.1.6.198中的广告(写给菜鸟)

2006-4-28 12:13
6443
如何去除迅雷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期)!

收藏
免费
支持
分享
最新回复 (5)
雪    币: 108
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
用用dede 更快捷一些
2006-4-28 13:18
0
雪    币: 333
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wan
3
学习了如何操作
2006-4-28 15:18
0
雪    币: 296
活跃值: (265)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
那个热门推荐怎么去除?
2006-4-30 13:41
0
雪    币: 108
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最初由 Winter-Night 发布
那个热门推荐怎么去除?


搜索字串  p4pwidth
2006-4-30 14:53
0
雪    币: 296
活跃值: (265)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
6
搞定,代码如下,谢谢狼
0054246A      33C0          XOR EAX,EAX
0054246C      90            NOP
0054246D      90            NOP
0054246E      90            NOP
0054246F      90            NOP
00542470      90            NOP
00542471      90            NOP
00542472  |.  8945 E8       MOV DWORD PTR SS:[EBP-18],EAX
00542475  |.  8B45 E8       MOV EAX,DWORD PTR SS:[EBP-18]
00542478  |.  50            PUSH EAX
00542479  |.  B9 C0365400   MOV ECX,Thunder5.005436C0                ;  ASCII "P4PWidth"
0054247E  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]
00542481  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
00542484  |.  8B18          MOV EBX,DWORD PTR DS:[EAX]
00542486  |.  FF53 08       CALL DWORD PTR DS:[EBX+8]
00542489  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
0054248C  |.  90            NOP
0054248D  |.  90            NOP
0054248E  |.  90            NOP
0054248F  |.  90            NOP
00542490  |.  90            NOP
00542491  |.  90            NOP
2006-4-30 15:31
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册