首页
社区
课程
招聘
[求助]怎么判断一段二进制数据里是否包含x86机器码?
2012-8-17 19:18 6056

[求助]怎么判断一段二进制数据里是否包含x86机器码?

2012-8-17 19:18
6056
我发现在OD里输入1234567890ABCDEF也能反汇编出东西来,甚至可以执行

01012496      123456        adc dh,byte ptr ds:[esi+edx*2]
01012499    ^ 78 90         js Xcalc.0101242B
0101249B      AB            stos dword ptr es:[edi]
0101249C      CD EF         int 0xEF
0101249E      FE            ???                                      ;  未知命令
0101249F      DCBA 09876543 fdivr qword ptr ds:[edx+0x43658709]
010124A5      2190 90909090 and dword ptr ds:[eax+0x90909090],edx

那怎么判断一段二进制是x86机器码呢?或者说一段二进制里包含x86机器码,怎么找到x86机器码的起始位置呢?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 30
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chopsticks 2012-8-17 19:51
2
0
原则上对于一段指定的二进制数据是无法判断是否是可执行的机器码。
如你所述,对于123。。等这样数据,机器都会尝试着逐条解析为指令进行执行。。无非就是能不能解析出来,或者说解析出来后的指令是否有效的问题,但无法区分一般数据和机器码。
雪    币: 27
活跃值: (84)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
tihty 2 2012-8-18 00:13
3
0
如果能区分数据和代码,还会有那么多漏洞吗
雪    币: 52
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
hsluoyz 2012-8-18 01:52
4
0
额,最近在写论文,想从学术角度区分出代码来,比如检测网络数据包中的恶意代码?
正因为冯诺依曼当初没有区分数据和代码,所以我的研究才有意义呀。
能找着个差不多的算法就行,准确率90%就ok了,做学术没有100%的事情,吼吼~
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
foxabu 13 2012-8-18 02:37
5
0
machine learning?
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
whtyy 1 2012-8-19 16:28
6
0
A)提取feature
1、反汇编二进制数据为指令序列
2、提取频度信息。 add指令的比例,mov的比例,间接寻址的比例、寄存器使用频度等等维度的信息。
3、将 2种得到的feature,归一化到0.0~1.0区间,得到一个vector

B)采集模板样本集合
1、从现实世界中(各种可执行文件)使用A方法提取样本,得到样本集合R.
2、如果R是简单集合(比如都是从PE入口点提取指令),则可以计算出R的中心点(或者有几个中心点,即编译器特征)。如果R有明显的多个聚簇,则使用自动聚合方法寻找中心点。
3、2中得到的中心点集合,暂称为X,即为模板样本集合

C)判定
对待判断的二进制数据Y,提取feature,得到vector  a,计算 a 与 X 中每个点的距离(d1,d2,d3,d4,...dn),如果d1~dn中存在小阀值的数,则认为Y是指令。具体匹配精度,由阀值据诶的那个
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
whtyy 1 2012-8-19 16:29
7
0
具体处理方法有很多,思路想通,其上仅为距离。实际应用有各种实际问题要处理,但写paper应该够了
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
whtyy 1 2012-8-19 16:57
8
0
再说一种更简单直接的处理思路,我没试过,不过应该只对稍微大点的数据块有用

A、对二进制数据提取feature
反汇编二进制数据,提取每种机器码的前缀的出现频度,得到vector a。
需要对指令翻译有些认识,不需要处理所有可能的机器码的前缀,大部分即可。对于X86指令:单字节指令/单字节扩展指令的第一个字节,双字节指令/双字节扩展指令的前两个字节,三字节指令的前3个字节。

判定方法:
对待判定的数据,按照A方法提取得到vector a,把a当成数据,计算信息熵值。对于指令数据(有意义序列)熵值应该偏低,对于非指令数据,熵值应该偏高。

这种方法,对于那些XOR之类的单表替换加密,是直接无视的。
雪    币: 80
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
零度x 2012-8-19 17:44
9
0
能找着个差不多的算法你的研究就有意义了吗?
雪    币: 79
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
wParma 1 2012-8-20 10:11
10
0
@whtyy   涛哥爱玩高科技
游客
登录 | 注册 方可回帖
返回