- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试用 C 编写一个快速简单的签名检测程序。它应该读取二进制文件(.exe、ELF、库等)并搜索二进制数据(有时是字符串,有时是字节);
我有一个简单的 C 测试程序:
#include <stdio.h>
#include <unistd.h>
const char *str = "TestingOneTwoThree";
int main()
{
while(1)
{
fprintf(stdout, "%s %ld\n", str, (long)getpid());
sleep(1);
}
}
这是我正在使用的 horspool 算法。我直接从此处找到的维基百科伪代码对其进行了改编:https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore%E2%80%93Horspool_algorithm
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HORSPOOL_COUNT 256
#define BLOCK_SIZE 1024
#define MAX(a, b) a > b ? a : b
ssize_t horspool_find(const char *buf, size_t buflen, const char *egg, size_t egglen)
{
int table[HORSPOOL_COUNT];
ssize_t shift = 0, i, tmp;
for(i = 0; i < HORSPOOL_COUNT; ++i)
{
table[i] = (int)egglen;
}
for(i = 0; i < egglen - 1; ++i)
{
table[(int)egg[i]] = egglen - i - 1;
}
while(shift <= buflen - egglen)
{
i = egglen - 1;
while(buf[shift + i] == egg[i])
{
if(i == 0)
{
return shift;
}
i--;
}
shift += MAX(1, table[(int)buf[shift + egglen - 1]]);
}
return -1;
}
char *readfile(const char *filename, size_t *size)
{
int ch;
size_t used = 0, allocated = 0;
char *buf = NULL, *tmp = NULL;
FILE *f;
if((f = fopen(filename, "rb")) == NULL)
{
if(size) *size = 0;
return perror("fopen"), NULL;
}
while((ch=fgetc(f)) != EOF)
{
if(used >= allocated)
{
allocated += BLOCK_SIZE;
tmp = realloc(buf, allocated);
if(tmp == NULL)
{
free(buf);
if(size) *size = 0;
fclose(f);
return perror("realloc"), NULL;
}
buf = tmp;
}
buf[used++] = (char)ch;
}
fclose(f);
if(size) *size = used;
return realloc(buf, used);
}
ssize_t naivealg_find(const char *buf, size_t buflen, const char *find, size_t findlen)
{
size_t i, j, diff = buflen - findlen;
for(i = 0; i < diff; ++i)
{
for(j = 0; j < findlen; ++j)
{
if(buf[i+j] != find[j])
{
break;
}
}
if(j == findlen)
{
return (ssize_t)i;
}
}
return -1;
}
int main()
{
size_t size;
char *buf = readfile("./a.out", &size);
char *pat = "TestingOneTwoThree";
ssize_t pos1 = horspool_find(buf, size, pat, strlen(pat));
ssize_t pos2 = naivealg_find(buf, size, pat, strlen(pat));
fprintf(stdout, "Offsets: %zd ~ %zd\n", pos1, pos2);
return 0;
}
输出是这样的:
偏移量:-1 ~ 2052
注意事项:
buf
和 egg
参数正常工作。最佳答案
代码使用了签名 char
并且对于二进制数据,有时会使用负索引进行错误索引。
// table[(int)buf[shift + egglen - 1]]
table[(unsigned char )buf[shift + egglen - 1]]
这个问题也存在于egg
模式。
// table[(int) egg[i]] = egglen - i - 1;
table[(unsigned char) egg[i]] = egglen - i - 1;
当 buflen < egglen
时出现其他标志问题
// while (shift <= buflen - egglen)
// change to avoid underflow
while (shift + egglen <= buflen)
还可以考虑以二进制方式打开文件,并且:
ssize_t shift,i; --> size_t shift,i;
int table[HORSPOOL_COUNT]; -- > size_t table[HORSPOOL_COUNT];
添加()
s 至 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
关于c - 为什么 Horspool 不适用于二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47723032/
这是一个家庭作业问题。我有一个java程序来计算某个模式/字符串是否在用户输入的文本字符串中。该程序可以运行,但始终输出 -1,如果模式字符串不在指定文本中,则应输出 -1。我一生都无法找出什么地方不
我已经在 C++ 中实现了 Horspool 算法(取决于 Anany Levitin 的算法设计和分析简介,第 2 版,第 258 页)用于找到所需模式在文本中第一次出现的位置。但是,我想扩展算法以
我正在尝试用 C 编写一个快速简单的签名检测程序。它应该读取二进制文件(.exe、ELF、库等)并搜索二进制数据(有时是字符串,有时是字节); 我有一个简单的 C 测试程序: #include #i
请给我一些资源来理解 Horspool 字符串搜索算法。 请简述匹配表的构建过程和主要算法。 我已经在 Google 搜索中浏览了 29 页以找到一个很好的解释,但没有成功。 最佳答案 Horspoo
我想获得 Boyer-Moore-Horspool 实现来搜索文本文件中的某些字符串。这是我的代码: #include #include #include int bmhSearch(char
您会使用哪种算法来搜索短文本中的短子字符串?简而言之,我的意思是子字符串有 5-10 个字符,字符串有 255 个字符。我正在考虑根据输入数据长度选择算法。哪种算法更适合较长的输入? 最佳答案 尝试
这是我对 BMH 算法的实现(它工作起来很神奇): public static Int64 IndexOf(this Byte[] value, Byte[] pattern) { if (v
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我已经用后向指针编写了一个 Earley 解析器,但它不能很好地处理可空语法。我还实现了 Aycock & Horspool 2002 的解决方案,如果它可为空,则使 PREDICT 跳过非终结符标记
我是一名优秀的程序员,十分优秀!