首页
社区
课程
招聘
[求助]AdvancedOlly.dll问题求助?
发表于: 2009-1-15 16:36 14649

[求助]AdvancedOlly.dll问题求助?

2009-1-15 16:36
14649

我使用的是AdvancedOlly.dll 1.26 bata12汉化版,但是自从1.26版本以后,加载这个强大的插件,就会自动隐藏OD的标题,“[CPU XXX XXX XXX]”前面显示的内容就只有“---”了,大家有懂插件制作的吗?请问这个问题怎么解决!希望高人指点下,万分感谢。
    AdvancedOlly.dll1.26之前的版本并不会修改标题!下面附带两款插件。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 590
活跃值: (177)
能力值: ( LV9,RANK:680 )
在线值:
发帖
回帖
粉丝
2
这是为了躲避FindWindow吧
2009-1-15 19:23
0
雪    币: 193
活跃值: (857)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
那怎么取消这个功能了?如果能取消就完美了!
2009-1-15 20:00
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
取消这干嘛,又没什么用

简单看了一下,我的Advanced.dll加载基址是0x10000000,去掉窗口标题的代码在这个位置:

10001978    68 B6A20010     PUSH    advanced.1000A2B6                ; 空字符串
1000197D    FF75 08         PUSH    DWORD PTR SS:[EBP+8]             ; 主窗口的句柄
10001980    E8 73720000     CALL    <JMP.&user32.SetWindowTextA>     ; 就是这里将标题去掉了



如果不想去掉,把它NOP掉就行了(注意堆栈平衡)。
2009-1-15 21:03
0
雪    币: 193
活跃值: (857)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
大哥,你真是厉害啊~ 你有联系方式吗?我想我自己调试不过来!我不是一个爱问问题的人,希望和你交个朋友,好吗?对了,我自己修改了一下,也能显示标题,是寻找字符串:VirtualProtect,将他替换成0000字符串,然后找到Thunkrav和Thunk偏移地址,全部替换成00就可以了,但是出现这样的问题,就是提示“插件扩展器模块中出现错误”和“挂钩注入器模块中出现错误”。你能给我看看怎么修复吗?我的方法可能比较恐怖,我是乱修改的!比较笨!
上传的附件:
2009-1-15 22:36
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
6
用OD调试另一个OD进程,查看OD的主窗口句柄,假设是xxxxxxxx,然后下条件断点

bp SetWindowTextA [esp+4]==xxxxxxxx

用被调试的OD随便加载一个程序,只要让插件工作,调试的OD就会断在SetWindowTextA处,然后返回就到我给出的代码了。
2009-1-16 00:18
0
雪    币: 193
活跃值: (857)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=书呆彭;565890]用OD调试另一个OD进程,查看OD的主窗口句柄,假设是xxxxxxxx,然后下条件断点

bp SetWindowTextA [esp+4]==xxxxxxxx

用被调试的OD随便加载一个程序,只要让插件工作,调试的OD就会断在SetWindowTextA处,然后返回就到我给出的代码了。[/QUOTE]

书呆彭大哥,你再看看,我按照你的方法并不能正常运行,我的方法是:

我先用Window Spy获取要修改的OD主窗口句柄,Spy++也行。步骤是运行被调试的OD,Plugin下面只放置AdvancedOlly.dll插件,让OD只能加载AdvancedOlly.dll插件。

用Window Spy获取句柄(不知道为什么,每次关闭OD后抓取句柄都不一样):


然后关闭OD,用调试用的OD1加载这个OD,界面如下,基址是:00400000;


接着下条件断点bp SetWindowTextA [esp+4]==007D0238,回车下断点;


之后按F9运行,但是调试工具OD并没运行到断点位置,而直接开启了被调试的OD。


然后用被调试的OD随便加载一个程序,让AdvancedOlly.dll插件工作,调试的OD也没一丁点反应,不会断在SetWindowTextA位置,而是停留在加载被调试OD的初始位置;

我不知道自己哪里错了,你能给我分析下吗?另外,还有几处操作不是很明白,要麻烦你一下。

“用被调试的OD随便加载一个程序,只要让插件工作,调试的OD就会断在SetWindowTextA处,然后返回就到我给出的代码了”这个“返回”是按F8一直运行到RETN吗?

“注意堆栈平衡”直接NOP掉,然后复制选定内容保存,不会影响堆栈平衡吧?
上传的附件:
2009-1-16 14:46
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
8
窗口句柄每次创建时都不一样,你用spy++查看到的是句柄根本就不是被调试的OD的窗口句柄。

我再给你详细说一遍,最后一遍,剩下就全看你自己了。

启动调试器,我们用OD1来称呼它,用它加载另一个OD,我们用OD2来称呼它。

现在,OD1是作为OD2的调试器的。在OD1中按F9让OD2运行

在OD1里按 菜单栏的 查看->窗口,然后 右键->刷新,看到OD2的目前所有的窗口,此时标题还没隐藏,所以能看到“OllyICE - CPU”的标题,记下这一行的第一列中的句柄值,如下例中是0015073a

Windows
句柄           标题                              父窗口     WinProc    ID         风格       扩展风格   线程       ClsProc    类
000D0714                                         Desktop               000003E8   44A09141   00000080   主          7D966093   ComboLBox
000F070E                                         Topmost                          84000000   00000080   主          04617574   TPUtilWindow
0015073A       OllyICE - [CPU]                   Topmost               034A0711   17CF0000   00000110   主          004323D4   pediy06
K001006F0                                        0015073A                         52000001              主          7D981C2F   MDIClient
IE000D0712     CPU                               001006F0              00000BB8   57C70000   00000140   主          0041D1DC   ICPU
INK000B070A                                      000D0712                         50200000              主          00426230   ICPUSTACK
INK000E071C                                      000D0712                         50200000              主          0041E604   ICPUASM
INK001006EE                                      000D0712                         50200000              主          00425E40   ICPUDUMP
INK00130746                                      000D0712                         50000000              主          00427A04   ICPUINFO
INE001906D2                                      000D0712                         50000000              主          0042A878   ICPUREG
K0015070C                                        0015073A                         50000080              主          7D960F28   Button
K0016072C                                        0015073A                         84800003   00000088   主          FFFF06F3   tooltips_class32
K00230700      快捷命令                              0015073A                         50000000              主          045D2E34   OT_PLUGIN_0002
IK001406CA                                       00230700              000003EA   50001000   00020000   主          7D96A455   Static
IK001806D8                                       00230700              000003E9   50010E42              主          7D963749   ComboBox
IIE000C06CE                                      001806D8              000003E9   50000380              主          7D9637BF   Edit
IE001D06E2     命令 :                              00230700              000003EB   5000000B              主          7D96A455   Static
E005806F4      Default IME                       0015073A                         8C000000              主          7D9A0638   IME
NE001906FE     M                                 005806F4                         8C000000              主          FFFF079B   MSCTFIME UI
00160748       Select Conditional Branch Types   Topmost                          06C00000   00000188   主          04651DF8   TDLLForm2
001806D0                                         Topmost                          84000000   00000080   主          04617574   TPUtilWindow


然后在OD1中下断点: bp SetWindowTextA [esp+4]==0x15073a

现在切换到OD2,随便加载一个程序,使Advanced插件开始工作,则会触发断点,OD1激活,看到堆栈中:

0013D3F4   10001985  /CALL 到 SetWindowTextA 来自 advanced.10001980
0013D3F8   0015073A  |hWnd = 0015073A (' - [CPU]',class='pediy06')
0013D3FC   1000A2B6  \Text = ""


来到10001980这个返回地址并往上翻一下就看到了:

