C 使用CRC32檢測記憶體映像完整性的實現步驟

2022-09-25 01:18:10 字數 1467 閱讀 6840

通常程式中至少包括了**段,資料段,而資料段中所儲存的資料是經常會發生變動的,例如我們的全域性變數,靜態變數等都會預設儲存在資料段,而**段則不會發生變化,我們在檢驗時只需要注重.text記憶體段中的資料完整性即可,針對記憶體的校驗同樣可以抵禦偵錯程式的cc斷點,該斷點原理就是在下端處寫入int3指令,同樣可以檢測得到。

校驗思路如下

1.首先從記憶體得到pe的**節的rva和節大小

2.根據得到的rva和節大小計算出crc32或是rc4值

3.讀取自身儲存的原始crc32值,與校驗結果進行比較

1.先來實現第一步,讀取記憶體映像的起始位址與大小,我們可以這樣做。

#include

#include

int main(int argc, char *ar**)

2.第二部就是計算校驗和,然後計算該節的crc32值,並存入全域性變數,也就是程式開啟後自動初始化計算一次記憶體crc32值並放入全域性變數中,然後開乙個執行緒,每三秒檢測一次記憶體變化,如果變化則終止執行或彈窗提示,你也可以提前計算處校驗和並寫入pe空缺位置。

#include

#include

dword crc32(byte* ptr, dword size)

crctable[i] = crctmp1;

} // 計算crc32值

dword crctmp2 = 0xffffffff;

while (size--)

return (crctmp2 ^ 0xffffffff);

}// 檢查記憶體中crc32特徵值

dword checkmemory()

int main(int argc,char *ar**)

system("pause");

return 0;

}上方**是保護了整個程式,在實際應用中,為了提高效率,有時我們只需要保護其中乙個片段**就好,這樣可以提高效率,所有我們對上面**稍作修改即可實現針對特定片段的記憶體校驗。

#include

#include

dword crc32(byte* ptr, dword size)

crctable[i] = crctmp1;

} // 計算crc32值

dword crctmp2 = 0xffffffff;

while (size--)

return (crctmp2 ^ 0xffffffff);

}// 檢查記憶體中crc32特徵值

dword checkmemory(dword va_程式設計客棧base, dword sec_len)

int main(int argc, char *ar**)

system("pause");

return 0;

}通過使用磁碟校驗結合記憶體校驗兩種方式綜合保護,可以極大的提高軟體的安全性,繞過方式則是找到哪兒跟全域性變數將其修正為正確的值即可,同樣的也可以更暴力一些直接將判斷條件改掉均可。

文章出處:

CRC32校驗 c實現

環境 vs2013 成功編譯並執行 include include include pragma warning disable 4996 這樣防止警告 dword crc32table 256 0x04 c1 1d b7 dword bitreverse dword poly 進行位顛倒 retu...

CRC32學習總結

這幾天一直在研究crc相關的知識,本來通訊網學習過相關的知識,但是比較淺。通過這幾天的尤其是今天的學習,我對於crc有了全新的認識。課本上主要著重介紹直接計算法,就是資料補零再和生成多項式做除法。這種方法利用迴圈來實現是比較容易的,但是在fpga中,想要利用硬體的併發性來實現crc的計算。最近一直在...

CRC32演算法實現

crc32 檢錯能力極強,開銷小,易於用編碼器及檢測電路實現。從其檢錯能力來看,它所不能發現的錯誤的機率僅為0.0047 以下。從效能上和開銷上考慮,均遠遠優於奇偶校驗及算術和校驗等方式。因而,在資料儲存和資料通訊領域,crc無處不在 著名的通訊協議x.25的fcs 幀檢錯序列 採用的是crc cc...