Rodion Опубликовано 7 января, 2015 Поделиться Опубликовано 7 января, 2015 Привет всем Необходимо вызвать функцию из игры через c++ (dll)сама функция:code:0061165F loc_61165F: ; CODE XREF: code:0061176Fjcode:0061165F mov edx, [ebp+8]code:00611662 mov eax, [ebp+0Ch]code:00611665 movzx eax, word ptr [eax+edi*2+0Ch]code:0061166A mov eax, eaxcode:0061166C push eaxcode:0061166D push edxcode:0061166E mov eax, [edx]code:00611670 call dword ptr [eax+3Ch]code:00611673 add esp, 8code:00611676 cmp eax, 0code:00611679 jge short loc_611680code:0061167B jmp loc_611769три параметра принимает x y textпомогите пожалуйста :C Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 7 января, 2015 Поделиться Опубликовано 7 января, 2015 Название игры и версию в студию. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 7 января, 2015 Поделиться Опубликовано 7 января, 2015 /*---------------------------------------------------------------------------*/ Привет! Раз ты в dll, то это сильно облегчает задачу, потому что засунув в игру эту самую dll, ты получаешь доступ к адресному пространству игры. Если адрес инструкции статический и своего положения не меняет, то ты просто берешь и используешь [inline-assembler] (псевдокод в данном примере): __asm: push arg1 push arg2 call myfuncaddr Просто так, само собой, тебе игра не даст выполнить этот код, поэтому у тебя как минимум пара вариантов - сделать стандартную инъекцию кода (рекомендую!) или записать все это дело в память (побайтно) и затем сделать новый поток, выдав ему адрес памяти, куда ты записал эти инструкции. Работа с игровыми функциями - вообще достаточно муторное дело, я планирую записать об этом урок или написать статью. /*---------------------------------------------------------------------------*/ 3 Ссылка на комментарий Поделиться на другие сайты Поделиться
Rodion Опубликовано 7 января, 2015 Автор Поделиться Опубликовано 7 января, 2015 хм сейчас попробую, я собираюсь использовать функции игры вместо d3d hook для создания меню Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 8 января, 2015 Поделиться Опубликовано 8 января, 2015 В 07.01.2015 в 15:06, Rodion сказал: хм сейчас попробую, я собираюсь использовать функции игры вместо d3d hook для создания меню Не понял, что здесь смешного.Перехватывай через vTable - EndScene (DX 9, если не ошибаюсь индекс в vTable будет 42) либо Present (DX 10, 11, индекс Present загуглишь сам думаю) и перед тем как вернуть управление оригинальной функции рисуй своё меню, всё просто. Ссылка на комментарий Поделиться на другие сайты Поделиться
Rodion Опубликовано 8 января, 2015 Автор Поделиться Опубликовано 8 января, 2015 нее) я имею ввиду без d3d9 и т.дпросто используя api игры Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 9 января, 2015 Поделиться Опубликовано 9 января, 2015 В 08.01.2015 в 13:53, Rodion сказал: нее) я имею ввиду без d3d9 и т.дпросто используя api игрыТогда реверс инжиниринг тебе в помощь) Ну или SDK по игре (если такой имеется). Касательно твоего основного вопрососа.Описываешь указатель на функцию и потом просто через указатель вызываешь функцию.Вот кусок кода из моего проекта, возможно тебе поможет: Показать контент typedef void (__thiscall IRenderer::*func)(); // тип мембер-функции интерфейса IRendererfunc origDraw = 0; // указатель на функциюIRenderer* render = 0; // указатель на экземпляр класса IRendererHINSTANCE hDLL = 0;DWORD* ReadPtr(DWORD base, DWORD offset){ return *(DWORD**)(base + offset);}void HookedDraw(void){ // рисуем что хотим render->TextToScreenColor(1, 1, 255, 0, 0, 255, "Hello world!\nThis is IRenderer::Update hook!"); //printf("HookedDraw!\n"); (render->*origDraw)(); // но не забываем вернуть управление оригинальной функции}void vTableHook(DWORD* vTable, short index, DWORD value){ DWORD oldProt = 0; VirtualProtect(vTable, index * 4, PAGE_READWRITE, &oldProt); vTable[index] = value; VirtualProtect(vTable, index * 4, oldProt, &oldProt);}DWORD WINAPI Thread(LPVOID){ CreateConsole(); DWORD* ptr = ReadPtr((DWORD)GetModuleHandleA("CryGame.dll"), 0x00118564); DWORD* ptr2 = ReadPtr((DWORD)ptr, 0x48); CXGame* game = (CXGame*)ptr2; // получили указатель на главный класс игры ISystem* sys = game->GetSystem(); // получили указатель на основную подсистему игры render = sys->GetIRenderer(); // получили указатель на рендерер игры DWORD* vTable = *(DWORD**)render; // получили указатель на vTable экзепляря класса IRenderer origDraw = (func&)vTable[15]; // получили указатель на оригинальную функцию отрисовки (IRenderer::Update) vTableHook(vTable, 15, (DWORD)HookedDraw); // подменяем указатель оригинальной IRenderer::Update на нашу HookedDraw getch(); // ждем пока в консоли нажмут любую клавишу vTableHook(vTable, 15, (DWORD&)origDraw); // снимаем хук FreeConsole(); // закрываем консоль FreeLibraryAndExitThread(hDLL, 0); // выгружаем DLL и завершаем поток return 0;}BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){ if (fdwReason == DLL_PROCESS_ATTACH) { hDLL = hinstDLL; DisableThreadLibraryCalls(hinstDLL); CreateThread(0, 0, Thread, 0, 0, 0); } return 1;} Вообще загугли все это, как вызывать функции на Си через указатели, вот здесь неплохо расписано - http://amse.ru/courses/cpp2/2011_04_11.html . Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 14 января, 2015 Поделиться Опубликовано 14 января, 2015 В 09.01.2015 в 15:03, Coder сказал: Тогда реверс инжиниринг тебе в помощь) Ну или SDK по игре (если такой имеется).Реверс-инженеринг? Я просто видел кое что подобное... В чите на PayDay2. Это было гениально! Они перехватили функцию игры, которая выдает сообщения. Тем самым, сделали очень красивое меню) Плюс, там была функция: пополнить боезапас, восстановить жизни и броню и все такое. Когда нажимаешь хоткей - такая приятная надпись вылетает, боеприпасы пополнены) Видно, что игровая функция))Можно поподробней, как это осуществить?) Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 14 января, 2015 Поделиться Опубликовано 14 января, 2015 У меня будет видеоурок на эту тему. Ожидайте. (: 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 15 января, 2015 Поделиться Опубликовано 15 января, 2015 В 14.01.2015 в 20:58, keng сказал: У меня будет видеоурок на эту тему. Ожидайте. (: Уииииии ))) Ссылка на комментарий Поделиться на другие сайты Поделиться
Bromvol Опубликовано 16 января, 2015 Поделиться Опубликовано 16 января, 2015 В 14.01.2015 в 20:58, keng сказал: У меня будет видеоурок на эту тему. Ожидайте. (: keng очень жду твоих интересных уроков. Дай боже тебе сил, здоровья и желания все это сделать. P.S.: а какие были твои 2 уроки, которые ютуб запретил? Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 18 января, 2015 Поделиться Опубликовано 18 января, 2015 В 16.01.2015 в 19:09, Bromvol сказал: keng очень жду твоих интересных уроков. Дай боже тебе сил, здоровья и желания все это сделать. P.S.: а какие были твои 2 уроки, которые ютуб запретил?ютуб запретил уроки Кенга? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения