-
-
[原创]C++中代码加解密及代码连锁的实现
-
发表于:
2009-12-23 12:46
7055
-
曾发了一个帖子
http://bbs.pediy.com/showthread.php?t=100887
有不少朋友联系我QQ,问代码加解密的实现方法,现公布一下代码示例
1.代码解密的实现
void fun()
{
DWORD dwStartAddr,dwEndAddr;
//获取要处理的代码的起始和终止地址
_asm
{
push eax
mov eax,offset fun_start
mov dwStartAddr,eax
mov eax,offset fun_end
mov dwEndAddr,eax
pop eax
}
CSms4 s4;//CSms4是一个sms4算法的加解密类
s4.SetKey(key,16);//设置解密密钥,key的来源自己处理
DWORD dwOldProtect, dwTemp;
VirtualProtect( (LPVOID)dwStartAddr, dwEndAddr - dwStartAddr,PAGE_EXECUTE_READWRITE, &dwOldProtect );//去掉代码区内存保护
s4.Decrypt( (BYTE*)dwStartAddr, dwEndAddr-dwStartAddr); //解密代码,当然你也可以做别的事情
VirtualProtect( (LPVOID)dwStartAddr, dwEndAddr - dwStartAddr,dwOldProtect, &dwTemp); //恢复内存保护
fun_start:
//需要处理的代码区域,以下仅为示例
if ( VerifySerialNum() == FALSE )//这个被反汇编时通常为关键跳转,即使注册码不对,被破解人员修改之后,错误的注册码也被通过
{
//退出程序
}
fun_end:
//保存关键代码区域的md5,下一节中使用
CMd5 md5;//CMd5为计算哈希的一个类
md5.Md5Buffer((BYTE*)dwStartAddr, dwEndAddr-dwStartAddr,g_keyData );//g_keyData为全局的BYTE g_keyData[16],保存了关键代码的哈希
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!