加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.cn/)- 云渲染、网络安全、数据安全、数据分析、人体识别!
当前位置: 首页 > 运营中心 > 建站资源 > 策划 > 正文

26种对付反调试的方法

发布时间:2019-03-22 07:05:21 所属栏目:策划 来源:luochicun
导读:目前主要有3种分析软件的方法: 1.数据交换分析,研究人员使用数据包嗅探工具来分析网络数据交换。 2.对软件的二进制代码进行反汇编,然后以汇编语言列出。 3.字节码解码或二进制解码,然后以高级编程语言重新创建源代码。 本文针对的是Windows操作系统中

该结构中最有趣的是InheritedFromUniqueProcessId字段。在这里,我们需要获取父进程的名称并将其与流行调试器的名称进行比较,以下是这种反调试检查的列表:

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

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

(编辑:常州站长网)

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

热点阅读