level 14
由于现在商业游戏的加密越来越多的使用代码虚拟化的加密方式
所以我觉得有必要开始认真学习一下常见的代码变形和逻辑混淆方式
于是我决定借用这个地方开个贴认真学习一下
大家有兴趣的话也可以一起学哦~
2015年10月29日 07点10分
1
level 14
刚开始还是先学个最简单的吧,这是汇编教材里提到的一个例子,应该是最简单的代码变形了~
例题1
设EIP=425EF1
那么以下指令等效于哪一句?
push 00425EFB
jmp 0041F7F0
2015年10月29日 07点10分
2
level 11
……不知道说错没
等于call 0041F7F0
分析:
call x等价于
push eip
jmp x
执行push eip时eip会发生改变,每一条命令长度是5位,故eip需要加10
所以call 0041F7F0
等于
push 00425EF1+10
jmp 0041F7F0
2015年10月29日 08点10分
4
就是这样啊~
2015年10月29日 13点10分
level 14
例题一答案
call 0041F7F0
因为call的作用就是先push eip然后jmp
2015年10月29日 13点10分
6
level 14
来个例题1的变式
例题2
设EIP=425EF1
那么以下指令等效于哪一句?
push 00425F08
push 0041F7F0
retn
2015年10月29日 13点10分
7
level 11
这个的答案应该和1是一样的?retn等价于pop eip
而执行完jmp 0041F7F0 以后,eip也就等于0041F7F0了
2015年10月29日 14点10分
8
对了~就是一样的~
2015年10月30日 11点10分
level 14
例题二答案
call 0041F7F0
因为retn的意义就是先pop再jmp
那么push xxxx以后紧接着retn,就相当于jmp xxxx
那么就和例题1的情况完全一样了
所以答案也是一样的
2015年10月31日 12点10分
10
level 14
这次来个难一点的
例题三
设[46CBA2]=40C766
那么以下指令等效于哪一句?
mov ecx, 0x46CB0A
mov ecx, dword ptr [ecx+0x98]
lea ecx, dword ptr [ecx+0xFFBF389B]
2015年10月31日 12点10分
11
level 11
第一句,令ecx的值等于0x46CB0A
第2句,dowrd ptr[ecx+0x98]是ecx+0x98的地址,ecx+0x98=46CBA2,故此时ecx=[46CBA2]的数据,即40C766。
第3句,取40C766+0xFFBF389B的地址,40C766+FFBF389B=1 0000 0001 溢出一位,实际上就相当于0000 0001,然后lea将这个命令赋值给ecx,ecx=0x00000001。
故这三句实际等于令ecx等于0x00000001。即mov ecx,0x00000001
抢答(
2015年10月31日 12点10分
12
那么这个变形的意义就在于[46CBA2]=40C766,这个值通常加密系统使用硬件信息计算出来,如果你不还原,而是直接copy到源程序里运行,那么得到的程序别人的机器就用不了,从而达到防破解的目的。
2015年10月31日 13点10分
原来如此,我还在想什么情况需要用这么复杂的方式来实现一个赋值
2015年10月31日 13点10分
level 11
顺便学习了一下lea实际上经常用来计算这个事情。比单纯的加法快?(
2015年10月31日 13点10分
13
level 11
例题3答案
mov ecx,0x1
解析见大佐的楼层~
2015年10月31日 13点10分
14
level 11
第一句,ebx并不知道是什么,先push进去
第2句,令ebx等于0xBD
第3句,ebx+0x1C98B60=0xBD+0x1C98B60=BD+1C98B60=1C98C1D,类似于上一题,此时ebx=40D146。
第4句,依然类似于上一题,40D146
+3
6991E=776A64,将这个值赋予ebx,ebx=0x776A64
第5句,esp是堆栈指针,取堆栈指针指向的值,就是最开始放进去的ebx, xchg意为交换,即将现在ebx的值与之前push进去的交换。
故上面的几句等价于,直接向栈顶push一个给定的数值,即push 0x776A64
不知道数据算没算错。。。
2015年10月31日 13点10分
16
对滴~其实写这种玩意需要发散思维~
2015年10月31日 13点10分