首页
社区
课程
招聘
[原创]软件保护壳技术专题 - 重定位模块的构建
发表于: 2008-11-26 16:28 17810

[原创]软件保护壳技术专题 - 重定位模块的构建

2008-11-26 16:28
17810

<<目录>>
0.前言
1.什么是重定位模块
2.重定位模块的原理
  2-1.重定位模块的设计
  2-2.重定位模块何时插入
  2-3.修复内存跳转
  2-4.指令的变换
  2-5.重定位模块的缺陷
  2-6.重定位模块演示
3.重定位模块的应用
4.后语

正文ing >>>
0.前言
这篇文章也拖的比较长了,由于重定位模块需要反汇编引擎的支持,上一次写的反汇编引擎有N多BUG。所以一直在调试,期间又遇上XCON和XKUNGFOO的召开。我的议题是讨论病毒感染策略,其中详细讲解了代码集成这一感染策略。因为BLACK HAT的大牛有事情没有来。所以本来在XKUNGFOO上的议题给我转到XCON上进行讨论。期间我对重定位模块进行了一个演示,算是一个“婴儿”版吧。这之后我会对这个引擎进行一个长期的打磨,争取可以为更多的病毒CODER和壳CODER们有所帮助。
1.什么是重定位模块
重定位模块的产生,首先是在95年的ZMIST病毒的代码集成感染提出的。目的是将病毒代码随机分片插入到宿主文件代码中,并用跳转指令连接。如果插入的位置是在跳转指令之中,会对跳转的偏移进行改变,所以需要使用重定义模块进行对偏移的修复,以便于可以使感染后的程序继续的执行。然而重定位模块的作用并不只限于感染方面,例如花指令构造器以及高级的变形引擎中都可以得到很好的应用,在壳方面的应用在于如果我们把壳的引导代码以代码集成方式进行感染,破解者很难区分壳与真正的代码段,防止DUMP等。

2.重定位模块的原理
2-1.重定位模块的设计
重定位模块是整个代码集成的关键模块。它依靠反汇编引擎来识别代码。并且也负责修订病毒体偏移的任务。
先读取代码节,以代码节的各个跳转指令为节点进行分段。记录它的偏移长度以及跳转方向。
分析跳转指令之间产生的空隙。按空隙的大小对要插入的代码进行分段。
在跳转中插入代码后,修订跳转的偏移量

2-2.重定位模块何时插入
在将病毒代码插入到宿主代码中最理想的位置是两段跳转指令之间,这样可以不用修复任何跳转偏移。
修复偏移只有在插入到跳转指令的集合内,如果有跳转指令有交集则修复所有跳转指令的偏移。

2-3.修复内存跳转
在遇到如call dword ptr [404340],jmp dword ptr [404340]等代码,需要拆解ModRM,SIB两个位得到。由于call,jmp由内存指定值跳转的编码同为FF,扩展编码为call:02,jmp:04。由于我们编写的病毒在32位下运行,所以16位的编码不进行考虑。
查INTEL手册编码得到两组可以跳转的情况。
单ModRm情况:当为call,ModRM取15h,为jmp,ModRM取25h.
具有SIB的情况:Mod为00h.查看R/M为04h RO为2或者4,所以得下两种情况ModRM为14h,24h。检查SIB,SIB的情况仅与Index,Base字段有关。当Index = 04h,Base = 05h下的情况全部可以重定位。
从指向的内存中取出要跳转的地址,进行偏移修复。

2-4.指令的变换
某些跳转指令的立即数是单字节,这些指令无论向上还是向跳转的空间只有127个字节,所以当插入代码长度与偏移的和大于这个数字时就要利用相同作用但偏移量更大的指令替换。在扩展指令后,指令的长度进行了增大,这时如果此指令在其他跳转集合内需要再进行一次重定位修复。

2-5.重定位模块的缺陷
重定位模块只能修订以偏移量作为跳转情况 如果是动态跳转例如:
Jmp dword ptr [ebx]
Call eax
等类似的代码重定位模块则不能修复。

2-6.重定位模块演示
这里我们定义:
原始代码为:O
要插入的代码:I  将I代码分为I1,I2,I3三段代码
O的代码

Start:
  jmp ZZZ
  mov eax, 1
  std
  jo XXX
  rep movsb
  call Call1
ZZZ:
  mov ebx, 2
  mov ecx, 3
  mov edx, 4
Data:
  db 0FFh,025h,86h,10h,40h,00h
GGG:
  call Call2
  mov eax, 1
  mov eax, 1
  call GGG
  mov ebx, 2
XXX:
  mov eax, 1
  mov ebx, 2
  mov ecx, 3
  jz Start
  mov edx, 4
  jz Start
  mov eax, 1
  mov ebx, 2
  jmp ZZZ
  mov ecx, 3
  mov edx, 4
  call XXX
Exit:
  invoke ExitProcess, 1
  retn 00h
