飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 13249|回复: 26

[C/C++] 特征码搜索算法继续优化_支持通配符_支持X86_X64_这次终于通过雷神表哥的测试认证!!!

  [复制链接]
  • TA的每日心情
    无聊
    2023-3-14 21:31
  • 签到天数: 74 天

    [LV.6]常住居民II

    发表于 2017-12-6 20:16:20 | 显示全部楼层 |阅读模式
    首次分享特征码匹配思路跟源码:
    https://www.chinapyg.com/thread-98861-1-1.html

    进行匹配失败的优化加入_注意:雷神表哥测试结果表明_优化失败的作品
    https://www.chinapyg.com/thread-98936-1-1.html

    历程:
    经过几天学习KMP 跟sunday的匹配思路,
    其实就真正理解了sunday的思路,KMP半懂而已

    _学习路上特别感谢雷神表哥一路随行....

    这一次:

    依旧不便的匹配思路:
    先首尾匹配,后分段_目前单双数匹配

    然后依旧不变制表思路:
    1,匹配尾部,不成功就看尾部前面是否有相同的,有就相同多少个,跳过多少个
    2,如果尾部匹配,那么就看尾部这个在前面是否出现过,不出现,任意地方不匹配,跳这个特征码长度
    3,为了防止第二种说法存在问题,每个特征码的跟前面的对比是否出现过,计算距离来做跳板表

    然后_加入sunday的思想_
    把整体代码框架继续优化(关键的关键,这里耗费了好多心力)
    感谢群里的表哥提供一份C写法很666的代码,让我学习,把整体代码写的更优化
    这次写的C终于看起来帅气了

    本框架支持不是00-ff的字符,就会当作通配符_成对哦
    支持X64 X86直接编译_支持花式装逼特征码:

    char 特征码[] = "890D  PYGwgz  00C1E10803CA  wgzHNB  C942";
    相当于:
    char 特征码[] = "890D  ??????  00C1E10803CA  ??????  C942";

    当然,进行匹配前要记得用函数处理下空格哦,处理空格我没写进去


    废话之后上图:
    做表.jpg
    匹配.jpg


    然后上VS2015直接工程打包C源码:
    人生苦短,我要睡觉.rar (11.26 KB, 下载次数: 160, 售价: 10 枚飘云币)


    因为我自学易语言入门的编程_习惯保持了中文变量跟函数,
    避免不少表哥看着蛋疼,还不如看汇编,所以再来一个编译好的EXE
    代码调试_编译好的exe程序.rar (90.76 KB, 下载次数: 113)


    评分

    参与人数 6威望 +22 飘云币 +26 收起 理由
    slzslz + 1 + 1 很有用
    610100 + 1 + 1 赞一个,这个帖子很给力!
    azahod -4 本来打算威望-1,P币+1的,发现没P币,我是.
    gagmeng + 20 + 20 表哥就是溜啊
    speedboy + 4 PYG有你更精彩!
    Master.lu + 4 感谢发布原创作品!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 956 天

    [LV.10]以坛为家III

    发表于 2017-12-7 08:30:29 | 显示全部楼层

    支持楼主了,感谢分享了,收下了
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    7 小时前
  • 签到天数: 2163 天

    [LV.Master]伴坛终老

    发表于 2017-12-7 09:14:01 | 显示全部楼层

    这方面的资料很少,特别是X64的
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    7 小时前
  • 签到天数: 2163 天

    [LV.Master]伴坛终老

    发表于 2017-12-7 09:23:20 | 显示全部楼层

    直接编译不出来
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2023-3-14 21:31
  • 签到天数: 74 天

    [LV.6]常住居民II

     楼主| 发表于 2017-12-7 12:49:59 | 显示全部楼层
    更新一下:
    会有搜索多个造成崩溃的情况,goto语句没用好的后遗症
    加入单双数制表优化,为单双数匹配做的优化


    人生苦短,我要睡觉.rar

    7.48 KB, 下载次数: 100, 下载积分: 飘云币 -2 枚

    售价: 8 枚飘云币  [记录]

    点评

    在顺表哥的基础上翻译成英文 size_t TextLen(char *Text) { char *queryp= Text; while (*queryp) { queryp++; } return queryp - Text; } int ChToNum(char* 字符) { //判断是否0-9的字符 if  详情 回复 发表于 2017-12-7 13:26

    评分

    参与人数 2威望 +5 飘云币 +1 收起 理由
    610100 + 1 + 1 赞一个,这个帖子很给力!
    azahod + 4 回血

    查看全部评分

    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-8 19:52
  • 签到天数: 461 天

    [LV.9]以坛为家II

    发表于 2017-12-7 13:26:24 | 显示全部楼层
    huangyushun 发表于 2017-12-7 12:49
    更新一下:
    会有搜索多个造成崩溃的情况,goto语句没用好的后遗症
    加入单双数制表优化,为单双数匹配做的优 ...

    在顺表哥的基础上翻译成英文
    size_t TextLen(char *Text)
    {
    char *queryp= Text;
    while (*queryp)
    {
      queryp++;
    }
    return queryp - Text;
    }
    int ChToNum(char* 字符)
    {
    //判断是否0-9的字符
    if (*字符 <= '9') { if (*字符 >= '0') { return *字符 - '0'; } }
    //判断是否A-F的字符
    else if (*字符 <= 'F') { if (*字符 >= 'A') { return *字符 - 'A' + 10; } }
    //判断是否a-f的字符
    else if (*字符 <= 'f') { if (*字符 >= 'a') { return *字符 - 'a' + 10; } }
    //失败返回【-1】
    return -1;
    }
    int TextToHex(char* Text)
    {
    int Ten = NULL, Abit = NULL; Ten = ChToNum(Text++); Abit = ChToNum(Text);
    if (Abit == -1 || Ten == -1) { return -1; } return Ten * 16 + Abit;
    }

    size_t SearchPattern(char *Saddr, size_t SLen, char *Pattern, size_t *AddrArra, intptr_t ResultNum = -1)
    {
    size_t PatternLen = TextLen(Pattern), QueryLen = PatternLen / 2, ArraLen = NULL; bool Correct  = false;
    intptr_t ISub = NULL, JumpValue = QueryLen; intptr_t FQ = QueryLen - 1, LRecord  = NULL, HexPattern = NULL;
    intptr_t *QueryByte = new intptr_t[QueryLen]; size_t *JumpMidd = new size_t[QueryLen]; intptr_t JumpTail[256];

    for (size_t i = 0; i < PatternLen; i += 2)
    {
      HexPattern = TextToHex(Pattern + i);
      if (HexPattern == -1) { JumpValue = QueryLen - i / 2; }
      *QueryByte++ = (intptr_t)HexPattern;
    }

    QueryByte -= QueryLen;

    for (intptr_t i = 0; i < 256; i++) { JumpTail = JumpValue; }

    ISub = 1;
    SubSection:
    JumpValue = 1;
    for (size_t i = ISub; i < QueryLen; i += 2)
    {
      
      if (QueryByte != -1) { JumpTail[QueryByte] = QueryLen - i; }
      
      LRecord  = i; Correct  = false;
      while (LRecord --)
      {
       
       if (*(QueryByte + LRecord ) == -1 || *(QueryByte + i) == *(QueryByte + LRecord ))
       {
        *(JumpMidd + i) = i - LRecord ;
        JumpValue = i - LRecord ; Correct  = true;
       }
      }
      if (!Correct ) { JumpValue = i; *(JumpMidd + i) = i; }
    }
    if (ISub-- > 0) { goto SubSection; }

    for (size_t i = 0; i < SLen && ResultNum;)
    {
    SerarhNext:
      
      JumpValue = JumpTail[(intptr_t)*(Saddr + i + FQ + 1) & 0xff];
      
      if (*(Saddr + i + FQ) != *(char *)(QueryByte + FQ)) { goto MatchError; }
      
      ISub = 1;
      
    MatchLoop:
      for (size_t n = ISub; n < FQ; n += 2)
      {
       if (*(QueryByte + n) != -1 && *(char *)(QueryByte + n) != *(Saddr + i + n))
       {
        if (n > JumpValue && JumpMidd[n - 2] > JumpValue) { JumpValue = JumpMidd[n - 2]; }goto MatchError;
       }
      }
      if (ISub-- > 0) { goto MatchLoop; }
      
      *AddrArra++ = (size_t)(Saddr + i); ArraLen++; ResultNum--; i += QueryLen;
      if (i < SLen && ResultNum) { goto SerarhNext; }
    MatchError:
      i += JumpValue;
    }
    delete[] JumpMidd; delete[] QueryByte;  return ArraLen;
    }


    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-7-6 21:16
  • 签到天数: 37 天

    [LV.5]常住居民I

    发表于 2017-12-7 17:05:40 来自手机 | 显示全部楼层
    这个强,目前最快的特征码搜索算法。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-4-1 09:59
  • 签到天数: 76 天

    [LV.6]常住居民II

    发表于 2017-12-7 21:28:17 | 显示全部楼层
    买了三次哟,花了我26块大洋,不过很值得,哈哈
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-4-1 09:59
  • 签到天数: 76 天

    [LV.6]常住居民II

    发表于 2017-12-7 21:28:21 | 显示全部楼层
    买了三次哟,花了我26块大洋,不过很值得,哈哈
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2024-3-4 19:29
  • 签到天数: 653 天

    [LV.9]以坛为家II

    发表于 2017-12-8 22:29:35 | 显示全部楼层
    有没有进程内存搜索带通配符的例子呀。*-
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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