|
本帖最后由 紫金御龙鳞 于 2019-3-16 20:43 编辑
萌新近期准备写壳,如果有朋友们对壳感兴趣或者有深入研究,请私信附联系方式联系我
目前在写代码膨胀部分,目前的设定框架是由3块组成:
一、代码块的拆分:
代码块拆分意义就是将一个代码块 根据 jcc null call 等指令拆分组成一个个区块
此后将代码区块按代码块拆分的1,2,3 这3块进行分别混淆,并拼接起来。
二、混淆地址管理器
在代码混淆过程中,你并不知道接下来的代码区块将会被膨胀到多大,所以必须要一个地址管理器来确定下一区块的大小。
首先要将地址分块,按照去除重定位(401000 处加载基址)的方式分配地址:
代码块1 : address 0x40B016
代码块2 : address xxx
代码块3:address xxx
使用地址管理器将代码块的地方分配并连接起来达到如下效果:由于不能上传动图我这里用图片地址
1.正常流程
https://qqadapt.qpic.cn/txdocpic/0/e05f837c44a0449dac5dd16357756a09/0
2.代码块块后流程
https://qqadapt.qpic.cn/txdocpic/0/afc02a9ce169079648763cbb2b1608ef/0
三、重定位数据的处理
有些mem操作数可能是全局变量,需要进行重定位的修复处理,这里我们就仿照vmp的重定位处理方式进行简单的重定位处理:
1.正常流程:
https://qqadapt.qpic.cn/txdocpic/0/66714e481e7f5bd10e7e632a00c042a4/0
xxx.gif (论坛不能上传gif 动图)
2.重定位流程处理:
https://qqadapt.qpic.cn/txdocpic/0/c4032b64c66c573e891995ce650eeeb1/0
框架说完了,那么接下来就要进入指令的处理,无论是模拟指令执行(vm)还是指令膨胀或者指令混淆,他们的本质都是对指令的等价替换。
例如对指令 push 0x123456 来处理:
这条指令是定长指令 push imm 主要是对0x123456 进行处理,那么我们可以首先拿到0x123456 这个立即数
对0x123456进行加法,异或 等操作
imm = ( 0x123456+0x111111 ) ^ 0x22222 = 0x216745
在混淆代码中表现出来:
push eax
mov eax,imm
xor eax,0x22222
sub eax,0x111111
push eax
mov eax,dword ptr[esp+0x4]
这样就完成了 对 push 0x123456 指令的混淆。
但如何处理指令是一个令人头疼的问题,比方说jz 这种指令 分为短跳和长跳
jz -> 74 跳转长度(1-bit)
jz -> 0F 84 跳转偏移(4-bit)
他可以向下跳转或者向上跳转,更不用说其他特殊指令 loop,jecxz,loopnz,loopz 等指令。
最后要说的是:作为一个萌新,有很多不懂的地方一些其他通用指令的模拟,和对壳的建议 希望可以找到几个朋友对我多多指点和交流
|
评分
-
参与人数 2 | HB +2 |
THX +1 |
收起
理由
|
消逝的过去
| + 2 |
|
|
agan8888
| |
+ 1 |
|
查看全部评分
|