能力值:
( LV9,RANK:680 )
|
-
-
2 楼
这是为了躲避FindWindow吧
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
那怎么取消这个功能了?如果能取消就完美了!
|
能力值:
(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掉就行了(注意堆栈平衡)。
|
能力值:
( LV3,RANK:20 )
|
-
-
5 楼
大哥,你真是厉害啊~ 你有联系方式吗?我想我自己调试不过来!我不是一个爱问问题的人,希望和你交个朋友,好吗?对了,我自己修改了一下,也能显示标题,是寻找字符串:VirtualProtect,将他替换成0000字符串,然后找到Thunkrav和Thunk偏移地址,全部替换成00就可以了,但是出现这样的问题,就是提示“插件扩展器模块中出现错误”和“挂钩注入器模块中出现错误”。你能给我看看怎么修复吗?我的方法可能比较恐怖,我是乱修改的!比较笨!
|
能力值:
(RANK:260 )
|
-
-
6 楼
用OD调试另一个OD进程,查看OD的主窗口句柄,假设是xxxxxxxx,然后下条件断点
bp SetWindowTextA [esp+4]==xxxxxxxx
用被调试的OD随便加载一个程序,只要让插件工作,调试的OD就会断在SetWindowTextA处,然后返回就到我给出的代码了。
|
能力值:
( 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掉,然后复制选定内容保存,不会影响堆栈平衡吧?
|
能力值:
(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掉就是指把代码改掉让它不执行原来的操作而已。
如果还不明白,自己找资料从最基础的知识学起。
|
能力值:
( LV3,RANK:20 )
|
-
-
9 楼
改代码主要要注意堆栈平衡。你NOP了一个CALL,就要平衡堆栈。
谢谢斑主。
|
能力值:
( LV3,RANK:20 )
|
-
-
10 楼
因为那个CALL你前面push了两个参数,所以要保持堆栈平衡的话,就要pop两个。如果进了那个CALL,后面返回时就应该是ret 8,保持堆栈平衡。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
alt+f9返回
|
能力值:
( 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掉啊?
|
能力值:
(RANK:260 )
|
-
-
13 楼
如果要nop掉的是一个call指令,如何保持堆栈平衡呢?
只要按ENTER进入被call的函数,看一下函数的返回指令,如果是retn,就直接用Nop替换;如果是retn XXX,就把call替换成为add esp, XXX
就这样。具体请查阅指令手册关于retn指令的说明。
|
能力值:
( LV3,RANK:20 )
|
-
-
14 楼
书呆彭,万岁~!
我一起床就看见了你的回复,万分感谢~!
|
能力值:
( LV4,RANK:50 )
|
-
-
15 楼
楼主这款OD 用时间长会不会花屏?
|
能力值:
( LV3,RANK:20 )
|
-
-
16 楼
学习了,那个NOP的使用方法。TKS!
|
|
|