特征码搜索算法继续优化_支持通配符_支持X86_X64_这次终于通过雷神表哥的测试认证!!!
首次分享特征码匹配思路跟源码: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 特征码[] = "890DPYGwgz00C1E10803CAwgzHNBC942";
相当于:
char 特征码[] = "890D??????00C1E10803CA??????C942";
当然,进行匹配前要记得用函数处理下空格哦,处理空格我没写进去
废话之后上图:
然后上VS2015直接工程打包C源码:
因为我自学易语言入门的编程_习惯保持了中文变量跟函数,
避免不少表哥看着蛋疼,还不如看汇编,所以再来一个编译好的EXE
支持楼主了,感谢分享了,收下了 {:lol:}
这方面的资料很少,特别是X64的 {:mad:}
直接编译不出来 更新一下:
会有搜索多个造成崩溃的情况,goto语句没用好的后遗症
加入单双数制表优化,为单双数匹配做的优化
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; size_t *JumpMidd = new size_t; intptr_t JumpTail;
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] = 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 > JumpValue) { JumpValue = JumpMidd; }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;
}
这个强,目前最快的特征码搜索算法。 买了三次哟,花了我26块大洋,不过很值得,哈哈 买了三次哟,花了我26块大洋,不过很值得,哈哈 有没有进程内存搜索带通配符的例子呀。*-