PointerToRawData + pTarBuff;//2.获取代码段实际大小int nSize = GetSecHeader(pTarBuff, ".text")->_c++代码加密">
当前位置:   article > 正文

C++代码段加密_c++代码加密

c++代码加密

我们在逆向破解的时候通常第一方法是找到关键字符串,关键代码等,他们都是存在于代码段的,那么只要把代码段进行加密,这种方式就不可行了。


先在加壳器中加密,这使用简单的亦或加密。

  1. /加密代码段
  2. //1.获取代码段首地址
  3. char* pTarText = GetSecHeader(pTarBuff, ".text")->PointerToRawData + pTarBuff;
  4. //2.获取代码段实际大小
  5. int nSize = GetSecHeader(pTarBuff, ".text")->Misc.VirtualSize;
  6. for (int i = 0; i < nSize; ++i)
  7. {
  8. pTarText[i] ^= 0x15;
  9. }

 再到壳代码里解密,自己写了一个对比字符串的函数。

  1. //自写strcmp
  2. int StrCmpText(const char* pStr, char* pBuff)
  3. {
  4. int nFlag = 1;
  5. __asm
  6. {
  7. mov esi, pStr;
  8. mov edi, pBuff;
  9. mov ecx, 0x6;
  10. cld;
  11. repe cmpsb;
  12. je _end;
  13. mov nFlag, 0;
  14. _end:
  15. }
  16. return nFlag;
  17. }

 

  1. //解密
  2. void Decryption()
  3. {
  4. //获取.text的区段头
  5. auto pNt = GetNtHeader((char*)g_hModule);
  6. DWORD dwSecNum = pNt->FileHeader.NumberOfSections;
  7. auto pSec = IMAGE_FIRST_SECTION(pNt);
  8. //找到代码区段
  9. for (size_t i = 0; i < dwSecNum; i++)
  10. {
  11. if (StrCmpText(".text", (char*)pSec[i].Name))
  12. {
  13. pSec += i;
  14. break;
  15. }
  16. }
  17. //获取代码段首地址
  18. char* pTarText = pSec->VirtualAddress + (char*)g_hModule;
  19. int nSize = pSec->Misc.VirtualSize;
  20. DWORD old = 0;
  21. //解密代码段
  22. MyVirtualProtect(pTarText, nSize, PAGE_READWRITE, &old);
  23. for (int i = 0; i < nSize; ++i) {
  24. pTarText[i] ^= 0x15;
  25. }
  26. MyVirtualProtect(pTarText, nSize, old, &old);
  27. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/990837
推荐阅读
相关标签
  

闽ICP备14008679号