port: ProcessCRC verbatim (module introspection adapted) + XTrap mapped

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-30 13:10:54 +09:00
co-authored by Claude Opus 5.5
parent 6d2d262de8
commit 80c5a1e39f
6 changed files with 246 additions and 11 deletions
+57
View File
@@ -0,0 +1,57 @@
#include "UserInterface/StdAfx.h"
#include "UserInterface/ProcessCRC.h"
#include <cstdio>
#include <cstring>
#include <string>
const char * stristr(const char * big, const char * little);
bool GetProcessInformation(std::string & exeFileName, LPCVOID * ppvAddress);
bool __GetExeCRC(DWORD & r_dwProcCRC, DWORD & r_dwFileCRC);
int main()
{
int failures = 0;
auto check = [&failures](bool ok, const char *name) {
if (!ok) {
std::fprintf(stderr, "FAIL %s\n", name);
++failures;
}
};
static const BYTE xorTable[8] = { 102, 30, 188, 44, 39, 201, 43, 5 };
// stristr (40250): case-insensitive, and it compares one character less than the needle's length.
const char * hay = "C:\\Game\\METIN2.BIN";
check(stristr(hay, "metin2.bin") == hay + 8, "stristr case fold");
check(stristr(hay, "metin2.biX") == hay + 8, "stristr ignores the last needle character");
check(stristr(hay, "client.exe") == NULL, "stristr miss");
// Before BuildProcessCRC the cube is zero: the pieces are the XOR table, index cycling & 7.
bool pristine = true;
for (int i = 0; i < 16; ++i)
pristine &= GetProcessCRCMagicCubePiece() == xorTable[i & 7];
check(pristine, "pieces before BuildProcessCRC");
// ADAPTED: no module snapshot -> ProcCRC 0; FileCRC is the CRC32 of GetExcutedFileName, as in 40250.
std::string exe;
LPCVOID base = NULL;
check(!GetProcessInformation(exe, &base), "GetProcessInformation finds no module");
DWORD proc = 1, file = 0;
check(__GetExeCRC(proc, file) && proc == 0, "__GetExeCRC proc 0");
GetExcutedFileName(exe);
check(file == GetFileCRC32(exe.c_str()), "__GetExeCRC file CRC");
// BuildProcessCRC interleaves proc/file bytes low to high and restarts the index.
GetProcessCRCMagicCubePiece();
BuildProcessCRC();
BYTE expect[8];
for (int i = 0; i < 4; ++i) {
expect[2 * i] = BYTE(proc >> (8 * i));
expect[2 * i + 1] = BYTE(file >> (8 * i));
}
bool built = true;
for (int i = 0; i < 8; ++i)
built &= GetProcessCRCMagicCubePiece() == BYTE(expect[i] ^ xorTable[i]);
check(built, "pieces after BuildProcessCRC");
return failures ? 1 : 0;
}