天马阁

 找回密码
 立即注册
                                        →→→→→→→→→→→→ 1点击查看所有VIP教程目录长列表(总教程数269个) 2办理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实现原理及防护思路 30课完结
64驱?封? 9 64反驱? 10 64位V? 11 绝? 12 ???课?
13 64透 ? 14 64U ? 15 64Q ? 16 64功 ?
17 64U ? 18 64模 ? 19 64多 ? 20 64网 ?
21 64注 ? 22 64火 ? 23 64棋 ? 24 64自二链L?
25 64破 ? VIP会员办理QQ: 89986068   
【请先加好友,然后到好友列表双击联系客服办理,不然可能无法接受到信息。】
27 加入2000人交流群637034024 3 28 免责声明?
查看: 1147|回复: 0

C++实现的完整aobscan特征码搜索,采用Sunday算法,速度极快。

[复制链接]

11

主题

1

回帖

14

积分

编程入门

Rank: 1

天马币
22
发表于 2024-3-3 09:25:01 | 显示全部楼层 |阅读模式
C++实现的完整aobscan特征码搜索,采用Sunday算法,速度极快。

完整的aobscan实现,我在搜索部分使用了一个高速搜索算法。


  1. #include <windows.h>
  2. #include <Psapi.h>
  3. #include <stdio.h>
  4. #include <time.h>

  5. /*这是一个很低效的算法*/
  6. unsigned char *memstr(char * dst , int dst_len, char *src , int src_len )
  7. {
  8.     int i;
  9.     char *cp = src;
  10.     if (src_len < dst_len)
  11.     {
  12.         return NULL;
  13.     }
  14.     for (i = 0; i <= src_len - dst_len; i++)
  15.     {
  16.         if (memcmp(cp , dst , dst_len) == 0)
  17.         {
  18.             return (unsigned char *)cp;
  19.         }
  20.         cp++;
  21.     }
  22.     return   NULL;
  23. }

  24. /*sunday算法*/
  25. #define MAX_CHAR_SIZE 257
  26. long *setCharStep(const unsigned char *subStr, long subStrLen)
  27. {
  28.     long i;
  29.     static long charStep[MAX_CHAR_SIZE];
  30.     for (i = 0; i < MAX_CHAR_SIZE; i++)
  31.         charStep[i] = subStrLen + 1;
  32.     for (i = 0; i < subStrLen; i++)
  33.     {
  34.         charStep[(unsigned char)subStr[i]] = subStrLen - i;
  35.     }
  36.     return charStep;
  37. }
  38. /*
  39.    算法核心思想,从左向右匹配,遇到不匹配的看大串中匹配范围之外的右侧第一个字符在小串中的最右位置
  40.    根据事先计算好的移动步长移动大串指针,直到匹配
  41. */
  42. long sundaySearch(const unsigned char *mainStr, const unsigned char *subStr, long *charStep, long mainStrLen, int subStrLen)
  43. {
  44.     long main_i = 0;
  45.     long sub_j = 0;
  46.     while (main_i < mainStrLen)
  47.     {
  48.         //保存大串每次开始匹配的起始位置,便于移动指针
  49.         long tem = main_i;
  50.         while (sub_j < subStrLen)
  51.         {
  52.             if (mainStr[main_i] == subStr[sub_j])
  53.             {
  54.                 main_i++;
  55.                 sub_j++;
  56.                 continue;
  57.             }
  58.             else
  59.             {
  60.                 //如果匹配范围外已经找不到右侧第一个字符,则匹配失败
  61.                 if (tem + subStrLen > mainStrLen)
  62.                     return -1;
  63.                 //否则 移动步长 重新匹配
  64.                 unsigned char firstRightChar = mainStr[tem + subStrLen];
  65.                 main_i += charStep[(unsigned char)firstRightChar];
  66.                 sub_j = 0;
  67.                 break; //退出本次失败匹配 重新一轮匹配
  68.             }
  69.         }
  70.         if (sub_j == subStrLen)
  71.             return main_i - subStrLen;
  72.     }
  73.     return -1;
  74. }

复制代码


  1. unsigned char getHex(unsigned char hex)
  2. {
  3.     if (hex >= '0' && hex <= '9') return hex - '0';
  4.     if (hex >= 'A' && hex <= 'F') return hex - 'A' + 10;
  5.     if (hex >= 'a' && hex <= 'f') return hex - 'a' + 10;
  6.     return 0;
  7. }
  8. int GetHexValue(char *src)
  9. {
  10.     int i, j, flag;
  11.     static char temp[1024];
  12.     for (i = 0, j = 0; src[i] != 0; i++)
  13.     {
  14.         if ((src[i] <= 'F' && src[i] >= 'A') || (src[i] <= 'f' && src[i] >= 'a') || (src[i] <= '9' && src[i] >= '0'))
  15.         {
  16.             if (src[i] != ' ')
  17.             {
  18.                 temp[j++] = src[i];
  19.             }
  20.         }
  21.     }
  22.     temp[j] = 0;
  23.     src[0] = 0;
  24.     for (i = 0, j = 0, flag = 1; temp[i] != 0; i++)
  25.     {

  26.         char ch = getHex(temp[i]);
  27.         if (ch != -1)
  28.         {
  29.             if (flag == 1) src[j] = ch << 4;
  30.             else src[j++] += ch;
  31.             flag *= -1;
  32.         }
  33.     }
  34.     src[j] = 0;
  35.     return j;
  36. }
  37. DWORD ReadPage(HANDLE m_hProcess, DWORD dwBaseAddr, char* Value)
  38. {
  39.     //读取1页内存
  40.     BYTE arBytes[4096];
  41.     if (!::ReadProcessMemory(m_hProcess, (LPVOID)dwBaseAddr, arBytes, 4096, NULL))
  42.     {
  43.         //此页不可读
  44.         return (DWORD) - 1;
  45.     }
  46.     else
  47.     {
  48.         //
  49.         //unsigned char key[] = {0x80, 0x7f, 0x49, 0x00};
  50.         unsigned char Value2[1024];
  51.         strcpy((char*)Value2, Value);
  52.         int len = GetHexValue((char*)Value2);
  53.         //getchar();
  54.         //注释这两行是低效的算法
  55.         //char key[] = {0x80, 0x7f, 0x49, 0x00};
  56.         //int len = 4;
  57.         //if (memstr(key, len, (char*)arBytes, 4096) != 0) return memstr(key, len, (char*)arBytes, 4096) - (unsigned char*)arBytes;
  58.         //else return -1;

  59.         //开始sunday算法
  60.         long *charStep = setCharStep(Value2, len);
  61.         return sundaySearch(arBytes, Value2, charStep, 4096, len);
  62.     }
  63.     return (DWORD) - 1;    //不会执行到此处
  64. }

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

回复

使用道具 举报

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

本版积分规则

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