[原创]超简单的特征码搜索算法以及DEMO.更新:加入对DUMP文件的支持
1.1
针对有保护的游戏.无法OPENPROCESS的情况.加入对DUMP文件的支持.
我就偷个懒了.DUMP文件自行使用XT获取...
感谢kuty的提示.
DEMO在附件.
DEMO里最后显示的偏移是 CALL的地址-主模块的地址.现在游戏不少是动态的.不是固定的00400000
使用时自行配置特征码.例子在配置文件里.
格式:
名字\类型\偏移\特征码
类型是CALL就取指针.是数据就取指针的值.
支持带??的模糊搜索.
以下都是废话.拿了工具赶紧去祸害吧...
一般些特征码搜索算法,比如我要匹配这段
子串 A
53 56 57 89 65
文本 B
54 4F D3 02 70 56 FA 0A C8 53 56 57 89 65 EC C7 45 F0 AD 76 16 A4 33
无脑的做法就是
A[I] <> B[I]
B++
然后接着来.
总体来说特征码匹配大致都差不多.网上大把的KMP BM等算法最大的差别其他就是 '移动量' 的区别.也就是B++;
实际中搜索特征码.不可能把读取一大堆内存数据,然后转为字符串.
频繁访问内存太影响效率.
我们匹配时.一般读取与特征码等长的字段减少对内存的访问.
53 56 57 89 65 54 4F D3 02 70
第一个字节就已经不相等了.
A的第一个的字节是53.我们发现B与A等长的字串里面并没有53,
这时候我们可以B=B+lenght(子串 A);
也就是说.第二次的对比.将从
56 FA 0A C8 53 56 57 89 65 EC C7 45 F0 AD 76 16 A4 33
这里开始
这时候特征码越长.搜索的时间越短!
OK,算法很简单的优化了.接下来看搜索范围.
难道暴搜整片内存?00400000-7FFFFFFF
当然不了.参考OD的内存映射.获取代码段真让人愉悦.
然后GetModuleHandle来获取基址.
使用VirtualQueryEx函数来查询.用BaseAddress成员来对比下OK.
推荐一篇文件:http://blog.csdn.net/v_july_v/article/details/7041827
