bester 发表于 2019-12-7 19:21

C++调用易语言VMP加密SDK标记的思路之一

不想导入lib库以及导入vmp.h,就是懒,然后就有了下面这个方法,加密方式,其实就两步,第一步复制粘贴asm,第二步拖到替换工具
易语言程序内置VMP加密标记的方法:
VMProtect.易的SDK
置入代码 ({ 235, 16, 86, 77, 80, 114, 111, 116, 101, 99, 116, 32, 98, 101, 103, 105, 110, 0 }) ' VMP保护开始标志
'关键代码
置入代码 ({ 235, 14, 86, 77, 80, 114, 111, 116, 101, 99, 116, 32, 101, 110, 100, 0 }) ' VMP保护结束标志


翻译成16进制则:

EB 10 56 4D 50 72 6F 74 65 63 74 20 62 65 67 69 6E 00   size:18 "VMProtect begin"

EB 0E 56 4D 50 72 6F 74 65 63 74 20 65 6E 64 0016 size:16 "VMProtect end"

那么C++由于没有置入代码功能,所以我们得另想方式将这18+16个字节的机器猫写入到函数内,首先将C++的随机基质给关闭掉,然后用asm写18+16个NOP,代码如下

int main()
{
        _asm
        {
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
               
    }
        MessageBox(NULL, LPCWSTR(L"C++调用E的SDK"), LPCWSTR(L"C++调用E的SDK"), NULL);
        _asm
        {
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;
                nop;


        }
}

最后的话就是在OD中将18+16个字节,用vmp加密标记修改一下即可,如果说是批量的话,那也很简单,用易语言读入文件,搜索18个NOP的位置,替换之,再搜索16个NOP的位置,再替换
如果算法有难度,可以将NOP改成无意义汇编语句,如:mov eax,eax等等,搜索字节集就好

效果图:







然后希望大家集思广益,能提供一下更简便的方法,主要是不想调用lib和头文件,想直接用机器码解决问题!

limlibgiag 发表于 2019-12-7 20:05

#include <iostream>
#include <Windows.h>

int main()
{
        _asm
        {
                _emit 0xEB
                _emit 0x10
                _emit 0x56
                _emit 0x4D
                _emit 0x50
                _emit 0x72
                _emit 0x6F
                _emit 0x74
                _emit 0x65
                _emit 0x63
                _emit 0x74
                _emit 0x20
                _emit 0x62
                _emit 0x65
                _emit 0x67
                _emit 0x69
                _emit 0x6E
                _emit 0x00
        }
        MessageBox(NULL, LPCWSTR(L"C++调用E的SDK"), LPCWSTR(L"C++调用E的SDK"), NULL);
        _asm
        {
                _emit 0xEB
                _emit 0x0E
                _emit 0x56
                _emit 0x4D
                _emit 0x50
                _emit 0x72
                _emit 0x6F
                _emit 0x74
                _emit 0x65
                _emit 0x63
                _emit 0x74
                _emit 0x20
                _emit 0x65
                _emit 0x6E
                _emit 0x64
                _emit 0x00
        }
}

gunxsword 发表于 2019-12-7 21:19

bester 发表于 2019-12-7 21:11
不懂asm,没办法的呀,我就知道asm可以添加汇编指令,其他的不会玩呀哥

这个写法,百度一下就有的,很老的东西啦,老版本的VMP,就是这么标记的,只是新版本,也支持!
具体的原理,上面的这些人,已经说的比较清楚了,这个就是第一个回贴的人的方法的简化版本!其实意思都一样!VMP就是搜索这个标志来处理这些函数,不过还是用头文件和LIB好一点,因为他还提供了很多其它的功能!不只是标记函数!一起交流!互相学习!{:1_893:}

加油 发表于 2019-12-7 20:13

gunxsword 发表于 2019-12-7 20:52

__asm{db 0xEB,0x10,'VMProtect begin',0};//标记开始
__asm{db 0xEB,0x0E,'VMProtect end',0};//标记结束

最后想吐槽一句,楼主的方法....不知道比引入LIB和加个头文件...要麻烦多少!!!!

wangyujie96 发表于 2019-12-7 20:55

EB字节码转换汇编就是jmp,EB 10就是jmp到0x10字节后。。。。。。。。

bester 发表于 2019-12-7 21:02

wangyujie96 发表于 2019-12-7 20:55
EB字节码转换汇编就是jmp,EB 10就是jmp到0x10字节后。。。。。。。。

剩下的这串ascii 字符串怎么在C++的asm表达出来呢?

bester 发表于 2019-12-7 21:11

本帖最后由 bester 于 2019-12-7 21:13 编辑

gunxsword 发表于 2019-12-7 20:52
__asm{db 0xEB,0x10,'VMProtect begin',0};//标记开始
__asm{db 0xEB,0x0E,'VMProtect end',0};//标记 ...
不懂asm,没办法的呀,我就知道asm可以添加汇编指令,其他的不会玩呀哥

bester 发表于 2019-12-7 21:19

gunxsword 发表于 2019-12-7 20:52
__asm{db 0xEB,0x10,'VMProtect begin',0};//标记开始
__asm{db 0xEB,0x0E,'VMProtect end',0};//标记 ...

然后我还有一个问题,如果这个字符串是unicode 不是ascii 代码该怎么改啊?

bester 发表于 2019-12-7 21:21

gunxsword 发表于 2019-12-7 21:19
这个写法,百度一下就有的,很老的东西啦,老版本的VMP,就是这么标记的,只是新版本,也支持!
具体的原理,上 ...

老哥,unicode的字符串怎么置入?
页: [1] 2
查看完整版本: C++调用易语言VMP加密SDK标记的思路之一