記憶體字串暴力搜尋定位程式碼
阿新 • • 發佈:2021-09-13
目錄
堅持兩字,簡單,輕便,但是真正的執行起來確實需要很長很長時間.當你把堅持兩字當做你要走的路,那麼你總會成功. 想學習,有問題請加群.群號:725864912(收費)群名稱: 逆向學習小分隊 群裡有大量學習資源. 以及定期直播答疑.有一個良好的學習氛圍. 涉及到外掛反外掛病毒 司法取證加解密 驅動過保護 VT 等技術,期待你的進入。
詳情請點選連結檢視置頂部落格 https://www.cnblogs.com/iBinary/p/7572603.html
記憶體字串暴力搜尋定位程式碼
其它優秀的字串搜尋程式碼:點選
使用說明:
一般都是四個引數,
引數1: 你要搜尋的緩衝區
引數2: 引數1緩衝區的大小
引數3: 要搜尋的字串
引數4: 引數3的緩衝大小
程式碼實現
search.h
#pragma once /* function: Boyer-Moore字元匹配演算法 Param: @text 要搜尋的緩衝區開始 @n 要搜尋的緩衝區大小 @pattern 需要匹配的字串 @m 需要匹配的字串長度 */ int BinarySearch(unsigned char *text, int n, unsigned char *pattern, int m);
.cpp實現
使用BinarySearch即可.
#pragma once #include "search.h" #define maxNum 256 #ifndef MIN # define MIN(A,B) ((A)<(B)?(A):(B)) #endif #ifndef MAX # define MAX(A,B) ((A)>(B)?(A):(B)) #endif void PreBmBc(unsigned char *pattern, int m, int bmBc[]) { int i; for (i = 0; i < 256; i++) {//一個字元佔八位,共256個字元,把所有字元都覆蓋到,這裡的初始化是將所有字元失配時的移動距離都賦值為m bmBc[i] = m; } for (i = 0; i < m - 1; i++) {//針對模式串pattern中存在的每一個字元,計算出它們最靠右的(非最後一個字元)地方距離串末尾的距離,即它們失配時該移動的距離,這一操作更新了初始化中一些字元的移動距離 bmBc[pattern[i]] = m - 1 - i; } } /* function: 舊版的好字尾輔助陣列(好字尾長度)求解方法 Param: @pattern 需要匹配的字串 @suff 好字尾輔助陣列 @m 需要匹配的字串長度 */ void suffix_old(char *pattern, int m, int suff[]) { int i, j; suff[m - 1] = m; for (i = m - 2; i >= 0; i--) { j = i; while (j >= 0 && pattern[j] == pattern[m - 1 - i + j]) j--; suff[i] = i - j; } } /* function: 新版的好字尾輔助陣列(好字尾長度)求解方法 Param: @pattern 需要匹配的字串 @suff 好字尾輔助陣列 @m 需要匹配的字串長度 */ void suffix(unsigned char *pattern, int m, int suff[]) { int f, g, i; suff[m - 1] = m; g = m - 1; for (i = m - 2; i >= 0; --i) { if (i > g&&suff[i + m - 1 - f] < i - g) suff[i] = suff[i + m - 1 - f]; else { if (i < g) g = i; f = i; while (g >= 0 && pattern[g] == pattern[g + m - 1 - f]) --g; suff[i] = f - g; } } } /* function: 好字尾陣列求解方法 Param: @pattern 需要匹配的字串 @bmGs 好字尾陣列 @m 需要匹配的字串長度 */ void PreBmGs(unsigned char *pattern, int m, int bmGs[]) { int i, j; int suff[maxNum]; // 計算字尾陣列 suffix(pattern, m, suff); // 先全部賦值為m,包含Case3 for (i = 0; i < m; i++) { bmGs[i] = m; } // Case2 j = 0; for (i = m - 1; i >= 0; i--) { if (suff[i] == i + 1) { for (; j < m - 1 - i; j++) { if (bmGs[j] == m) bmGs[j] = m - 1 - i; } } } // Case1 for (i = 0; i <= m - 2; i++) { bmGs[m - 1 - suff[i]] = m - 1 - i; } } /* function: Boyer-Moore字元匹配演算法 Param: @text 文字內容 @n 文字內容長度 @pattern 需要匹配的字串 @m 需要匹配的字串長度 */ int BinarySearch(unsigned char *text, int n, unsigned char *pattern, int m) { int * bmBc = new int[maxNum]; int * bmGs = new int[m]; PreBmBc(pattern, m, bmBc); PreBmGs(pattern, m, bmGs); int i, pos; pos = 0; while (pos <= n - m) { for (i = m - 1; i >= 0 && pattern[i] == text[i + pos]; i--); if (i < 0) { delete bmGs; delete bmBc; return &text[pos] - text; } else { pos += MAX(bmBc[text[i + pos]] - m + 1 + i, bmGs[i]); } } return -1; }
1.1 Boyer-Moore實現
上面的程式碼是有註釋,也是這個相同實現
void preBmBc(char *x, int m, int bmBc[]) { int i; for (i = 0; i < ASIZE; ++i) bmBc[i] = m; for (i = 0; i < m - 1; ++i) bmBc[x[i]] = m - i - 1; } void suffixes(char *x, int m, int *suff) { int f, g, i; suff[m - 1] = m; g = m - 1; for (i = m - 2; i >= 0; --i) { if (i > g && suff[i + m - 1 - f] < i - g) suff[i] = suff[i + m - 1 - f]; else { if (i < g) g = i; f = i; while (g >= 0 && x[g] == x[g + m - 1 - f]) --g; suff[i] = f - g; } } } void preBmGs(char *x, int m, int bmGs[]) { int i, j, suff[XSIZE]; suffixes(x, m, suff); for (i = 0; i < m; ++i) bmGs[i] = m; j = 0; for (i = m - 1; i >= 0; --i) if (suff[i] == i + 1) for (; j < m - 1 - i; ++j) if (bmGs[j] == m) bmGs[j] = m - 1 - i; for (i = 0; i <= m - 2; ++i) bmGs[m - 1 - suff[i]] = m - 1 - i; } void BM(char *x, int m, char *y, int n) { int i, j, bmGs[XSIZE], bmBc[ASIZE]; /* Preprocessing */ preBmGs(x, m, bmGs); preBmBc(x, m, bmBc); /* Searching */ j = 0; while (j <= n - m) { for (i = m - 1; i >= 0 && x[i] == y[i + j]; --i); if (i < 0) { OUTPUT(j); j += bmGs[0]; } else j += MAX(bmGs[i], bmBc[y[i + j]] - m + 1 + i); } }
1.2 簡化版Tuned Boyer-Moore
void TUNEDBM(char *x, int m, char *y, int n) {
int j, k, shift, bmBc[ASIZE];
/* Preprocessing */
preBmBc(x, m, bmBc);
shift = bmBc[x[m - 1]];
bmBc[x[m - 1]] = 0;
memset(y + n, x[m - 1], m);
/* Searching */
j = 0;
while (j < n) {
k = bmBc[y[j + m -1]];
while (k != 0) {
j += k; k = bmBc[y[j + m -1]];
j += k; k = bmBc[y[j + m -1]];
j += k; k = bmBc[y[j + m -1]];
}
if (memcmp(x, y + j, m - 1) == 0 && j < n)
OUTPUT(j);
j += shift; /* shift */
}
}
1.3 KMP
int attempt(char *y, char *x, int m, int start, int wall) {
int k;
k = wall - start;
while (k < m && x[k] == y[k + start])
++k;
return(k);
}
void KMPSKIP(char *x, int m, char *y, int n) {
int i, j, k, kmpStart, per, start, wall;
int kmpNext[XSIZE], list[XSIZE], mpNext[XSIZE],
z[ASIZE];
/* Preprocessing */
preMp(x, m, mpNext);
preKmp(x, m, kmpNext);
memset(z, -1, ASIZE*sizeof(int));
memset(list, -1, m*sizeof(int));
z[x[0]] = 0;
for (i = 1; i < m; ++i) {
list[i] = z[x[i]];
z[x[i]] = i;
}
/* Searching */
wall = 0;
per = m - kmpNext[m];
i = j = -1;
do {
j += m;
} while (j < n && z[y[j]] < 0);
if (j >= n)
return;
i = z[y[j]];
start = j - i;
while (start <= n - m) {
if (start > wall)
wall = start;
k = attempt(y, x, m, start, wall);
wall = start + k;
if (k == m) {
OUTPUT(start);
i -= per;
}
else
i = list[i];
if (i < 0) {
do {
j += m;
} while (j < n && z[y[j]] < 0);
if (j >= n)
return;
i = z[y[j]];
}
kmpStart = start + k - kmpNext[k];
k = kmpNext[k];
start = j - i;
while (start < kmpStart ||
(kmpStart < start && start < wall)) {
if (start < kmpStart) {
i = list[i];
if (i < 0) {
do {
j += m;
} while (j < n && z[y[j]] < 0);
if (j >= n)
return;
i = z[y[j]];
}
start = j - i;
}
else {
kmpStart += (k - mpNext[k]);
k = mpNext[k];
}
}
}
}
作者:IBinary 出處:https://www.cnblogs.com/iBinary/ 堅持兩字,簡單,輕便,但是真正的執行起來確實需要很長很長時間.當你把堅持兩字當做你要走的路,那麼你總會成功. 想學習,有問題請加群.群號:725864912(收費)群名稱: 逆向學習小分隊 群裡有大量學習資源. 以及定期直播答疑.有一個良好的學習氛圍. 涉及到外掛反外掛病毒 司法取證加解密 驅動過保護 VT 等技術,期待你的進入。
詳情請點選連結檢視置頂部落格 https://www.cnblogs.com/iBinary/p/7572603.html