加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

26种对付反调试的方法

发布时间:2019-03-22 03:36:50 所属栏目:建站 来源:luochicun
导读:今朝首要有3种说明软件的要领: 1.数据互换说明,研究职员行使数据包嗅探器材来说明收集数据互换。 2.对软件的二进制代码举办反汇编,然后以汇编说话列出。 3.字节码解码或二进制解码,然后以高级编程说话从头建设源代码。 本文针对的是Windows操纵体系中

该布局中最风趣的是InheritedFromUniqueProcessId字段。在这里,我们必要获取父历程的名称并将其与风行调试器的名称举办较量,以下是这种反调试搜查的列表:

  1. std::wstring GetProcessNameById(DWORD pid) 
  2.     HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
  3.     if (hProcessSnap == INVALID_HANDLE_VALUE) 
  4.     { 
  5.         return 0; 
  6.     } 
  7.     PROCESSENTRY32 pe32; 
  8.     pe32.dwSize = sizeof(PROCESSENTRY32); 
  9.     std::wstring processName = L""; 
  10.     if (!Process32First(hProcessSnap, &pe32)) 
  11.     { 
  12.         CloseHandle(hProcessSnap); 
  13.         return processName; 
  14.     } 
  15.     do 
  16.     { 
  17.         if (pe32.th32ProcessID == pid) 
  18.         { 
  19.             processName = pe32.szExeFile; 
  20.             break; 
  21.         } 
  22.     } while (Process32Next(hProcessSnap, &pe32)); 
  23.      
  24.     CloseHandle(hProcessSnap); 
  25.     return processName; 
  26. status = NtQueryInformationProcess( 
  27.     GetCurrentProcess(), 
  28.     ProcessBasicInformation, 
  29.     &processBasicInformation, 
  30.     sizeof(PROCESS_BASIC_INFORMATION), 
  31.     NULL); 
  32. std::wstring parentProcessName = GetProcessNameById((DWORD)processBasicInformation.InheritedFromUniqueProcessId); 
  33. if (L"devenv.exe" == parentProcessName) 
  34.     std::cout << "Stop debugging program!" << std::endl; 
  35.     exit(-1); 

怎样避开NtQueryInformationProcess搜查

避开长短常简朴的, NtQueryInformationProcess函数返回的值应该变动为那些不指示调试器存在的值:

1.将ProcessDebugObjectHandle配置为0

2.将ProcessDebugFlags配置为1

3.对付ProcessBasicInformation,将InheritedFromUniqueProcessId值变动为另一个历程ID,譬喻, Explorer.exe的

断点

断点,调试器的成果之一,可以让措施间断在必要的处所,从而利便其说明。两种范例的断点:

1.软件断点

2.硬件断点

在没有断点的环境下很难举办逆向工程,以是今朝风行的反逆向工程计策都是基于检测断点,然后提供一系列响应的反调试要领。

软件断点

在IA-32架构中,有一个特定的指令 – int 3h,带有0xCC操纵码,用于挪用调试句柄。当CPU执行该指令时,会发生间断并将节制传输到调试器。为了到达节制的目标,调试器必需将int 3h指令注入到代码中。要检测断点,我们可以计较函数的校验和。

  1. DWORD CalcFuncCrc(PUCHAR funcBegin, PUCHAR funcEnd) 
  2.     DWORD crc = 0; 
  3.     for (; funcBegin < funcEnd; ++funcBegin) 
  4.     { 
  5.         crc += *funcBegin; 
  6.     } 
  7.     return crc; 
  8. #pragma auto_inline(off) 
  9. VOID DebuggeeFunction() 
  10.     int calc = 0; 
  11.     calc += 2; 
  12.     calc <<= 8; 
  13.     calc -= 3; 
  14. VOID DebuggeeFunctionEnd() 
  15. }; 
  16. #pragma auto_inline(on) 
  17. DWORD g_origCrc = 0x2bd0; 
  18. int main() 
  19.     DWORD crc = CalcFuncCrc((PUCHAR)DebuggeeFunction, (PUCHAR)DebuggeeFunctionEnd); 
  20.     if (g_origCrc != crc) 
  21.     { 
  22.         std::cout << "Stop debugging program!" << std::endl; 
  23.         exit(-1); 
  24.     } 
  25.     return 0; 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读