Начинающий
-
Автор темы
- #1
Например, как авто принятие игры как во всех читах. Начать поиск, пикунть героя, покинуть игру и тому подобное. Которое в свернутом окне происходит
auto& kb_evt = event->kb_evt;
kb_evt.state = key.state;
kb_evt.keysym.scancode = key.scancode;
kb_evt.keysym.sym = key.keycode;
kb_evt.repeat = false;
if (key.state == SDL_PRESSED)
kb_evt.type = SDL_KEYDOWN;
else
kb_evt.type = SDL_KEYUP;
kb_evt.timestamp = SDL_GetTicks();
typedef void* (__fastcall* GetCPanel2DFn)(void*);
GetCPanel2DFn oGetCPanel2D;
typedef char(__fastcall* OnAcceptMatchFn)(panorama::CPanel2D*);
OnAcceptMatchFn OnAcceptMatch;
typedef void(__fastcall* RunScriptFn)(panorama::UIEngine*, panorama::IUIPanel*, const char*, const char*, int, int, bool);
RunScriptFn oRunScript;
panorama::CPanel2D* CPanel = nullptr;
void* GetCPanel2D(void* thisptr) {
if (!CPanel)
CPanel = (panorama::CPanel2D*)thisptr;
return oGetCPanel2D(thisptr);
}
void RunScript(panorama::UIEngine* thisptr, panorama::IUIPanel* panel, const char* entireJSCode, const char* pathToXMLContext, int int1, int int2, bool alreadyCompiled) {
if (CPanel && strstr(pathToXMLContext, "popup_accept_match.xml"))
OnAcceptMatch(CPanel);
oRunScript(thisptr, panel, entireJSCode, pathToXMLContext, int1, int2, alreadyCompiled);
}
void Hooks::HookRunScript() {
// Panel
uintptr_t CPanel2DBase = Memory::GetAbsoluteAddress(Адрес_С_Сиги + 0x2A, 3, 7);
uintptr_t GetCPanel2DFn = *(uintptr_t*)CPanel2DBase;
Hook((void*)GetCPanel2DFn, GetCPanel2D, (uintptr_t)&oGetCPanel2D, "GetCPanel2D");
// RunScript
void* FuncAddr = Memory::GetVFunc<void*>(sdk.panoramaEngine->AccessUIEngine(), 107);
Hook((void*)FuncAddr, RunScript, (uintptr_t)&oRunScript, "RunScript");
// OnAcceptMatch
OnAcceptMatch = (OnAcceptMatchFn)Memory::GetAbsoluteAddress(Адрес_С_Сиги + 0x55D, 1, 5);
}
.text:00000001817065A9 4C 89 60 10 mov [rax+10h], r12
.text:00000001817065AD 48 8B F9 mov rdi, rcx
.text:00000001817065B0 4C 89 78 C8 mov [rax-38h], r15
.text:00000001817065B4 E8 27 D3 7E 00 call sub_181EF38E0
.text:00000001817065B9 C6 47 28 00 mov byte ptr [rdi+28h], 0
.text:00000001817065BD 4C 8D AF 88 01 00 00 lea r13, [rdi+188h]
.text:00000001817065C4 C6 47 38 00 mov byte ptr [rdi+38h], 0
.text:00000001817065C8 48 8D 0D D1 08 96 01 lea rcx, ??_7CDOTA_DB_Play@@6B@ ; const CDOTA_DB_Play::`vftable'
.text:00000001817065CF 48 89 0F mov [rdi], rcx
.text:00000001817065D2 48 8D B7 38 02 00 00 lea rsi, [rdi+238h]
.text:00000001817065D9 45 33 E4 xor r12d, r12d
.text:00000001817065DC 48 89 3D 85 56 31 02 >> mov cs:CDOTA_DB_Play, rdi << THIS
.text:00000001817065E3 4C 89 67 78 mov [rdi+78h], r12
.text:00000001817065E7 48 8D 0D 9A 08 96 01 lea rcx, ??_7CDOTA_DB_Play@@6B@_0 ; const CDOTA_DB_Play::`vftable'
.text:00000001817065EE 48 89 4F 20 mov [rdi+20h], rcx
.text:00000001817065F2 0F 57 C0 xorps xmm0, xmm0
.text:00000001817065F5 4C 89 A7 80 00 00 00 mov [rdi+80h], r12
.text:00000001817065FC 48 8D 0D 5D 08 96 01 lea rcx, ??_7CDOTA_DB_Play@@6B@_1 ; const CDOTA_DB_Play::`vftable'
.text:00000001816F73B1 48 39 05 93 52 06 02 cmp cs:qword_18375C64B, rax
.text:00000001816F73B8 75 21 jnz short loc_1816F73DB
.text:00000001816F73BA 85 DB test ebx, ebx
.text:00000001816F73BC 78 1D js short loc_1816F73DB
.text:00000001816F73BE 41 3B 5F 40 cmp ebx, [r15+40h]
.text:00000001816F73C2 7D 17 jge short loc_1816F73DB
.text:00000001816F73C4 49 8B 47 48 mov rax, [r15+48h]
.text:00000001816F73C8 4A 8B 4C 30 08 mov rcx, [rax+r14+8]
.text:00000001816F73CD 80 79 54 00 cmp byte ptr [rcx+54h], 0
.text:00000001816F73D1 74 08 jz short loc_1816F73DB
.text:00000001816F73D3 48 8B CF mov rcx, rdi
.text:00000001816F73D6 E8 C5 00 00 00 >> call OnAcceptMatch ; #STR: "ui.matchmaking_accept" << THIS
// panorama::UIEngine* и прочее можешь просто на void* заменить, очевидно
typedef void(__fastcall* RunScriptFn)(panorama::UIEngine*, panorama::IUIPanel*, const char*, const char*, int, int, bool);
RunScriptFn oRunScript;
typedef char(__fastcall* OnAcceptMatchFn)(panorama::CPanel2D*);
OnAcceptMatchFn OnAcceptMatch;
typedef void*(__fastcall* AccessUIEngineFn)();
AccessUIEngineFn AccessUIEngine;
void hkRunScript(panorama::UIEngine* thisptr, panorama::IUIPanel* panel, const char* entireJSCode, const char* pathToXMLContext, int int1, int int2, bool alreadyCompiled) {
if (strstr(pathToXMLContext, "popup_accept_match.xml"))
OnAcceptMatch(DBPlayPanel);
oRunScript(thisptr, panel, entireJSCode, pathToXMLContext, int1, int2, alreadyCompiled);
}
void RunScript() {
// Естесна, нужно заполнить OnAcceptMatch и DBPlayPanel, где и как тебе удобней будет.
// sdk.panoramaEngine -- это интерфейс PanoramaUIEngine001 из panorama.dll
AccessUIEngine = Memory::GetVFunc<AccessUIEngineFn>(sdk.panoramaEngine, 2); // Третья функа в IPanoramaUIEngine*
void* RunScriptAddr = Memory::GetVFunc<void*>(AccessUIEngine(), 107); // 108 в panorama::UIEngine*
Hook(RunScriptAddr, hkRunScript, (uintptr_t)&oRunScript);
}
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz