通常程式中至少包括了**段,資料段,而資料段中所儲存的資料是經常會發生變動的,例如我們的全域性變數,靜態變數等都會預設儲存在資料段,而**段則不會發生變化,我們在檢驗時只需要注重.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...