登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 81|回复: 1

简单的内存特征码暴力搜索支持 ?? F? ?F

[复制链接]

59

主题

-6

回帖

72

积分

网站编辑

积分
72
发表于 6 天前 | 显示全部楼层 |阅读模式
①通过掩码的方式使其支持 前、中、后通配符 及半字节;
②通过SSE2指令集找到特征码字节序列中的第一个不为'??'的元素后,后续的字节只比较不是'??'的特征字节,优化比较字节数。

  1. #include <iostream>
  2. #include <windows.h>

  3. int main()
  4. {
  5.     //模拟内存中的字节数据
  6.     BYTE MemByte[] = { 0x33, 0xC9, 0x89, 0x0D, 0xB4, 0x67, 0x92, 0x77, 0x89, 0x0D, 0xB8, 0x67, 0x92, 0x77, 0x88, 0x08, 0x38, 0x48, 0x02, 0x74, 0x05, 0xE8, 0x94, 0xFF, 0xFF, 0xFF, 0x33, 0xC0, 0xC3, 0x8B, 0xFF, 0x55, 0x8B, 0xEC, 0x83, 0xE4, 0xF8 };

  7.     //特征码为:?9 ?? 0? ?? 67
  8.     //会处理成:F9 FF 0F FF 67 进行匹配
  9.     std::string pattern = "?9 ?? 0? ?? 67";
  10.     int index = 0;
  11.     while ((index = pattern.find(' ', index)) >= 0) pattern.erase(index, 1); //去除特征码所有空格
  12.     size_t len = pattern.length() / 2; //计算特征码长度
  13.     size_t nFirstMatch = len;  // 跳过头部??,记录第一次匹配的位置半字符或非??,用于优化搜索
  14.     BYTE* pMarkCode = new BYTE[len];  // 存储转换后的特征码字节
  15.     BYTE* pWildcard = new BYTE[len];  // 存储特征字符串中??、?(??=FF、?=F、非?=0) 通配符

  16.     //处理特征码字符串,转换成字节数组
  17.     for (size_t i = 0; i < len; i++)
  18.     {
  19.         std::string tmpStr = pattern.substr(i * 2, 2);
  20.         if ("??" == tmpStr) // 是"??"的特征字符
  21.         {
  22.             tmpStr = "FF";
  23.             pWildcard[i] = 0xFF;
  24.         }
  25.         else  // 不是"??"的特征字符
  26.         {
  27.             if ('?' == tmpStr[0]) // 左半字节为'?'
  28.             {
  29.                 tmpStr[0] = 'F';
  30.                 pWildcard[i] = (0xF << 4);
  31.             }
  32.             else if ('?' == tmpStr[1]) // 右半字节为'?'
  33.             {
  34.                 tmpStr[1] = 'F';
  35.                 pWildcard[i] = 0xF;
  36.             }
  37.             else
  38.             {
  39.                 pWildcard[i] = 0x0;
  40.             }
  41.             if (nFirstMatch == len) nFirstMatch = i;
  42.         }

  43.         pMarkCode[i] = strtoul(tmpStr.c_str(), nullptr, 16);
  44.     }

  45.     //搜索内存,匹配特征码算法
  46.     for (size_t m = 0; m < sizeof(MemByte); ++m)
  47.     {
  48.         if (!((MemByte[m] | pWildcard[nFirstMatch]) ^ pMarkCode[nFirstMatch])) //匹配上第一个字节
  49.         {
  50.             size_t offset = m - nFirstMatch; //记录偏移量
  51.             for (size_t n = nFirstMatch; n < len; ++n) //匹配后续字节
  52.             {
  53.                 if (offset > sizeof(MemByte) - len) break; //超出内存范围
  54.                 if (pWildcard[n] != 0xFF)  //后续字节是"??"的通配符,跳过,这句代码可以优化搜索
  55.                     if ((MemByte[offset + n] | pWildcard[n]) ^ pMarkCode[n]) break; //匹配失败
  56.                 if (n + 1 == len) //匹配成功
  57.                 {
  58.                     printf("%Ix\n", MemByte[m - nFirstMatch]);
  59.                 }
  60.             }
  61.         }
  62.     }
  63.     system("pause");
  64.     return 0;
  65. }
复制代码


0

主题

67

回帖

99

积分

注册会员

积分
99
发表于 5 天前 | 显示全部楼层
学习一下,谢谢!!
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|断点社区 |网站地图

GMT+8, 2025-2-22 17:01 , Processed in 0.162375 second(s), 26 queries .

Powered by XiunoBBS

Copyright © 2001-2025, 断点社区.

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