开启左侧

C++特征码定位sunday算法最快

[复制链接]
发表于 2022-3-11 22:42:05 | 显示全部楼层 |阅读模式
本帖最后由 领会 于 2022-3-11 22:57 编辑

在原来基础上增加功能。主要用来查杀或者内存辅助定位数据使用。应该是目前最好用的。
1.这个直接支持x86x64项目工程,同时针对x86x64程序全面支持的。
2.教程直接用__NtWow64ReadVirtualMemory64相关内核函数进行内存读写定位数据
3.函数 X64ScanAddr,X64ScanBase,X64ScanCall可以定位基地址、虚拟地址、call数值、偏移等数据
讨论 QQ:2273545181 Q群:550839408

  1. 讨论 QQ:2273545181 Q群:550839408

  2. DWORD BaseRole = X64ScanBase(GetCurrentProcessId(), “83C4043BB3F00000008BC675EB”, L"moxia.exe", 19, 4);//==== 返回大小)


  3. //=========================内存搜索支持x86x64位游戏
  4. HMODULE NtdllModuleBase = NULL;
  5. NtdllModuleBase = GetModuleHandle("Ntdll.dll");
  6. if (NtdllModuleBase == NULL)
  7. {
  8. return FALSE;
  9. }
  10. __NtWow64ReadVirtualMemory64 = (LPFN_NTWOW64READVIRTUALMEMORY64)GetProcAddress(NtdllModuleBase,
  11. "NtWow64ReadVirtualMemory64");
  12. printf("__NtWow64ReadVirtualMemory64 %llx\n", (UINT64)__NtWow64ReadVirtualMemory64);
  13. __NtWow64WriteVirtualMemory64 = (LPFN_NTWOW64WRITEVIRTUALMEMORY64)GetProcAddress(NtdllModuleBase,
  14. "NtWow64WriteVirtualMemory64");
  15. return        TRUE;
  16. ===================================
  17. //查找内存地址
  18. INT64 X64ScanAddr(DWORD ProcessID, char *markCode, const wchar_t * ModuleName, DWORD offset)
  19. {
  20. DWORD size = 8; //==== 返回大小
  21. DWORD ordinal = 1;//====返回次数
  22. UINT64 beginAddr = GetX86X64Module(ProcessID, ModuleName);
  23. UINT64 endAddr = beginAddr + GetX86X64ModuleSize(ProcessID, ModuleName);
  24. return X64ScanOpcode(ProcessID, markCode, offset, size, ordinal, beginAddr, endAddr);
  25. }

  26. INT64 X64ScanBase(DWORD ProcessID, const char *markCode, const wchar_t * ModuleName, DWORD offset, DWORD size)//==== 返回大小)
  27. {
  28. DWORD ordinal = 1;//====返回次数
  29. INT64 BufferData = NULL; //
  30. //ULONG64 Len = size;
  31. UINT64 beginAddr = GetX86X64Module(ProcessID, ModuleName);
  32. UINT64 endAddr = beginAddr + GetX86X64ModuleSize(ProcessID, ModuleName);
  33. INT64 Addr_Ret = X64ScanOpcode(ProcessID, markCode, offset, size, ordinal, beginAddr, endAddr);
  34. HANDLE Hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);//打开进程
  35. __NtWow64ReadVirtualMemory64(Hprocess, Addr_Ret, &BufferData, size, 0);//注意返回值大小问题,size就是字节大小
  36. CloseHandle(Hprocess);
  37. return BufferData;
  38. }

  39. INT64 X64ScanCall(DWORD ProcessID, const char *markCode, const wchar_t * ModuleName, DWORD offset)//==== 返回大小)
  40. {
  41. DWORD ordinal = 1;//====返回次数
  42. DWORD size = 4;//x64的call只能是4字节的,不能8字节,否走要mov rax 0x1121212121 jmp rax
  43. INT64 BufferData = NULL;
  44. ULONG64 Len = size;
  45. UINT64 beginAddr = GetX86X64Module(ProcessID, ModuleName);
  46. UINT64 endAddr = beginAddr + GetX86X64ModuleSize(ProcessID, ModuleName);
  47. INT64 Addr_Ret = X64ScanOpcode(ProcessID, markCode, offset, size, ordinal, beginAddr, endAddr);
  48. HANDLE Hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);//打开进程
  49. __NtWow64ReadVirtualMemory64(Hprocess, Addr_Ret, &BufferData, size, &Len);//注意返回值大小问题,size就是字节大小
  50. CloseHandle(Hprocess);
  51. return Addr_Ret - 1 + 5 + BufferData;;
  52. }

  53. /************************************************************************/
  54. /* 函数说明:查找特征码
  55. /* process: 要查找的进程
  56. /* markCode: 特征码字符串,不能有空格
  57. /* distinct:特征码首地址离目标地址的距离 负数在特征码在上
  58. /* offset: 返回目标地址
  59. /* size: 设置返回数据为几个BYTE 1 2 3 4
  60. /* ordinal: 特征码出现的次数
  61. /* beginAddr: 开始搜索地址
  62. /* endAddr: 结束地址
  63. /* ret:返回目标地址的内容
  64. /************************************************************************/

复制代码
完整回复可见:

游客,如果您要查看本帖隐藏内容请回复


回复

使用道具 举报

发表于 2022-3-24 19:13:37 | 显示全部楼层
回复一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表