<<目录>>
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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!