Call1 proc
  mov eax, 1
  ret
Call1 endp
 
Call2 proc
  mov eax, 2
  ret
Call2 endp
db 79h,010h,040h,00h
end Start  
InsertStart1:
  push eax
  mov eax, 1
  sub eax, 0FFh
  mov eax, 1
  sub eax, 0FFh
  mov eax, 1
  pop eax
 
InsertStart2:
  push ebx
  mov ebx, 0FFFFFFFFh
  sub ebx, 010h
  pop ebx
 
InsertStart3:
  push ecx
  mov ecx, 0FFFFFFFFh
  sub ecx, 010h  
  pop ecx

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 334
活跃值: (22)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
支持,玩命的顶
2008-11-26 16:32
0
雪    币: 47147
活跃值: (20465)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
玩命辛苦了,不要太玩命,呵~
另外,图片能不能传到论坛本地?放远程时间长了会丢失,另外,我这提示“该图片仅百度用户交流使用”
2008-11-26 16:35
0
雪    币: 347
活跃值: (30)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
4
我这里也是“该图片仅百度用户交流使用”

玩命,这个就是你和我说的那个吧?
2008-11-26 16:40
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
支持,慢慢学习~
2008-11-26 16:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我顶楼主每贴。。。。。。。。。。。。。。。。。
2008-11-26 18:08
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
7
老大论坛上哪里可以传吖。。。  我改传到纳米盘了。
2008-11-26 22:01
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
8
跟着玩命学习。
2008-11-27 08:53
0
雪    币: 47147
活跃值: (20465)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
9
图片放文章的方法参考这帖:http://bbs.pediy.com/showpost.php?postid=292659
2008-11-27 08:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=;]...[/QUOTE]
对付不了间接跳转是个致命伤,除了call reg之类的现实中还会碰到很多其他间接跳转方式,例如在壳里面,大量使用ret或其他方式进行跳转的程序都会导致感染后出问题.
此外还要考虑数据引用的情况:
jmp end

xxx:
test eax, eax
end:

而在其他地方
mov eax, offset xxx
call eax
这时插入代码就会导致错误.而要正确分析清楚这些,重定位数据是必需的,但不是所有的时候都有重定位数据.这也限制了这类自动化感染技术的应用.建议LZ写一个好用的disasm引擎,不要继续研究集成了,在我看来这是一条死胡同.

另外弱弱的问一句:
"玩命"这个名字从何而来?
2008-11-27 09:35
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
11
谢谢楼上的朋友答复。call reg 这类的跳转是实在没有办法。但还是少数。
其实如果你仔细看下代码就知道了。 我集成代码只在代码节中,就是说不超过代码节文件对齐后的大小 - 代码节真实大小的空间, 至少90%以上的程序 都分代码节和数据节 这样我只需要重新构建代码节不用去重新构造整个PE文件。 一些如mov eax, offset XXX 这类指令。如果XXX是在数据节那么完全可以不用修复,大部分程序还是用高级语言写的只要是用高级语言写的就有固定的格式。这些都是好分析的。如果代码中存在函数指针的引用可能会出现问题。(call reg) 如果引用函数的地址是在代码执行入口点地址之上那么则不用修复。原理你可以想一下。

我的想法是能有80%的程序可以被集成。这个重定位模块就算没有白开发。

ZMIST病毒也是这样的原理,代码集成已经有应用,并不是一个很空的说话。并且产生于95年。
只是至今也没几个人模仿。我只是想做的更加完善而已。

如果你觉的不稳定,可以把它应用到随机花指令的构造上。当然那个反汇编引擎还是会继续开发。

“玩命”出自成龙大哥的电影双龙记
2008-11-27 09:58
0
雪    币: 124
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
学习......
2009-2-8 17:25
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
13
新增加了一个函数。
挺多人说这东西不能修复 mov reg,绝对地址; call reg; 类似的问题。 其实想想也挺简单的 mov reg, 绝对地址; 绝对地址肯定有个范围,一般来讲用户定义的数据和绝对地址的冲突太少了 所以只要再修复mov reg,绝对地址; push 绝对地址;等等语句;判断后面的数据是不是在我的内存中存在的范围。就OK了。这样就解决了call reg; push reg; ret; 这样的问题了。 至于更复杂的一些算法 例如把绝对地址分开 然后做运算 再跳转 大可以不去管它。 这种程序太少了。1/1M?
2009-2-9 12:59
0
雪    币: 124
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
先收藏了,以后慢慢看
2009-4-16 19:00
0
雪    币: 8107
活跃值: (1955)
能力值: ( LV8,RANK:122 )
在线值:
发帖
回帖
粉丝
15
很强大.顶了
2009-4-16 19:53
0
雪    币: 192
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
膜拜下~初学
2010-3-26 00:58
0
游客
登录 | 注册 方可回帖
返回
//