我可以使用ASM阻止程序吗?

时间:2015-01-10 09:47:08

标签: c++ assembly

我正在尝试几天阻止我的游戏作弊程序,我与几个程序员交谈,一个说我可以使用ASM阻止它。该程序隐藏得很好,我在内存中找不到它,我无法检测到它的扫描过程,所以也许这可能是解决方案?有人能给我一个例子,我如何使用c ++和ASM检测和阻止程序?

这是我目前使用内存转储来检测和阻止作弊的方法:

void SystemProcessesScan() 
{
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if(hProcessSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 pe32;
        pe32.dwSize = sizeof(PROCESSENTRY32);

        if(Process32First(hProcessSnap, &pe32))
        {
            do
            {
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
                if(hProcess != NULL)
                {
                    if(ScanProcessMemory(hProcess))
                    { 
                        ExitProcess(0);
                    }
                }
            }

            while(Process32Next(hProcessSnap, &pe32));
        }
    }

    CloseHandle(hProcessSnap);
}

bool ScanProcessMemory(HANDLE hProcess) 
{
    for(int i = 0; i < MAX_PROCESS_DUMP; i++)
    {
        char aTmpBuffer[MAX_DUMP_SIZE];
        SIZE_T aBytesRead = 0;
        ReadProcessMemory(hProcess, (LPCVOID)g_ProcessesDumps[i].m_aOffset, (LPVOID)aTmpBuffer, sizeof(aTmpBuffer), &aBytesRead);

        if(memcmp(aTmpBuffer, g_ProcessesDumps[i].m_aMemDump, MAX_DUMP_SIZE) == 0)
        {
            return true;
            break;
        }
    }

    return false;
}

1 个答案:

答案 0 :(得分:1)

作弊将DLL注入您的游戏,听起来好像它使用手动映射将DLL隐藏在内存中。

检测到此错误的最佳方法是找到此DLL唯一的字节序列。图案扫描您自己的游戏进程,如果找到签名,则关闭游戏或在那时进行任何操作。

搜索C ++内部模式扫描或签名扫描,有数十种来源的资源经常用于此目的。

由于要手动映射它,因此必须扫描所有已提交的内存区域,而不要遍历模块列表。在从地址0开始的while循环中使用VirtualQuery()直到失败。