首页
社区
课程
招聘
[原创]在堆栈中运行代码
发表于: 2005-12-19 10:40 12872

[原创]在堆栈中运行代码

2005-12-19 10:40
12872

参考VCASM最初在:
http://bbs.pediy.com//showthread.php?threadid=8264
发表的技术,把一条汇编指令变形,在堆栈中运行,比如
        xor eax,eax
可以变形为:
        PUSH    0234365h
        PUSH    07EC2C033h
        XOR     DWORD PTR [ESP+03h], 023436576h
        CALL    ESP
在call esp后,堆栈中的指令为:
        33 c0        xor eax,eax
        c2 08 00        ret 8
这样变形后的代码分析起来是很困难的。如果我们把重要函数代码
都用这种方式变形,就可以防止代码被逆向分析。

在实际使用中,发现这种方法在某些老的赛扬CPU上运行不正常。问
题出在call esp这条指令上。
我们期望call esp这条指令是这样运行的:
        mov tem,esp
        push offset L__1
        jmp tem        
L__1:
但在某些CPU上,它却是这样运行的:
        push L__1
        jmp esp
L__1:
这样上面的代码运行起来就错了,程序会崩溃。

既然call esp不能用,只好用call eax了,我这样写:
        PUSH    EAX
        PUSH    0234365h
        PUSH    066C2C033h
        PUSH    01024448Bh
        XOR     DWORD PTR [ESP+07h], 023436576h
        MOV     EAX, ESP
        CALL    EAX
在call esp后,堆栈中的指令为:
        8B 44 24 10          mov         eax,dword ptr [esp+10h]
        33 C0                xor         eax,eax
        C2 10 00             ret         10h

这样就解决了某些CPU不兼空call esp的问题。缺点是代码膨胀过于厉害,
原来的一条指令变成了这么长,运行效率也大大降低。

类似地,
        push ebx
可以变形为:
        PUSH    EAX
        PUSH    0234FA7h
        PUSH    066245C89h
        PUSH    01024448Bh
        XOR     DWORD PTR [ESP+07h], 023436576h
        MOV     EAX, ESP
        CALL    EAX

我使用这个方法,再加上一些不可逆变换,再加上跳转打乱,作出了一个“代码
变形器”,对自己软件的关键函数加密,起到了良好的效果。

作者:bookaa@rorsoft.com 2005.12.19


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 224
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
bookaa在加密方面研究的很深入的。
2005-12-19 10:41
0
雪    币: 216
活跃值: (370)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
在有数据执行保护的机器上你的程序就挂了。
2005-12-19 11:00
0
雪    币: 255
活跃值: (207)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
4
exploit上惯用的技术.DEP保护不好过的说.
但有相关的文章可以过dep的。
2005-12-19 11:31
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
争相盗版vcasm。
2005-12-19 16:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
理解并接受加密,
但是不同意并鄙视造成系统不稳定,
   以安全来换取加密的行为!!!!
2005-12-19 18:36
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
7
这种方式导致运行速度下降。把CPU预取的指令都给冲掉了。不过加密来说毕竟不错。
2005-12-20 00:16
0
雪    币: 224
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最初由 nbw 发布
这种方式导致运行速度下降。把CPU预取的指令都给冲掉了。不过加密来说毕竟不错。


要求高速运行的模块不能采用这种方式加密,和界面相关的代码或者是运行次数很少的代码可以采用.
2005-12-20 08:32
0
雪    币: 217
活跃值: (86)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
Kernel64 你是谁 你在bookaa那工作过?
2005-12-20 14:44
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
10
若是我,hmmm(没试验)
        ...
        push 0C3h ; ret这个自己改retn xx
        call __0
        jmp  __1
__0:    jmp  esp
__1:    ...
2005-12-20 14:58
0
雪    币: 224
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
最初由 doa007 发布
Kernel64 你是谁 你在bookaa那工作过?


我是ZhangYL,你是哪位?
2005-12-20 20:37
0
雪    币: 208
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
过目不忘!
2005-12-21 05:19
0
雪    币: 217
活跃值: (86)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
我们认识的,DGH 呀
2005-12-21 15:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
在有数据执行保护的机器上你的程序就挂了。
2005-12-21 21:30
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这种技术在SVKP中广泛使用。

我一直搞不清楚SVKP自动生成这些堆栈代码的。手工写似乎工作量太大了些。
2005-12-22 04:17
0
游客
登录 | 注册 方可回帖
返回
//