首页
社区
课程
招聘
[己解决]为何OD无法调试程序???急啊
发表于: 2007-5-3 22:29 12087

[己解决]为何OD无法调试程序???急啊

2007-5-3 22:29
12087
前两天机子出了问题,重装XP系统后,发现原来运行正常的OD竟然不能调试程序了!!!
    OD加载目标程序,按下F9后运行,OD提示:访问违规,正在写入到[37236024] - 使用Shift+F7/F8/F9来忽略程序异常。目标程序是我自编的VC程序,单独运行正常,没有加壳,也没有反调试功能,而且OD不管调试哪一个程序,均出现上述同样的信息。
    有哪位高手知道解决方法,请告知,不甚感激!小弟先谢过了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 50161
活跃值: (20615)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
OD设置选项里,忽略所有的异常
2007-5-3 22:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
多谢看雪老大指点,忽略所有的异常后,OD就可以让程序跑起来了,再进一步调查,发现只要选中调试选项/异常里面的[非法访问内存]就可以了。
   但我不明白的是:我自编的程序很简单,不会存在[非法内存访问]的问题,在OD里面为什么会出现这个问题?
   我开始还以为是OD汉化版的的Bug,就到OD网站下载了一个英文版的,运行同样会现现[非法内存访问]的问题。
   恳求进一步指点:[非法内存访问]的问题是如何产生的,如何从根本上解决这个问题?
2007-5-3 23:06
0
雪    币: 50161
活跃值: (20615)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
这个你跟一下,分析OD异常后前后的语句,再对应你的源码找原因。
2007-5-4 09:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
按照老大指点,我用MASM32写了一个最简单的测试程序:
.386
.model  flat, stdcall  
option  casemap :none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib

.code
start:
        invoke        MessageBox,NULL,NULL,NULL,MB_OK
        invoke        ExitProcess,0
end start
这个程序就只是弹出一个消息框,按理说,应该不会产生“非法内存访”的问题了吧,结果依然如此,OD反汇编如下:
00401000 >/$  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
00401002  |.  6A 00         PUSH 0                                   ; |Title = NULL
00401004  |.  6A 00         PUSH 0                                   ; |Text = NULL
00401006  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
00401008  |.  E8 0D000000   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
0040100D  |.  6A 00         PUSH 0                                   ; /ExitCode = 0
0040100F  \.  E8 00000000   CALL <JMP.&kernel32.ExitProcess>         ; \ExitProcess
00401014   .- FF25 00204000 JMP DWORD PTR DS:[<&kernel32.ExitProcess>;  kernel32.ExitProcess
0040101A   $- FF25 08204000 JMP DWORD PTR DS:[<&user32.MessageBoxA>] ;  user32.MessageBoxA

用OD跟进去,发现是在调用User32.MessageBox时出现了问题,进一步跟进去,发现是在ntdll模块中进行如下调用出现问题:
77F635C2    E8 05000000     CALL ntdll.77F635CC
进一步跟踪,OD异常时,程序此时代码如下:
10002010    55              PUSH EBP
10002011    8BEC            MOV EBP,ESP
10002013    6A FF           PUSH -1
10002015    68 80A10010     PUSH 1000A180
1000201A    68 283C0010     PUSH 10003C28
1000201F    64:A1 00000000  MOV EAX,DWORD PTR FS:[0]
10002025    50              PUSH EAX
10002026    64:8925 0000000>MOV DWORD PTR FS:[0],ESP
1000202D    83EC 5C         SUB ESP,5C
10002030    53              PUSH EBX
10002031    56              PUSH ESI
10002032    57              PUSH EDI
10002033    8965 E8         MOV DWORD PTR SS:[EBP-18],ESP
10002036    C745 E4 0100000>MOV DWORD PTR SS:[EBP-1C],1
1000203D    9B              WAIT
1000203E    C745 FC 0000000>MOV DWORD PTR SS:[EBP-4],0
10002045    C745 CC 0000000>MOV DWORD PTR SS:[EBP-34],0
1000204C    C745 D0 00408F4>MOV DWORD PTR SS:[EBP-30],408F4000
10002053    C745 C4 0000008>MOV DWORD PTR SS:[EBP-3C],80000000
1000205A    C745 C8 123B2C4>MOV DWORD PTR SS:[EBP-38],412C3B12
10002061    C745 DC 0200000>MOV DWORD PTR SS:[EBP-24],2
10002068    B8 24602337     MOV EAX,37236024               ;注意EAX值
1000206D    8945 D4         MOV DWORD PTR SS:[EBP-2C],EAX
10002070    8945 D8         MOV DWORD PTR SS:[EBP-28],EAX
10002073    C700 08000000   MOV DWORD PTR DS:[EAX],8       ;此处产生非法内存访问
10002079    9B              WAIT
1000207A    EB 09           JMP SHORT 10002085
1000207C    B8 01000000     MOV EAX,1
10002081    C3              RETN

也就是在往37236024这个地址上写数据时,出现了非法内存访问,这段代码看不明白,而且更不明白的是,OD窗口标题栏上显示这段代码位于主线程上,但也没显示出模块名称!

这段代码地址和主线程的代码地址相隔很远,怎么还是处于主线程上呢?

请高手解惑!!!
2007-5-4 12:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
难道只有我才碰到这个问题吗???
2007-5-5 14:50
0
雪    币: 50161
活跃值: (20615)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
7
可能你系统有问题,例如被注了某些线程之类的
你确定一下10002073 这段地址是什么进程,可以在OD里Alt+M查看模块。
也可以用IceSword查看一下这个程序的模块进程。
2007-5-5 14:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
还是老大历害!!!问题终于解决了,并且还帮我杀了一个病毒,多谢!!!

确如老大所述,我机子只要运行exe文件,就会被注入一个hookdll.dll,而10002073这个地址正是处于hookdll.dll这个模块中,一怒之下,先将这个文件更名,再运行程序,全部OK。

用IceSword查看,发现隐藏了一个rising.exe进程。上网一搜,竟然是刚出世的一个病毒,还没有专杀工具。经过一番艰难手工拼杀,终于将这个病毒干掉了。

再次感谢老大!!!
2007-5-5 16:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我调式也是这样。。。 查了一下 有个hookdll.exe 的进程
2007-10-7 16:04
0
游客
登录 | 注册 方可回帖
返回
//