吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 27799|回复: 21
收起左侧

[原创] 一个简单的代码虚拟化编写工具

  [复制链接]
spdv123 发表于 2015-11-21 10:41
本帖最后由 spdv123 于 2015-11-21 11:03 编辑

前两天看了乌云知识库的一篇文章“动手实现代码虚拟机“(链接:http://drops.wooyun.org/tips/10384)
感觉这种方式十分新鲜,于是楼主自己做了一个C++版本的“代码虚拟化工具”,功能暂时还十分有限,
以后会多加改进。(本人还是新手,各种不足请各位多多批评指正)
(工具代码开源)
=============================================================
还是先介绍一下这是干什么的吧~(直接引用了原文的解释)

虚拟化实际上我认为就是使用一套自定义的字节码来替换掉程序中原有的native指令,而字节码在执行的时候又由程序中的解释器来解释执行。自定义的字节码是只有解释器才能识别的,所以一般的工具是无法识别我们自定义的字节码,也是因为这一点,基于虚拟机的保护相对其他保护而言要更加难破解。但是解释器一般都是native代码,这样才能使解释器运行起来解释执行字节码。其中的关系就像很多的解释型语言一样,不是系统的可执行文件,不能直接在系统中运行,需要相应的解释器才能运行,如python。

嗯,于是,我做的工作就是建立了一个头文件(mvm.h),在其中定义了MOV, JMP, CMP之类的指令并加以解释,
编写代码时每个指令被存放在一个数组的各个位中(不同于wooyun的内嵌汇编指令),就象这种形式:
[C++] 纯文本查看 复制代码
int s[30] = {
                MOV, EAX, 0x50
                , MOV, EBX, 5
                , SYS_READ
                , MOV, EBX, 'D'
                , MOV, 0x14, 0x50
                , CMP
                , JNZ, 8
                , MOV, EAX, 0x30
                , MOV, EBX, 9
                , SYS_WRITE
        };

可以看到是和汇编代码很相像的。
具体解释一下各个指令的含义吧(之前写在头文件里了,不过是英文的):
//buffer是全局的数组用来保存字符串

   MOV X Y //copy the value of Y to X
            //where X equals to EAX, EBX
            //ECX, EDX or 0x14(copy head_buf[Y]
            //to EAX)
           复制Y的值给X,X可以是EAX, EBX, ECX, EDX,或者0x14,此时是复制buffer[Y]的值给X
   
    ADD X Y //add the value of Y to X
            //where X equals to EAX, EBX
            //ECX, EDX or 0x14(add head_buf[Y]
            //to EAX)
           
增加Y的值到X上,X可以是EAX, EBX, ECX, EDX,或者0x14,此时是增加buffer[Y]的值到X   
    DEC X Y //decline the value of Y to X
            //where X equals to EAX, EBX
            //ECX, EDX or 0x14(decline head_buf[Y]
            //to EAX)
             减去
Y的值到X上,X可以是EAX, EBX, ECX, EDX,或者0x14,此时是减去buffer[Y]的值到X   

    XOR        //do an xor operation of EAX and
            //EBX, the result saves in EAX
            将EAX和EBX按位异或,结果存在EAX
    CMP        //compare EAX and EBX, if equals
            //zero flag(ZF) will be set to 1
            //else, ZF will be set to 0
            比较EAX和EBX的值,相等ZF置0,否则置1
    SYS_READ //read a string S from screen
            //whose length is EBX and starting
            //address is head_buf + EAX
            从屏幕读取EBX长度的字符串并保存到buffer[EAX]的位置
    SYS_WRITE //write a string S to screen
            //whose length is EBX and starting
            //address is head_buf + EAX
            向屏幕写入EBX长度的字符串,起始位置是buffer[EAX]
    JNZ X     //if ZF is 0, the EIP curse will add X
            //CAUTION: X is NOT abosolute address
            如果ZF是0,实现跳转注意所有的跳转是相对位置,就是数组下标差而不是绝对位置
    JZ X     //if ZF is 1, the EIP curse will add X
            //CAUTION: X is NOT abosolute address
            如果ZF是1,实现跳转
    JMP X    //EIP curse will add X
            无条件跳转
    NOP        //do nothing
            空指令

这样的话,我们可以回头看刚才的程序:
MOV, EAX, 0x50   //EAX设置为0x50
                , MOV, EBX, 5      //EBX设置为5
                , SYS_READ        //读入长度为5的字符串,保存在buffer[0x50]到buffer[0x54]的位置
                , MOV, EBX, 'D'   //设置EBX为大写D
                , MOV, 0x14, 0x50//设置EAX为buffer[0x50](读入的第一个字符)
                , CMP                  //比较EAX, EBX
                , JNZ, 8               //不相等的话向后跳转8个指令(即到末尾)
                , MOV, EAX, 0x30 //设置EAX为0x30
                , MOV, EBX, 9     //设置EBX为9
                , SYS_WRITE      //输出buffer[0x30]到buffer[0x38]的字符串(在其他地方设置好了,是“success!\n”)

哈哈,是一个超级简单的Crack Me
可以发现,这么写的话计算跳转太麻烦了,于是我做了一个GUI(伪,其实调用了之前写的控制台程序)
用标签实现跳转,具体是定义标签是用冒号加标签名称,如":jUmp1"
调用标签是标签名称加冒号,如"jUmp1:"
这样程序可以写为:
MOV EAX 0X50
MOV EBX 5
SYS_READ
MOV EBX 'D'
MOV 0X14 0X50
CMP
JNZ END:
MOV EAX 0X30
MOV EBX 9
SYS_WRITE
:END

另外,数据的话也做到了简单插入,上图吧~
21.png
嗯,右边的框框是插入数据用的,位置,长度,插入的字符串用空格隔开
然后点击生成cpp~,就会看到自动生成出的cpp啦,上一个生成的代码如下:


[C++] 纯文本查看 复制代码
#include "mvm.h"

uch s[1024] = {
        MOV, EAX, 0X50, 
        MOV, EBX, 5, 
        SYS_READ, 
        MOV, EBX, 'D', 
        MOV, 0X14, 0X50, 
        CMP, 
        JNZ, 7, 
        MOV, EAX, 0X30, 
        MOV, EBX, 9, 
        SYS_WRITE, 
        NOP,  NOP};

int main() {
        proc = new vm_processor;
        vm_interp(s, 25);
        getchar();
        return 0;
}


如果你在目录中的G_LOC.ini中定义了g++编译器的位置,那么可以直接点击编译生成exe文件啦
运行效果如下:

什么都没有
22.png
输出成功消息!
23.png
在这里再放一段样例代码吧:
(注:是在http://www.52pojie.cn/thread-436205-1-1.html的CrackMe源码)

:START
MOV EAX 0X20
MOV EBX 9
SYS_WRITE
MOV EAX 0X50
MOV EBX 5
SYS_READ
MOV EBX 'A'
DEC EBX 1
MOV 0X14 0X50
CMP
JNZ START:
MOV 0X14 0X51
MOV EBX 'B'
CMP
JNZ SUC:
JMP START:
:SUC
MOV EAX 0X30
MOV EBX 9
SYS_WRITE


数据区:
0x20 9 Input_SN:
0x30 9 YOU_GOT!\n
0x40 7 failed\n

顺便说一句,这段代码防止了@
苏紫方璇的修改关健跳法,
他当时是这么做的
004017AB  |. /75 1B         jnz short CrackMe!.004017C8
jmp了就可以了
但是但是~这个jmp是我们自己定义的jnz函数的跳转,也就是说程序所有的
jnz函数都会跳转异常,于是第二个jnz就跳转到失败的地方啦~

==============================================
说了这么多,再说一下程序不足的地方(新手的面貌体现出来了)
不能有空格
不能有空格
不能有空格
不管是标签还是字符串都不可以包含空格。。。
还有就是没有语法检查。。。。只能靠自己的细心了
刚刚接触这方面,感觉真的都好新鲜
期待和大家一同学习进步~

对啦还有下载,这里上传一个没有源代码的,开源太大的我放网盘上啦
Coder.rar (382.5 KB, 下载次数: 39) (不含源代码)
链接:http://pan.baidu.com/s/1bneCj19 密码:d4e0(含源代码)



免费评分

参与人数 5威望 +2 吾爱币 +1 热心值 +5 收起 理由
chkds + 1 + 1 用心讨论,共获提升!
Hmily + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
苏紫方璇 + 1 膜拜大牛,学习啦。。。
菜De + 1 新人进来学习
a931948882 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Sound 发表于 2015-11-23 15:27
鑒於樓主第壹次發佈技術文章主題,

因未達到精華標準 特採取 高亮 威望 優秀 以茲鼓勵 ,希望堅持自己的愛好、多多發佈技術文獻與作品 並且早壹日成為大牛。

同時也希望他人學習樓主分享精神、技術菜,文章門檻低,不好意思發佈,這都不要緊.還有很多很多人正在破解大門前久久不能入門,也許正在苦惱。也許妳的壹個文章能讓他找到自信。而挽救壹個準備放棄的人
 楼主| spdv123 发表于 2015-11-23 18:19
Sound 发表于 2015-11-23 15:27
鑒於樓主第壹次發佈技術文章主題,

因未達到精華標準 特採取 高亮 威望 優秀 以茲鼓勵 ,希望堅持自己的 ...

多谢Sound大大的鼓励,我会继续加油的!
一生情独醉 发表于 2015-11-21 10:47
rzlsysw01 发表于 2015-11-21 10:53
小白学不来……。
tusdasa翼 发表于 2015-11-21 11:26
我也在乌云看来的 有不少汇编我就闪人了
huo 发表于 2015-11-21 11:52
厉害 感谢
tangdragon 发表于 2015-11-21 11:58
都用这个保护的话,对破解来说难度就加大很多了。
菜De 发表于 2015-11-21 12:39
新人进来学习+1{:1_903:}
rig 发表于 2015-11-21 13:06
略显高端……基本看不懂
系统大玩家 发表于 2015-11-22 14:31
学习了··················
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-10 09:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表