首页
社区
课程
招聘
[求助]如果判断一个程序里的int 3是由编译器产生,还是编程者故意写入?
发表于: 2008-6-29 00:41 6922

[求助]如果判断一个程序里的int 3是由编译器产生,还是编程者故意写入?

2008-6-29 00:41
6922
在研究一个外国程序,程序用了一种没见到过的壳,壳别的地方都没加密,就是在很多地方放了INT 3在里面,只要运行到INT 3,程序就会自动解码。我如何才能判断程序里的INT 3是由编译器产生的,还是编程的人写入的呢?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
2
紧跟着壳的步伐咧。
2008-6-29 00:43
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
不懂楼上说的是什么意思呀?
2008-6-30 02:23
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2楼是要你单步跟踪..紧跟这壳走....嘿嘿
2008-7-2 15:46
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
5
编译器产生的int3指令,主要是用来调试,当程序跑飞了时,可以被调试器接管,所以int3指令常常是很多个指令在一起,填充在函数体之间的空隙,或者像VC那样,调试版的程序,编译器用0xCC来初始化局部变量,这样如果发生栈溢出,程序跑到数据区执行就可能被调试器发现。

而程序员有意地插入int3,最可能的情况是使用SEH来反调试,那么从正向角度考虑,它应该被一个try块所包围,从逆向的角度考虑,int3 指令是混在正常的指令流之中,而不是一种填充的形式,并且它上方不太远的地方一定会有一个安装SEH的地方,这个很容易识别,只要看到fs:[0],基本上就是了。

个人观点,如有错误请指正。
2008-7-2 16:13
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
没有,这个程序INT 3附近是没有FS:[0]这些的,INT 3的异常捕捉是由另外一个子进程来完成的
2008-7-2 23:07
0
雪    币: 282
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
默认是故意写入的
[QUOTE=脱壳请教;475156]没有,这个程序INT 3附近是没有FS:[0]这些的,INT 3的异常捕捉是由另外一个子进程来完成的[/QUOTE]
2008-7-3 10:57
0
雪    币: 224
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
编译器产生的int3指令,主要是用来调试,当程序跑飞了时,可以被调试器接管,所以int3指令常常是很多个指令在一起,填充在函数体之间的空隙
===============================
我认为这个说法有问题,调试的时候编译产生的INT 3指令是动态的替换对应断点的指令,并不是函数体之间的空隙,而变量周围的0xCC 才是填充,程序经过断点处被(有两次机会)被调试器挂住。
在壳里面放INT 3弄不好会被调试器挂住(如果装了调试器的话),其实这种方法并不好。

不知道你将所有的INT 3全部用PE工具改成空指令,它会不能正常解码吗?
2008-7-3 15:11
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
9
最近流行int3,看出来了
2008-7-3 15:15
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
10
C3  CC CC CC CC CC
C2 XX CC CC CC CC CC
2008-7-3 19:36
0
雪    币: 615
活跃值: (1202)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
判断是否被SoftICE跟踪?
2008-7-3 19:47
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
没错,这是大部分,但是还有一部分不是这样的
2008-7-4 01:45
0
游客
登录 | 注册 方可回帖
返回
//