我們可以通過使用CRC32算法計算出程序的CRC字節,並將其寫入到PE文件的空缺位置,這樣當程序再次運行時,來檢測這個標志,是否與計算出來的標志一致,來決定是否運行程序,一旦程序被打補丁,其crc32值就會發生變化,一旦發生變化,程序就廢了,繞過的方式則是,1.動態打補丁,2.找到crc32算法位置將跳轉nop掉,3.直接手動計算出crc32並覆蓋到原始程序的crc算法位置。
對文件的CRC32檢測
PE頭,前面有非常多的無效空間,可以供我們使用,crc32地址應該反寫。
另一種通過使用 MapFileAndCheckSum 實現的反破解,先來修改一下C++編譯器配置,使其能夠支持
C/C++ -> 常規 -> 調試信息格式 --> 程序數據庫
連接器 -> 常規 -> 啟用增量鏈接 -> 否
連接器-> 高級 ->設置校驗和 ->是
主程序檢測程序如下。
對磁盤的CRC32檢測
對磁盤完整性檢測只能防止文件被修改,但無法防止內存補丁,下面的代碼將可以檢測內存變化,如果內存被打補丁,則會退出執行。
原理是,定位到.text節首地址,然后計算該節的CRC32值,並存入全局變量,然后開一個線程進行循環檢測,一旦發生變化,則立即讓程序報廢。部分代碼片段。
上方代碼是保護了整個程序,在實際應用中,有時我們只需要保護其中一個片段代碼就好,這樣可以提高效率,所有我們對上面代碼稍作修改即可實現針對特定片段的內存校驗.