Вопрос Как нажимать кнопки и прочие элементы?

Начинающий
Статус
Оффлайн
Регистрация
30 Дек 2021
Сообщения
4
Реакции[?]
0
Поинты[?]
0
Например, как авто принятие игры как во всех читах. Начать поиск, пикунть героя, покинуть игру и тому подобное. Которое в свернутом окне происходит
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
774
Реакции[?]
330
Поинты[?]
62K
автопринятие можно через протобафы сделать, апдейт лоббака приходит чекаешь и отправляешь в ответ CMsgReadyUp. либо на джаваскрипте там хмл файлик отредачить.
а так дота sdl2 юзает.
Пожалуйста, авторизуйтесь для просмотра ссылки.
экспорт SDL_PollEvent хукай, вызывай оригинал, если возвращает 0(то есть очередь ивентов свободная), возвращай 1 и в ивент записывай свое нажатие. (альтернативно юзай SDL_PushEvent)
C++:
            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();
игра постоянно сидит качает очередь ивентов(как с винапи GetMessage), ты просто хукаешь и говоришь ей "на держи вот тебе ивент" и она думает что ты нажал клавишу.
ну и там же можно обрабатывать эти нажатия в этом же хуке. вызываешь оригинал, вернула 1 - обрабатываешь ивент, можешь схавать его(чтобы до игры не дошел, то есть чит нажатие поймал а игра нет) вернув 0.
работает во всех играх которые на sdl2, не токо в доте. сам щас сижу в другой игре у нее тоже сдл2, посылаю свои фейк нажатия и хаваю реальные нажатия
альтернативно можешь с InputSystemVersion001 работать это выше уровнем.
-------------------
либо если игра не вызывает PollEvent, хукай SDL_PeepEvents.
 
Последнее редактирование:
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ну или Ghetto Way, зато готовый -- бери, пользуйся.
(Код старый, но рабочий, щас другое юзаю)

Сига: "E8 ? ? ? ? 48 8B F0 48 8B D6 48 8B CB"
Ищи по хрефу "file://{resources}/layout/popups/popup_accept_match.xml"

C++:
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);
}
 
Последнее редактирование:
Shitcode lord 💩
Забаненный
Статус
Оффлайн
Регистрация
25 Ноя 2020
Сообщения
272
Реакции[?]
84
Поинты[?]
8K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сори, эта говнина больше не работает, нужно обновить.

Ищи по хрефу "file://{resources}/layout/play.xml".
Открывай, листай на начало предыдущей фунции.
Там указатель на CPanel2D (в *(panorama::CPanel2D**) кастуй).
Код:
.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'
И само принятие игры. Хреф: "file://{resources}/layout/popups/popup_accept_match.xml"
Код:
.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
Ну и вместо плясок с бубном с GetCPanel2D, просто суй panorama::CPanel2D* в функцию принятия.
Фулл код:
C++:
// 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);
}
 
Последнее редактирование:
Сверху Снизу