-
-
[讨论]die0.64 查壳扫描算法的分析 (输入表判断,讨论)
-
发表于: 2018-5-30 21:13 4744
-
我编写一个查壳工具。
编写了类库,算法,查壳功能也都实现了。看看其它查壳工具都有什么不同
编写了类库,算法,查壳功能也都实现了。看看其它查壳工具都有什么不同
peid和die0.64提取的特征码完全不同,
把入口点全部nop掉(peid查不出来了),把区段名改为upx1(die1.0查不出来了),依然能识别为aspack2.12
就算把输入表的desc全部删除依然能识别出 aspack2.12,只有当把输入表的地址改为0时,才会识别不出来。
经过我的分析,
die0.64最终判断一个文件是否是aspack2.12加的壳,判断的特征码是 “FAC13FAC F5413F54H”
然后提取字符串ASCII “FAC”,转换成数字保存在寄存器edi中, 然后循环判断edi如果是数字 $FAC则标记为aspack
大家可以自己调试一下, 找出他是怎么识别外壳的
然后提取字符串ASCII “FAC”,转换成数字保存在寄存器edi中, 然后循环判断edi如果是数字 $FAC则标记为aspack
大家可以自己调试一下, 找出他是怎么识别外壳的
另外我分析的数据。
LoadLibrayEx, FindResourceA(RT_RCDATA, DVCLAL,PackageInfo) —— 会判断是否是delphi编译器
应该是搜索输入表,找getprocessaddress这些,kernel32。dll这些
die0.64和测试程序下载
https://pan.baidu.com/s/1T-0lTklwm5ImBfYgQdRC4A
---------------------------------------------------------------------------------------------
我分析的内容:
动态在内存中分配的,外壳结构体 =
还原成源代码为
type
TPESign = packed record
Len: Byte; // 1个字节长度
Name:string[35]; // 名字缓冲区 (十六进制$23)
IsMatched: Boolean; // 4个字节,是否识别为此外壳
end;
* 好吧,还原出这个结构,
最后下断改写 ismatched,写入为1(真)的代码,发现断下
004D740A |> \FF83 9C000000 inc dword ptr [ebx+0x9C] ; 核心改写函数
* 核心魔术跳
向上两三行找到关键比较部分,我惊奇的发现是这样的。
004D73FA |. 81FF AC0F0000 cmp edi, 0xFAC
我不知道为什么,为什么die0.64里有大量这种类型的代码,比较一个数字!
核心关键它是怎么判断和识别一个程序是否是aspack壳的外壳呢,是会判断 edi是否为 $FAC,如果是则设置此程序就是aspack!!!
* 外壳识别码($FAC)从何而来?
我给esi下段,查找改写的部分,
这是原始esi地址(pe识别的特征码所在的位置的原始内容)
还原成源代码为
type
TPESign = packed record
Len: Byte; // 1个字节长度
Name:string[35]; // 名字缓冲区 (十六进制$23)
IsMatched: Boolean; // 4个字节,是否识别为此外壳
end;
* 好吧,还原出这个结构,
最后下断改写 ismatched,写入为1(真)的代码,发现断下
004D740A |> \FF83 9C000000 inc dword ptr [ebx+0x9C] ; 核心改写函数
* 核心魔术跳
向上两三行找到关键比较部分,我惊奇的发现是这样的。
004D73FA |. 81FF AC0F0000 cmp edi, 0xFAC
我不知道为什么,为什么die0.64里有大量这种类型的代码,比较一个数字!
核心关键它是怎么判断和识别一个程序是否是aspack壳的外壳呢,是会判断 edi是否为 $FAC,如果是则设置此程序就是aspack!!!
* 外壳识别码($FAC)从何而来?
我给esi下段,查找改写的部分,
这是原始esi地址(pe识别的特征码所在的位置的原始内容)
核心查壳函数
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2018-5-31 00:01
被ladkjflk编辑
,原因:
赞赏
他的文章
看原图
赞赏
雪币:
留言: