首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言在二進制文件中搜索特定字節序列的代碼實現

     編輯:程式設計綜合問答

核心邏輯

讀取文件到內存緩衝區,使用 memmem (GNU 擴展) 或手寫二進制安全查找。

#include 
#include 
#include 

// 簡易 memmem 實現 (不依賴 GNU)
void* memmem(const void* haystack, size_t haystack_len, const void* needle, size_t needle_len) {
    if (needle_len == 0) return (void*)haystack;
    const unsigned char* h = haystack;
    const unsigned char* n = needle;
    for (size_t i = 0; i <= haystack_len - needle_len; ++i) {
        if (h[i] == n[0] && memcmp(h + i, n, needle_len) == 0)
            return (void*)(h + i);
    }
    return NULL;
}

int main() {
    const unsigned char pattern[] = {0x89, 0x90, 0x91};
    FILE* f = fopen("c:\\1.exe", "rb");
    fseek(f, 0, SEEK_END);
    long len = ftell(f);
    fseek(f, 0, SEEK_SET);
    unsigned char* buf = malloc(len);
    fread(buf, 1, len, f);
    fclose(f);

    void* pos = memmem(buf, len, pattern, sizeof(pattern));
    if (pos) {
        printf("Found at offset: 0x%lX\n", (unsigned char*)pos - buf);
    } else {
        printf("Not found\n");
    }
    free(buf);
    return 0;
}

大文件優化

  • 分塊讀取 (如 4KB) + 滑動窗口,避免一次性載入巨大文件。
  • 使用 Boyer-Moore / KMP 算法加速多模式匹配。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved