龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 6907|回复: 0

x64跨进程aob搜索源代码

[复制链接]

10

主题

1

回帖

15

积分

编程入门

Rank: 1

龙马币
40
速度的确很快,支持通配符,没啥需要注意的,读内存换成自己的就可以了,通配符调用例子:xxxx??xx

wow64ext真的超级好用啊!


  1. #pragma region FindSig
  2. #include<Windows.h>
  3. #include <vector>
  4. #include <Psapi.h>
  5. #include <iostream>
  6. #include "wow64ext.h"
  7. using namespace std;
  8. typedef unsigned long DWORD;
  9. typedef unsigned short WORD;
  10. typedef unsigned char BYTE;
  11. bool FHexCharValid(char c)
  12. {
  13.     if (c >= '0' && c <= '9' ||
  14.         c >= 'A' && c <= 'F' ||
  15.         c >= 'a' && c <= 'f' ||
  16.         c == '?')
  17.         return true;
  18.     else
  19.         return false;
  20. }
  21. bool FHexDecoder(char* Dec, char* Src)
  22. {
  23.     char HighC, LowC;
  24.     DWORD dwSrcLen = strlen(Src) / 2;
  25.     int i;
  26.     for (i = 0; i < dwSrcLen; i++) {
  27.         HighC = Src[i * 2], LowC = Src[i * 2 + 1];
  28.         if (!FHexCharValid(LowC) || !FHexCharValid(HighC))
  29.             return false;
  30.         HighC -= '0';
  31.         if (HighC > 9) HighC -= 7;
  32.         if (HighC > 0xf) HighC -= 0x20;
  33.         LowC -= '0';
  34.         if (LowC > 9) LowC -= 7;
  35.         if (LowC > 0xf) LowC -= 0x20;
  36.         Dec[i] = (HighC << 4) | LowC;
  37.     }
  38.     return true;
  39. }
  40. bool __SundayHexInit__(char* Sub, DWORD*p, char* HexSub, unsigned long dwSubLen)
  41. {
  42.     if (!FHexDecoder(HexSub, Sub)) {
  43.         return false;
  44.     }
  45.     DWORD i;

  46.     for (i = 0; i < 0x100; i++) {
  47.         p[i] = -1;
  48.     }

  49.     int WildAddr = 0;
  50.     for (i = 0; i < dwSubLen; i++) {
  51.         if (Sub[i * 2] == '?')
  52.             WildAddr = i;
  53.     }

  54.     for (i = WildAddr + 1; i < dwSubLen; i++) {                     //扫描Sub,初始化 P 表
  55.         p[(BYTE)HexSub[i]] = dwSubLen - i;
  56.     }

  57.     for (i = 0; i < 0x100; i++) {
  58.         if (p[i] == -1)
  59.             p[i] = dwSubLen - WildAddr;
  60.     }
  61.     return true;
  62. }
  63. int __SundayHex__(char* Src, unsigned long dwSrcLen, char* Sub, DWORD* p, char* HexSub, DWORD dwSubLen)
  64. {
  65.     //开始配对字符串
  66.     //j为 Sub位置指标, k为 当前匹配位置
  67.     DWORD j, k;
  68.     j = dwSubLen - 1;                                   //初始化位置为 dwSubLen - 1,匹配顺序为从右到左

  69.     bool bContinue = true;
  70.     bool bSuccess;
  71.     while (bContinue) {
  72.         bSuccess = true;
  73.         for (k = 0; k < dwSubLen; k++) {
  74.             if (Sub[(dwSubLen - k - 1) * 2] != '?' && Src[j - k] != HexSub[dwSubLen - k - 1]) {
  75.                 bSuccess = false;
  76.                 break;
  77.             }
  78.         }
  79.         if (bSuccess)
  80.             bContinue = false;
  81.         else {                                          //移动j指针
  82.             if (j < dwSrcLen - 1)                                                        //防止j+1 >= dwSrcLen造成溢出
  83.                 j += p[(BYTE)Src[j + 1]];
  84.             else j++;
  85.         }
  86.         if (j >= dwSrcLen)
  87.             break;
  88.     }
  89.     if (j < dwSrcLen)
  90.         return j - dwSubLen + 1;
  91.     else
  92.         return -1;
  93. }
  94. int __SundayHexV__(char* Src, unsigned long dwSrcLen, char* Sub, DWORD* p, char* HexSub, DWORD dwSubLen, int v)
  95. {
  96.     //开始配对字符串
  97.     //j为 Sub位置指标, k为 当前匹配位置
  98.     DWORD j, k;
  99.     j = dwSubLen - 1 + v;                                   //初始化位置为 dwSubLen - 1,匹配顺序为从右到左

  100.     bool bContinue = true;
  101.     bool bSuccess;
  102.     while (bContinue) {
  103.         bSuccess = true;
  104.         for (k = 0; k < dwSubLen; k++) {
  105.             if (Sub[(dwSubLen - k - 1) * 2] != '?' && Src[j - k] != HexSub[dwSubLen - k - 1]) {
  106.                 bSuccess = false;
  107.                 break;
  108.             }
  109.         }
  110.         if (bSuccess)
  111.             bContinue = false;
  112.         else {                                          //移动j指针
  113.             if (j < dwSrcLen - 1)                                                        //防止j+1 >= dwSrcLen造成溢出
  114.                 j += p[(BYTE)Src[j + 1]];
  115.             else j++;
  116.         }
  117.         if (j >= dwSrcLen)
  118.             break;
  119.     }
  120.     if (j < dwSrcLen)
  121.         return j - dwSubLen + 1;
  122.     else
  123.         return -1;

  124. }
  125. int SundayHex(char* Src, unsigned long dwSrcLen, char* Sub)
  126. {
  127.     DWORD dwSubLen = strlen(Sub);
  128.     if (dwSubLen % 2)                    //长度必须为2的倍数
  129.         return -1;
  130.     dwSubLen /= 2;

  131.     char* HexSub = new char[dwSubLen + 1];
  132.     DWORD* p = new DWORD[0x100];        //table P,标志距离
  133.     int i = -1;

  134.     if (__SundayHexInit__(Sub, p, HexSub, dwSubLen)) {


  135.         i = __SundayHex__(Src, dwSrcLen, Sub, p, HexSub, dwSubLen);
  136.     }

  137.     delete[]p;
  138.     delete[]HexSub;
  139.     return i;
  140. }
  141. vector< int> SundayHexV(char* Src, unsigned long dwSrcLen, char* Sub)
  142. {
  143.     vector< int> v;
  144.     DWORD dwSubLen = strlen(Sub);

  145.     if (dwSubLen % 2)                    //长度必须为2的倍数
  146.         return v;
  147.     dwSubLen /= 2;

  148.     char* HexSub = new char[dwSubLen + 1];
  149.     DWORD* p = new DWORD[0x100];        //table P,标志距离
  150.     int i = -1;



  151.     if (__SundayHexInit__(Sub, p, HexSub, dwSubLen)) {

  152.         i = __SundayHexV__(Src, dwSrcLen, Sub, p, HexSub, dwSubLen, 0);

  153.         while (i != -1)
  154.         {
  155.             v.push_back(i);
  156.             i = __SundayHexV__(Src, dwSrcLen, Sub, p, HexSub, dwSubLen, i + dwSubLen);

  157.         }

  158.     }

  159.     delete[]p;
  160.     delete[]HexSub;
  161.     return v;

  162. }
  163. DWORD64 __stdcall FindSig(const char* Value)
  164. {
  165.     vector <DWORD> 保存数组;
  166.     DWORD64 区段大小 = 0;
  167.     ULONG64 Start = 0, End = 0x7fffffffffffffff;
  168.     //if (dwPid == 0) return 保存数组;
  169.     MEMORY_BASIC_INFORMATION64 内存信息 = { 0 };


  170.     if (hFake1 != NULL)
  171.     {
  172.         while (VirtualQueryEx64(hFake1, Start, &内存信息, sizeof(内存信息)))
  173.         {
  174.             //cout << 内存信息.BaseAddress << endl;
  175.             if (内存信息.Protect != 1 && 内存信息.Protect != 16 && 内存信息.RegionSize != 1 && 内存信息.Protect != 512)
  176.             {

  177.                 区段大小 = (DWORD64)内存信息.BaseAddress + 内存信息.RegionSize - Start;
  178.                 //char tmpchar[255];
  179.                 //sprintf_s(tmpchar, "0x%I64x", 区段大小);
  180.                 //MessageBoxA(NULL, tmpchar, "Size", MB_OK);
  181.                 char* buf = new char[区段大小 + 1];
  182.                 if (ReadFast(Start, buf, 区段大小) == STATUS_SUCCESS)
  183.                 {
  184.                     vector<int>  dwValue = SundayHexV(buf, 区段大小, (char*)Value);
  185.                     for (size_t i = 0; i < dwValue.size(); i++)
  186.                     {
  187.                         //保存数组.push_back(Start + dwValue[i]);
  188.                         char tmpchar[255];
  189.                         sprintf_s(tmpchar, "0x%I64x", Start + dwValue[i]);
  190.                         MessageBoxA(NULL, tmpchar, "Result", MB_OK);
  191.                         return Start + dwValue[i];
  192.                     }
  193.                     //delete(buf);
  194.                 }
  195.                 //delete(buf);
  196.             }
  197.             if (End == 0) {
  198.                 break;
  199.             }

  200.             Start += 内存信息.RegionSize;
  201.             if (Start > End)
  202.                 break;
  203.         }
  204.         //CloseHandle(hProcess);
  205.     }

  206.     return 0;
  207. }
  208. #pragma endregion
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表