首页
社区
课程
招聘
[求助]如何给没有源码的程序进行SEH
2016-5-12 16:56 4303

[求助]如何给没有源码的程序进行SEH

2016-5-12 16:56
4303
今日碰到一个程序,由于读取内存跳段,而这一内存片段不存在的时候,会造成无法访问,造成异常而退出。
本人试着用汇编在相应的空白位置写了异常处理程序,想让出现异常的时候跳到安全的位置,可是没有成功。
由于没有源码,所以大家不要告诉我用什么try。
我写的代码大概情况如下:

push ebp
push @exsos
push dword fs:[0]
mov dword fs:[0],esp
mov dword ds:[0],1
nop       ;在该位置下断点

-------省内部分代码-------

@exsos:
    inc eax         ;在该位置下断点
    dec eax
    mov eax,1
    retn

当程序运行到mov dword ds:[0],1出现异常。
我在inc eax下短点,是想让程序运行到这里进行其他处理,可是异常后继续运行,就直接退出,上面设置的断点都没有断下来,怎么才能让程序运行到@exsos这里呢?

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

收藏
点赞0
打赏
分享
最新回复 (7)
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
myqqi 1 2016-5-12 17:29
2
0
感觉是你的esp位置不对
雪    币: 1787
活跃值: (340)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yezhulove 2016-5-13 09:18
3
0
注入一个DLL,HOOK 这个函数。try catch call org.
雪    币: 259
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
kelieke 2016-5-14 01:56
4
0
感谢你的回复, 这方法我考虑过, 感觉不应该这样将问题复杂化, 后来决定放弃这种hook和主楼我的SEH方式, 改用另外的汇编方法解决了这个跳段的问题.

我还是发上出问题的代码位置供大家研究吧:

        MOV DWORD PTR SS:[EBP+17C],0
        CMP BYTE PTR DS:[ESI],0
        JNZ @L008
        LEA EBX,DWORD PTR DS:[EBX]                        ; 此行汇编没用处
@L004:
        ADD DWORD PTR SS:[EBP+17C],1
        ADD ESI,1
        CMP BYTE PTR DS:[ESI],0                                ; 这里是造成内存跳段错误的位置
        JE @L004
@L008:
         PUSH 0

由上面可以看出, 当循环递增读取[ESI]时, 会可能造成跳段, 跳到没有分配的段后就会报错.
雪    币: 259
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
kelieke 2016-5-14 01:59
5
0
虽然解决了问题, 但是没有用到SEH, 希望能和大家一起研究用汇编SEH方式解决无源码的程序进行SEH, 这方面资料真少.
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kman 2016-5-14 09:58
6
0
注册个向量化异常处理比啥不强 瞧你折腾的
雪    币: 248
活跃值: (3779)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
luskyc 2016-5-15 21:16
7
0
传送门:
http://bbs.pediy.com/showthread.php?p=1429428#post1429428
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
myqqi 1 2016-5-18 11:53
8
0
今天在看《软件调试》的时候貌似看见一点什么,建议你去看一下这本书的第24章,每个SEHHandle会注册写入到TEB的TIB有个ExceptionList字段,你需要把这个字段设置成@exsos试试看
游客
登录 | 注册 方可回帖
返回