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和头文件,想直接用机器码解决问题!
#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
}
}
bester 发表于 2019-12-7 21:11
不懂asm,没办法的呀,我就知道asm可以添加汇编指令,其他的不会玩呀哥
这个写法,百度一下就有的,很老的东西啦,老版本的VMP,就是这么标记的,只是新版本,也支持!
具体的原理,上面的这些人,已经说的比较清楚了,这个就是第一个回贴的人的方法的简化版本!其实意思都一样!VMP就是搜索这个标志来处理这些函数,不过还是用头文件和LIB好一点,因为他还提供了很多其它的功能!不只是标记函数!一起交流!互相学习!{:1_893:}
__asm{db 0xEB,0x10,'VMProtect begin',0};//标记开始
__asm{db 0xEB,0x0E,'VMProtect end',0};//标记结束
最后想吐槽一句,楼主的方法....不知道比引入LIB和加个头文件...要麻烦多少!!!! EB字节码转换汇编就是jmp,EB 10就是jmp到0x10字节后。。。。。。。。 wangyujie96 发表于 2019-12-7 20:55
EB字节码转换汇编就是jmp,EB 10就是jmp到0x10字节后。。。。。。。。
剩下的这串ascii 字符串怎么在C++的asm表达出来呢?
本帖最后由 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可以添加汇编指令,其他的不会玩呀哥 gunxsword 发表于 2019-12-7 20:52
__asm{db 0xEB,0x10,'VMProtect begin',0};//标记开始
__asm{db 0xEB,0x0E,'VMProtect end',0};//标记 ...
然后我还有一个问题,如果这个字符串是unicode 不是ascii 代码该怎么改啊? gunxsword 发表于 2019-12-7 21:19
这个写法,百度一下就有的,很老的东西啦,老版本的VMP,就是这么标记的,只是新版本,也支持!
具体的原理,上 ...
老哥,unicode的字符串怎么置入?
页:
[1]
2