- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 663
- Реакции
- 18
В руки попал занятный набросок под Combat Arms. Автор жалуется, что софт отлетает через минуту игры — классический симптом либо детекта метода хука, либо срабатывания серверного хартбита на измененные параметры физики. База написана на C++, юзает классический D3D9 Present Hook и лезет в память движка через прямые оффсеты в CShell.dll.
Что внутри этого билда:
Технически тут всё довольно топорно: DetourEazyCreating делает обычный jmp, что античит хавает на завтрак. Если игра закрывается ровно через минуту, стоит проверить целостность VTable или перейти на более скрытные методы инжекта.
Проблема дисконнекта в Combat Arms часто связана с тем, что античит чекает CShell.dll на побайтовое соответствие. Как только вы меняете FRunVel или прыгаете выше лимита, сервер или локальный модуль кикает за несоответствие стейта. Чтобы это не летело в детект, нужно либо искать байпасс на мемори-чеки, либо использовать более легитные значения множителей.
Кто-нибудь ковырял актуальные структуры этого движка на предмет нормальных визуалов, а не через консольные переменные?
Что внутри этого билда:
- Юзает LTClientEXE для проброса команд прямо в консоль Литич-движка (LithTech).
- Реализованы Чамсы через консольную переменную +SkelModelStencil.
- Прямая перезапись JumpVel и FRunVel для спидхака и высокого прыжка.
- Простенький Detour для перехвата Present.
Технически тут всё довольно топорно: DetourEazyCreating делает обычный jmp, что античит хавает на завтрак. Если игра закрывается ровно через минуту, стоит проверить целостность VTable или перейти на более скрытные методы инжекта.
Func.h:
#include <windows.h>
#include <d3dx9.h>
#pragma comment(lib, "d3dx9.lib")
bool iChams, iJump, iSpeed;
#define LTClientEXE 0x4909F0
#define JumpVel 0x384870D4
#define FRunVel 0x38487068
#define BRunVel 0x3848708C
#define SRunVel 0x384870B0
#define GameStatus 0x384274BC
VOID pMemoria(LPVOID andress, LPVOID ByteMemcpy, INT Len)
{
DWORD dwBack;
VirtualProtect((LPVOID)andress, Len, 0x40, &dwBack);
memcpy((LPVOID)andress, ByteMemcpy, Len);
VirtualProtect((LPVOID)andress, Len, dwBack, &dwBack);
}
VOID VerifyClick(bool&val, int vkKey)
{
if (GetAsyncKeyState(vkKey) & 1)
val = !val;
}
VOID Console(CONST CHAR* CMD)
{
_asm
{
PUSH CMD
MOV EAX, LTClientEXE
CALL EAX
ADD ESP, 0x4
}
}
void FeatureCode()
{
if (*(BYTE*)GameStatus == 1)
{
if (iChams)
{
Console("+SkelModelStencil 1");
}
else
{
Console("+SkelModelStencil 0");
}
if (iSpeed)
{
*(FLOAT*)FRunVel = 285.0f * 2;
*(FLOAT*)BRunVel = 285.0f * 2;
*(FLOAT*)SRunVel = 285.0f * 2;
}
else
{
*(FLOAT*)FRunVel = 285.0f;
*(FLOAT*)BRunVel = 285.0f;
*(FLOAT*)SRunVel = 285.0f;
}
if (iJump)
{
*(FLOAT*)JumpVel = 330.0f * 2;
}
else
{
*(FLOAT*)JumpVel = 330.0f;
}
}
}
Main.cpp:
#include "Func.h"
BOOL CheatActivationStuff()
{
while (GetModuleHandle("cshell.dll") == NULL) {}
while (true)
{
VerifyClick(iChams, VK_NUMPAD1);
VerifyClick(iJump, VK_NUMPAD2);
VerifyClick(iSpeed, VK_NUMPAD3);
FeatureCode();
}
return true;
}
BOOL __stdcall DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
static HANDLE Thread;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hModule);
Thread = CreateThread(0,0, (LPTHREAD_START_ROUTINE)CheatActivationStuff, NULL, NULL, NULL);
break;
case DLL_PROCESS_DETACH:
if (Thread != NULL)
{
TerminateThread(Thread, 0);
}
break;
}
return true;
}
Проблема дисконнекта в Combat Arms часто связана с тем, что античит чекает CShell.dll на побайтовое соответствие. Как только вы меняете FRunVel или прыгаете выше лимита, сервер или локальный модуль кикает за несоответствие стейта. Чтобы это не летело в детект, нужно либо искать байпасс на мемори-чеки, либо использовать более легитные значения множителей.
Кто-нибудь ковырял актуальные структуры этого движка на предмет нормальных визуалов, а не через консольные переменные?