10001970    3B05 53C00010   CMP     EAX, DWORD PTR DS:[1000C053]
10001976    75 0F           JNZ     SHORT advanced.10001987
10001978    68 B6A20010     PUSH    advanced.1000A2B6
1000197D    FF75 08         PUSH    DWORD PTR SS:[EBP+8]
10001980    E8 73720000     CALL    <JMP.&user32.SetWindowTextA>
10001985    EB 0B           JMP     SHORT advanced.10001992
10001987    FF75 0C         PUSH    DWORD PTR SS:[EBP+C]
1000198A    FF75 08         PUSH    DWORD PTR SS:[EBP+8]
1000198D    E8 66720000     CALL    <JMP.&user32.SetWindowTextA>


如果不想让它改变窗口标题(我还是不理解为什么不想改标题,这有什么影响吗?),那就把10001980片的call改成add esp,8就行了。

我上面所说的NOP掉(注意堆栈平衡),并不是必须用NOP指令填充,所谓NOP掉就是指把代码改掉让它不执行原来的操作而已。

如果还不明白,自己找资料从最基础的知识学起。
2009-1-16 18:59
0
雪    币: 193
活跃值: (857)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
改代码主要要注意堆栈平衡。你NOP了一个CALL,就要平衡堆栈。
谢谢斑主。
2009-1-17 18:36
0
雪    币: 193
活跃值: (857)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
因为那个CALL你前面push了两个参数,所以要保持堆栈平衡的话,就要pop两个。如果进了那个CALL,后面返回时就应该是ret 8,保持堆栈平衡。
2009-1-17 18:38
0
雪    币: 7187
活跃值: (3702)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
alt+f9返回
2009-1-17 19:51
0
雪    币: 193
活跃值: (857)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
我最近真是郁闷,前段时间两问题都解决了,今天再次测试,失败了~!我的地址和你的不一样!
004779B1  |.  A3 705A4D00   mov dword ptr ds:[4D5A70],eax
004779B6  |.  8B95 20E4FFFF mov edx,[local.1784]
004779BC  |.  8915 745A4D00 mov dword ptr ds:[4D5A74],edx
004779C2  |.  8B4D F0       mov ecx,[local.4]
004779C5  |.  51            push ecx
004779C6  |.  8D86 A5030000 lea eax,dword ptr ds:[esi+3A5]
004779CC  |.  50            push eax
004779CD  |.  8D96 8E090000 lea edx,dword ptr ds:[esi+98E]
004779D3  |.  52            push edx
004779D4  |.  8D8D E0FEFFFF lea ecx,[local.72]
004779DA  |.  51            push ecx
004779DB  |.  E8 4CF20200   call OD加强版.004A6C2C
004779E0  |.  83C4 10       add esp,10
004779E3  |.  8D85 E0FEFFFF lea eax,[local.72]
004779E9  |.  50            push eax                                 ; /Text
004779EA  |.  8B15 7C3B4D00 mov edx,dword ptr ds:[4D3B7C]            ; |
004779F0  |.  52            push edx                                 ; |hWnd => 019F02D4 ('终结Θ者 - [PYG]',class='1212121')
004779F1      E8 C87B0300   call <jmp.&USER32.SetWindowTextA>
004779F6  |.  C705 88574D00>mov dword ptr ds:[4D5788],1
00477A00  |.  33C9          xor ecx,ecx

是不是直接NOP掉啊?
2009-1-22 19:58
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
13
如果要nop掉的是一个call指令,如何保持堆栈平衡呢?

只要按ENTER进入被call的函数,看一下函数的返回指令,如果是retn,就直接用Nop替换;如果是retn XXX,就把call替换成为add esp, XXX

就这样。具体请查阅指令手册关于retn指令的说明。
2009-1-22 22:47
0
雪    币: 193
活跃值: (857)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
书呆彭,万岁~!
我一起床就看见了你的回复,万分感谢~!
2009-1-23 09:02
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
楼主这款OD 用时间长会不会花屏?
2010-11-9 07:44
0
雪    币: 421
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
学习了,那个NOP的使用方法。TKS!
2010-11-9 18:50
0
游客
登录 | 注册 方可回帖
返回
//