PointerToRawData + pTarBuff;//2.获取代码段实际大小int nSize = GetSecHeader(pTarBuff, ".text")->_c++代码加密">
赞
踩
我们在逆向破解的时候通常第一方法是找到关键字符串,关键代码等,他们都是存在于代码段的,那么只要把代码段进行加密,这种方式就不可行了。
先在加壳器中加密,这使用简单的亦或加密。
- /加密代码段
- //1.获取代码段首地址
- char* pTarText = GetSecHeader(pTarBuff, ".text")->PointerToRawData + pTarBuff;
- //2.获取代码段实际大小
- int nSize = GetSecHeader(pTarBuff, ".text")->Misc.VirtualSize;
- for (int i = 0; i < nSize; ++i)
- {
- pTarText[i] ^= 0x15;
- }
再到壳代码里解密,自己写了一个对比字符串的函数。
- //自写strcmp
- int StrCmpText(const char* pStr, char* pBuff)
- {
- int nFlag = 1;
- __asm
- {
- mov esi, pStr;
- mov edi, pBuff;
- mov ecx, 0x6;
- cld;
- repe cmpsb;
- je _end;
- mov nFlag, 0;
- _end:
- }
- return nFlag;
- }
- //解密
- void Decryption()
- {
- //获取.text的区段头
- auto pNt = GetNtHeader((char*)g_hModule);
- DWORD dwSecNum = pNt->FileHeader.NumberOfSections;
- auto pSec = IMAGE_FIRST_SECTION(pNt);
-
- //找到代码区段
- for (size_t i = 0; i < dwSecNum; i++)
- {
- if (StrCmpText(".text", (char*)pSec[i].Name))
- {
- pSec += i;
- break;
- }
- }
-
- //获取代码段首地址
- char* pTarText = pSec->VirtualAddress + (char*)g_hModule;
- int nSize = pSec->Misc.VirtualSize;
- DWORD old = 0;
- //解密代码段
- MyVirtualProtect(pTarText, nSize, PAGE_READWRITE, &old);
- for (int i = 0; i < nSize; ++i) {
- pTarText[i] ^= 0x15;
- }
- MyVirtualProtect(pTarText, nSize, old, &old);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。