说明下我用的是52的OD,其它版本的可能不一样。
大家使用OD调试的时候,OD的主窗口会出现被调试程序的 文件名.exe
如下图:
Anti.exe就会出现在OD的主窗口中。有的程序就会枚举所有窗口,检测标题是不是含有
程序文件名.exe字串,比如我上传这个附件。
StrongOD 好像没有这个功能。
那么现在我们就开始自己修改吧!
1:把OD加到OD中。(直接复制一个OD扔进去就行了)。
2:F9 让他运行起来。效果如下:
以下:调试OD的OD 称为OD1, 被调试的OD称为OD2
3:就把一个不会让OD挂悼的程序拖到OD2中,
OD1中 bp SetWindowTextA下这个断点。
在OD2中点<< 重新运行
(SetWindowText 这个是设置窗口文本的。OD2的标题就会改变。)
那么OD1断下后堆栈如下:
具体分析过会在进行先整体看下。 按 又OD1 F9运行如下
现在分析一下:
TEXT 里的内容和我们OD2的标题内容是一样的。说明我们找对地址了。
调用SetWindowTextA的是StrongOD插件里的一个函数。
现在我们在OD2里,注意是OD2里,点那个<<标致,就是重新运行。
这次我们要回溯到调用的地方。断下后如下:
Ctrl+f9 3下就回到了程序领空 向上拉一点就看到了:如图
好 在call SetWindowTextA这句上下断点 下断点。
继续F9 重复上面的动作 把其它调用SetWindowTextA的地方找出来, 找到三个: 全设断
找到3call SetWindowTextA个。
全部设断 取消bp SetWindowText 断点
(经测试 475bc7这个不要改,改了以后按<< 或ctrl+f2 被调试程序就会结束) 只改2个。
思路:
让主窗口不显示内容的话那么只要把
BOOL SetWindowText(
HWND hWnd, // handle to window or control
LPCTSTR lpString // title or text
);
参数 lpString变成空就行了。
我们在OD1里写个子程序, 就是一个函数。 然后修改上面的
3个的call SetWindowTextA这句, 让它调用我们的函数,在我们函数里面把
参数lpString就是标题的内容变为空, 然后和OD原来一样调用StrongOD里的函数。
最后retn返回就可以了。
现在自己找个空白处写函数:如下
0x4af810:
push ebp
mov ebp,esp
push eax
mov eax,dword ptr ss:[ebp+0xC]
mov byte ptr ds:[eax],0x0
pop eax
push dword ptr ss:[ebp+0xC]
push dword ptr ss:[ebp+0x8]
call 004AF5BE
mov esp,ebp
pop ebp
retn 0x8
简要说明下:
0x4af810: // 我是用的NonaWrite写的哈 手动写就不要这句了
push ebp
mov ebp,esp
// 这就是把lpString变为空
push eax
mov eax,dword ptr ss:[ebp+0xC]
mov byte ptr ds:[eax],0x0
pop eax
// 下面三句就是模仿的原来Call SetWindowTextA的调用
push dword ptr ss:[ebp+0xC]
push dword ptr ss:[ebp+0x8]
call 004AF5BE
mov esp,ebp
pop ebp
// 这句很重要,要使堆栈平衡, 为什么是0x8因为你原来的call
// push 了2个参数嘛
retn 0x8
因为我们设了断的嘛,所以按alt+b 打开断点
把2个call 都改成call 4af810 (4af810 你自己函数的地址)
然后 右键->复制可执行文件->所有修改->全部复制->保存文件……
如果出现下面的这个:
可以在调试OD2之前改一下OD2的rawsize.
那么可能是因为rawsize太小了 用PE Explorer改大一下就行. 或者换个位置。。
视图->区段头->区段编辑器
点左边那个锁
改 RAW数据大小 ae800 为000AFA00 文件另存为 xx 然后就调试这个改过的.
这个就可以写入代码了…….
最后如果对你有用的话,请回下帖!光是图片就搞得头都大了!
上效果图
HELLO 表示过了检测 oh 表示没过检测
- 标 题:自己修改OD 让主窗口不再出现xx.exe
- 作 者:酒色财气
- 时 间:2011-03-12 16:04:14
- 链 接:http://bbs.pediy.com/showthread.php?t=130721