能力值:
(RANK:350 )
|
-
-
2 楼
OD设置选项里,忽略所有的异常
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
多谢看雪老大指点,忽略所有的异常后,OD就可以让程序跑起来了,再进一步调查,发现只要选中调试选项/异常里面的[非法访问内存]就可以了。
但我不明白的是:我自编的程序很简单,不会存在[非法内存访问]的问题,在OD里面为什么会出现这个问题?
我开始还以为是OD汉化版的的Bug,就到OD网站下载了一个英文版的,运行同样会现现[非法内存访问]的问题。
恳求进一步指点:[非法内存访问]的问题是如何产生的,如何从根本上解决这个问题?
|
能力值:
(RANK:350 )
|
-
-
4 楼
这个你跟一下,分析OD异常后前后的语句,再对应你的源码找原因。
|
能力值:
( 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窗口标题栏上显示这段代码位于主线程上,但也没显示出模块名称!
这段代码地址和主线程的代码地址相隔很远,怎么还是处于主线程上呢?
请高手解惑!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
难道只有我才碰到这个问题吗???
|
能力值:
(RANK:350 )
|
-
-
7 楼
可能你系统有问题,例如被注了某些线程之类的
你确定一下10002073 这段地址是什么进程,可以在OD里Alt+M查看模块。
也可以用IceSword查看一下这个程序的模块进程。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
还是老大历害!!!问题终于解决了,并且还帮我杀了一个病毒,多谢!!!
确如老大所述,我机子只要运行exe文件,就会被注入一个hookdll.dll,而10002073这个地址正是处于hookdll.dll这个模块中,一怒之下,先将这个文件更名,再运行程序,全部OK。
用IceSword查看,发现隐藏了一个rising.exe进程。上网一搜,竟然是刚出世的一个病毒,还没有专杀工具。经过一番艰难手工拼杀,终于将这个病毒干掉了。
再次感谢老大!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我调式也是这样。。。 查了一下 有个hookdll.exe 的进程
|