扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在本页阅读全文(共4页)
三、扭曲变换器
有了思想,就开始动手编码。原以为OBJ文件格式是有文档的,工程进度应该很快。没想到其中还是有很多内容需要考虑。每每说这是最后一个问题,解决了就没事了,却总是后延。
前前后后居然写了差不多半年时间。
主要遇到的技术问题:
* 汇编器ML会把所有的代码放到一个段中,这是不可以的。CL则通常是一个函数一个段。
* 汇编器ML不能生成 COMDAT 段。尽管文档中讲它支持COMMON,但加了这个关键字无效果。
* 汇编器ML不支持 WEAKEXTERN
* 汇编器ML只支持 defaultlib 这一个 drectve 关键字,其它 export, include 等关键字不支持.总之,CL编译的OBJ其中有很多属性是ML无法生成的。微软的masm真的该升级了。
还有一些问题:
* 分不清代码与数据。数据段中肯定是数据,但代码段中却有可能不是代码,是数据。这时如果你试图反汇编它,就会出错。
* ?????不管怎样,这些问题都一一解决了(别问我怎么做的)。
采用的代码扭曲方法:
* 用 JMP 把代码打乱。这已经不是什么新鲜的招数了,但它依然有效。
* 用 JMP 把多个函数缠绕在一起。这样可以让分析者找不到函数从什么地方开始,到什么地方结束。
* 把 call 改掉。破解者对 call 是极敏感的,这举可以让他找不到一个 call。
比如,我可以把 call sub1改为:
mov eax, offset sub1 + 3
push offset @1 sub eax, 3
jmp eax
@1:
* 把 ret 改掉。破解者对 ret 是极敏感的,这举可以让他找不到一个 ret。比如,我可以把ret写作:
push ecx
mov ecx, [esp+4]
add esp,8
jmp ecx
* 改条件跳。条件跳也是极敏感的指令,比如我们可以把:
cmp reg1, reg2
jge L_DST
L_NEXT:写作:
push eax
mov eax, reg1
sub eax, reg2
shr eax, 1fh
neg eax
and eax, L2 - L1
add eax, L1
jmp eax L1:
pop eax
jmp L_DST
L2:
pop eax
L_NEXT:
再看这个,你能看懂是什么意思吗:
push offset @@L - offset L_3 + 23h
jmp L_1
L_2:
jz L_3
ret 4
L_3:
add dword ptr [esp+4], offset L_3 - 23h
add esp,4
retL_1:
call L_2
...
这里出现了call和ret,但又不是一般所期望的那种。这里的call不代表你发现了一个函数调用。这里的ret不代表是一个函数的结束。
* 使用堆栈代替寄存器。比如:
MOV EAX, DWORD PTR [ECX+0AD8h]
PUSH EAX
MOV ECX, DWORD PTR [EAX]可以写作:
PUSH EAX
PUSH ECX
MOV EAX, DWORD PTR [ESP]
ADD EAX, 0AD8h
MOV EAX, DWORD PTR [EAX]
MOV DWORD PTR [ESP+04h], EAX
PUSH DWORD PTR [ESP+04h]
MOV EAX, DWORD PTR [ESP]
MOV DWORD PTR [ESP+08h], EAX
MOV EAX, DWORD PTR [ESP]
MOV EAX, DWORD PTR [EAX]
MOV DWORD PTR [ESP+04h], EAX
MOV EAX, DWORD PTR [ESP]
MOV ECX, DWORD PTR [ESP+04h]
ADD ESP, 08h
你能看懂吗?很明显,这个变换是不可逆变换。因为它本来使用了哪个寄存器,已经没有办法知道了。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者