绕过UPX查壳
一般市面上的查壳软件都是通过特征码进行识别的,虽然效率很高,但是 只要通过去除混淆特征码,那么就可以实现绕过查杀的目的。
特征码
就像PE文件都有MZ头一样,(MZ就算是PE文件的特征码)UPX也有自己的特征码
包括
- UPX节表名
通过学习PE文件结构我们可以知道,
节表名在PE加载在内存中没有什么作用(起作用的主要还是VirtualAddress)
所以我们修改这里的节表名 对PE文件的运行没有影响
但 对于 UPX -d 这个自己的UPX解壳程序来说 他是通过检查PE的节表名来判断该文件是否有UPX壳
所以这里修改一下 就能让UPX自己无法完成脱壳
但是Exeinfo_PE还是可以查出来是UPX壳 甚至还有版本信息
这就是关于下面的几个特征码了
- UPX头
这里是UPX头部,是通过Pack4()函数添加的,相关信息,各个字段所代表的属性 在上面已经列出
ExeinfoPE就是通过这读取到的UPX版本信息,记录的都是和UPX和文件的基本信息,包括文件大小,压缩等级...
替换这些信息也不会对PE文件的运行造成影响
但ExeinfoPE获取到的UPX版本信息就会有错误,比如将版本字段改为6666
但是仍然还有UPX壳的信息
来看下一个特征码
- psuhad … 机器码(60 BE …)
这里的特征码是pushad的特征码,用作upx的loader
exeinfoPE就是通过查特征码表查的
改了这里以后 exeinfoPE还有是有疑似UPX的提示
还有什么捏 不到了
点一下Scan/t 提示 “3个节的结构 似乎是UPX”(口翻一下)
这里试一下再添加一个节
添加一个空节
<1>判断节表区域是否有空闲区域添加一个节表.APEX
<2>在节表中新增一个成员
复制其中一个 比较省事 这里复制了upx1节
<3>修改PE头部中节的数量
标准PE头 3-》4
<4>修改SizeOfImage的大小
可选PE头 原有+内存偏移
<5>在原有的数据最后,新增一个节的数据(内存对齐的整数倍)
直接00
<6>修正新增节表的属性
//可以便增加边修改
需要修改的节表属性
VirtualAddress(在内存中的偏移) = 上一个节表的VirtualAddress+上一个节表的(Misc在内存中的大小(内存对齐整数倍))
PointerToRawData(在文件中的偏移)
可以看到显示了4个节,他就不知道是啥保护了,但是还有提示了有壳 试一下把入口改了
在新增节的位置添加跳转代码 并修改OEP–》0x2f000
虽然还有是提示有壳保护 但是 点击Scan/t他分析不出来是UPX了
后面还有能咋弄捏?不到了QAQ
这里由于妹有改什么特别的东西直接ESP定律就能手脱捏
手动加壳
再套一层 把upx的loader代码加密了 这应该就看不出了叭
还是新增一个节 用来保存解密upx的代码 同时修改OEP
这里和上面的一样
加密oep代码
010Editor进行异或0x10叭
在apex节添加解密代码
0042F000 | 60 | pushad |保存一下现场
0042F001 | 90 | nop |
0042F002 | BF B0D34200 | mov edi,hello3.42D3B0 | upx的解压缩
0042F007 | B9 90010000 | mov ecx,190 | 异或长度
0042F00C | 80340F 10 | xor byte ptr ds:[edi+ecx],10 | 解密
0042F010 | 83F9 00 | cmp ecx,0 |
0042F013 | 74 03 | je hello3.42F018 |
0042F015 | 49 | dec ecx | ecx--
0042F016 | EB F4 | jmp hello3.42F00C |
0042F018 | 61 | popad | 解压完成
0042F019 | E9 92E3FFFF | jmp hello3.42D3B0 | 跳回upx解压缩
程序能跑再exeinfoPE看一下 同样识别不出来UPX了
所以这也是一种绕过方法