模拟CRC达到反调试的目的

 模拟CRC达到反调试的目的

该技术原理很简单,就开启一个线程,不断读取内存代码断中的字节,然后进行校对,当发现校对不一致时,直接退出,达到反调试的目的。

#include<stdio.h>
#include<iostream>
#include<Windows.h>
#include<stdlib.h>
using namespace std;

int gTotal; // 校验总和

DWORD WINAPI ThreadFunc(LPVOID lpParam)
{
    // 循环监测线程
    while (true) {
        int address = 0x0411000;
        int xTotal = 0;
        CreateThread(NULL, 0, ThreadFunc, 0, 0, 0);
        for (int i = 0; i < 0x6000; i++) {
            byte Byte;
            ReadProcessMemory((HANDLE)-1, (PVOID)address, &Byte, 1, NULL);
            xTotal += Byte;
            address++; // 读取成功往后读取一个地址
        }
        // 当监测不达标时,退出
        if (xTotal != gTotal) {
            exit(0);
        }
        Sleep(1000); // 暂停1s之后,避免太卡
    }
    return 0;
}
int main(int argc, char* argv[]) {
    
    int address = 0x0411000;

    // 先来计算出校验总和
    for (int i = 0; i < 0x6000; i++) {
        byte Byte;
        ReadProcessMemory((HANDLE)-1, (PVOID)address, &Byte, 1, NULL);
        gTotal += Byte;
        address++; // 读取成功往后读取一个地址
    }

    // 先来计算出校验总和
    CreateThread(NULL, 0, ThreadFunc, 0, 0, 0);

    // 暂停线程
    system("pause");

}
原文地址:https://www.cnblogs.com/onetrainee/p/12127184.html