smc(self-modifyingcode)动态代码加密技术,指通过修改代码或数据,阻止别人直接静态分析,然后在动态运行程序时对代码进行解密,达到程序正常运行的效果
代码:加密解密4 (17.4)
try
{
_asm inc eax // 在十六进制工具中对应0x40
_asm dec eax // 在十六进制工具中对应0x48
begindecrypt:
...........
enddecrypt:
_asm inc eax // 在十六进制工具中对应0x40
_asm dec eax // 在十六进制工具中对应0x48
return TRUE;
}
catch (...)
{
MessageBoxA(NULL, TEXT("请注册,以获得完整的功能 !"), TEXT("提示"), 0);
Decrypt(ptr, Size, k);//如注册码不正确,则必须得再次调用Decrypt()将address1和address2之间数据还原
return FALSE;
}
void Decrypt(DWORD* pData, DWORD Size, DWORD value)
{
//首先要做的是改变这一块虚拟内存的内存保护状态,以便可以自由存取代码
MEMORY_BASIC_INFORMATION mbi_thunk;
//查询页信息
VirtualQuery(pData, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));
//改变页保护属性为读写。
VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect);
Size = Size / 0x4; //对数据共需要异或的次数
//解密begindecrypt与enddecrypt标签处的数据
while (Size--)
{
*pData = (*pData) ^ value;
pData++;
}
//恢复页的原保护属性。
DWORD dwOldProtect;
VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, mbi_thunk.Protect, &dwOldProtect);
}