首页
社区
课程
招聘
[原创]Vmprotect编译字节码的策略 - 真是太强了
发表于: 2007-4-14 00:40 7658

[原创]Vmprotect编译字节码的策略 - 真是太强了

2007-4-14 00:40
7658

char* str = "this is string!haha";
__declspec(naked) func2()
{
        VMPBEGIN
        MessageBox(0,"1","",MB_OK);
        _asm
        {
                retn
        }
        VMPEND
}
DWORD tmp = 0;
DWORD Eeax = 0;
_declspec(naked) func3()
{
        VMPBEGIN
        _asm
        {
                mov eax,Eeax
                jmp [eax]
        }
        VMPEND
}
_declspec(naked) func()
{
        VMPBEGIN
        goto begin;
rets:
        func2();
        goto ends;
begin:
        _asm
        {
                lea ebx,rets
                mov tmp,ebx
        }
        Eeax = (DWORD)&tmp;
        _asm
        {
                jmp func3
        }
ends:
        _asm
        {
                retn
        }
        VMPEND
}

int _tmain(int argc, _TCHAR* argv[])
{
        DWORD ss = Eeax;
        func();
        getchar();
        return 0;
}
以为jmp [eax]这种方法可以刁难Vmprotect了.
没想到它更胜一筹..
再找看看还有没能强奸它的语法.
************************************************************************************************************
稍微变了下代码
        VMPBEGIN
       
        goto begin;
rets:
        _asm
        {
                push func2
                retn
        }
        goto ends;
begin:
        _asm
        {
                lea ecx,rets
                mov tmp,ecx
                lea ebx,tmp
                mov Eeax,ebx
                mov eax,Eeax
                jmp [eax]
        }
ends:
        _asm
        {
                retn
        }
        VMPEND
发现顺利的挂了.
原因如下.
vmprotect在解释call时会先判断是否有其他代码引用当前地址.当没有引用时就直接编译为字节码,有引用时就将call放在原处.其他地址引用时也就不会出现错误了.
而改为push func2时就想也没想的把这里编译为字节码了,后面的 jmp [eax] 理所当然的就出问题了.

如果说要让vmprotect连这种类似自修改代码都支持的话的确有点困难.

不过.VC编译switch代码时会出现
jmp [401000+ebx] 跳到case语句去.
像这种不知道vmprotect的支持性怎么样...


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

收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 159
活跃值: (487)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼上也是强悍啊
2007-4-14 01:12
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
3
自修改,大概是无法支持吧。能解决这个问题,就无敌了
假如只支持高级语言,其实X86转VM还是挺简单的
一旦涉及汇编,兼容性就差了。。。
2007-4-14 01:41
0
雪    币: 1946
活跃值: (248)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
4
支持自修改的确有点困难,
不过支持如类似jmp [eax]动态定位代码应该还有优化的余地。
2007-4-14 10:44
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
5
做预言是愚蠢的,但我认为完美支持自修改是没可能的。
2007-5-20 17:37
0
雪    币: 1946
活跃值: (248)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
6
啊,记住了11111111111111
2007-5-20 18:04
0
游客
登录 | 注册 方可回帖
返回
//