| 
 | 
			
 
 本帖最后由 紫金御龙鳞 于 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 | 
 | 
 
 
查看全部评分
 
 
 
 
 
 |