helldrg
-
Постов
142 -
Зарегистрирован
-
Посещение
-
Победитель дней
3
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные helldrg
-
-
Здравствуйте! Посмотрел я видео про реализацию фильтра "свой чужой". Чтобы его сделать необходимо различие в структурах найти. Я нашел в виде строки:
Скрытый текстПочитав форумы пришел к выводу, что можно писать так:
cmp word ptr[eax+4],'te' и cmp dword ptr[eax+4],'team'
Начало у всех одинаковое, надо делать смещение:cmp dword ptr[eax+8],'play'
Но почему то программа крашится после того как запускаю скрипт
И почему то после перезапуска CE нельзя включить скрипт. Подскажите в чем дело
Вот код:Скрытый текстnewmem: push eax mov eax,[ecx+10] cmp dword ptr[eax+8],'play' jne code mov dword ptr [ecx+00000134],(float)100 jmp code code: pop eax fld dword ptr [ecx+00000134] jmp return INJECT: jmp newmem nop
-
GMZ
Цитататак что у тебя должно быть 0-5=FFFFFFFB типа E9 FBFFFFFF
До меня только сейчас эта строчка дошла =) Спасибо!
- 1
-
Dino
Спасибо большое еще раз! Я вроде как разобрался, теперь использую E9 - это наверно far jmp =)Скрытый текстBYTE *bytes = new BYTE[20]; DWORD jmpAddress = allocAddress - (baseAddress + offsetAddress[2]) - 5; BYTE *b = new BYTE[4]; memcpy((void*)b, &jmpAddress, 4); bytes[0] = '\xe9'; bytes[1] = b[0]; bytes[2] = b[1]; bytes[3] = b[2]; bytes[4] = b[3]; bytes[5] = '\x90'; bytes[6] = '\x90'; if (Process.WriteMemory(baseAddress + offsetAddress[2], (LPVOID)bytes, 7) == FALSE) wsprintf(buffer, "Ошибка!"); jmpAddress = (baseAddress + offsetAddress[2]) - allocAddress - 19 + 7; memcpy((void*)b, &jmpAddress, 4); bytes[0] = '\xc7'; bytes[1] = '\x46'; bytes[2] = '\xc8'; bytes[3] = '\x00'; bytes[4] = '\x00'; bytes[5] = '\x16'; bytes[6] = '\x44'; bytes[7] = '\xd9'; bytes[8] = '\x46'; bytes[9] = '\xc8'; bytes[10] = '\x8a'; bytes[11] = '\x5c'; bytes[12] = '\x24'; bytes[13] = '\x17'; bytes[14] = '\xe9'; bytes[15] = b[0]; bytes[16] = b[1]; bytes[17] = b[2]; bytes[18] = b[3]; if (Process.WriteMemory(allocAddress, (LPVOID)bytes, 19) == FALSE) wsprintf(buffer, "Ошибка!");
Вот такое чудовище получилось, но оно работает :DD Спасибо за терпение к моей не образованности!!! Спасибо kengу за замечательные уроки!!!
- 1
-
Спасибо большое! Буду отталкиваться от этого дальше!!!
-
Сложность в том состоит, что вот к примеру:
05F70000 - E9 05F70000 - jmp 05F7F70A
если писать E9 EB FE(я так понял это как раз и будет зацикливание, потому что <Адрес куда прыгаем> - <Адрес от куда прыгаем> равняется 0, а - 2 байта тут говорят равняется EB FE), то еще появятся 00 00.
Че то я вообще не доганяю -
Воууу, почему так сложно =)
Тоесть что бы попасть с адреса на адрес 0x088A0000 нужно вписать jmp EB FE ? там кстати если так делать четыре 0 дописывается
-
Здравствуйте! Хотел записать переход по jmp даже порядок записи изменил байтов, заметил такую особенность:
Bytes Opcode
088A0000 - E9 088A0000 - jmp 088A8A0D
В Bytes все правильно записывается 0xe9 - команда безусловного перехода и адрес перехода 088A0000. В итоге должно получится зацикливание (только сейчас заметил =)). Но в Opcode адрес перехода другой 088A8A0D. Почему так? -
уже не актуально!
-
Аватарка у вас подходит к ситуации, когда все полетело к чертям =)
-
Сайт тупил
-
Здравствуйте! Уже месяц бьюсь над этим вопросом но, либо я недалекий, либо структура игры хитрая. Вообщем:
1. Command & Conquer: Generals
2. v1.8
3. Repack в антологии by МОРОЗОВ, в описаннии - таблетка не требуется, поэтому не знаю какая она4. d3d menu в пункте 7 опишу
5. лимит 500 рублей на покупку в стиме игр, шмоток с торговой площадки, как пожелаете
6. месяц
7. Исходник на с++, который компилируется в VS13 на Windows 8.1. Опция: вывод картинок, предположим для меню в игре(режим игры на весь экран).
Суть в том, что нужно работать с vTable, которая возможно пересоздаётся. -
2 часа назад, keng сказал:
переустанавливать хук в новое место.
То есть vTable функций смещается и нужно их найти заново, например, создать d3d устройство скопировать адреса нужных функций и удалить устройство?
Все таки интересно, что бы посмотреть адрес указателя на устройство надо писать так: printf("pDevice: %x\n", *(DWORD*)pDevice); ?Я пробовал не сразу vTable находить, а после, по нажатию горячей кнопки, но таблица не находится
-
Здравствуйте! В перехваченной функции HookPresent я отрисовываю спрайт. В простом приложении на d3d8 после инжекта работает отлично, но вот с игрой не работает. После инжекта в игре во время заставки в самом начале спрайт отображается, но когда ролик заканчивается картинка исчезает. Подскажите в чем дело, может устройство пересоздавать надо? Игра C&C:Generals v1.8
P.S.: что бы посмотреть адрес указателя на устройство надо писать так: printf("pDevice: %x\n", *(DWORD*)pDevice); ? -
ну это ничего страшного)
-
Давай сначала разберемся что там за условие, я понять не могу зачем оно
-
1 минуту назад, keng сказал:
Тебе хочется разобраться вообще в алгоритме работы всей этой штуки, или только в конкретной функции?
Я вроде более-менее разобрался в алгоритме и зачем эта функция нужна, я только не понял что в ней происходит, то есть разобраться в этой функции
-
Просто хотелось бы не просто копипастить или качать detour и им пользоваться, а разобраться во всем процессе, ведь люди которые к примеру разрабатывают велосипеды новые, они сперва изучают старые, собирают их а потом начинают усовершенствовать =)
Если бы объяснили бы функцию подробно я был бы премного благодарен, а если бы еще и кенг разобрался бы почему его пример не работает так было бы идеально =) -
20 минуты назад, keng сказал:
в нижнем-правом углу сообщения стрелочки - плюс и минус.
У меня их нету(
20 минуты назад, keng сказал:по-моему, тот же что и у меня - в начало функции записывается ассемблерная инструкция вида "jmp addr", где addr - адрес перехваченной функции в нашей dll.
Вы через heap искали в первом уроке
А можно по подробней о функции рассказать, зачем это условие нужно, цикл в конце с нопами какой то появляетсяМне ваш пример нравился, там просто создавали d3d, находили d3d процесса, делали указатель d3d->d3d процесса все легко и понятно было, вот только почему то не везде этот пример работает(
я поэтому тему и создал что бы разобраться почему не работает =) -
Теперь все работает! Вы какой то другой метод используете. Можете вот эту функцию расписать, что и зачем делает:
Скрытый текстvoid* DetourCreate(BYTE *src, const BYTE *dst, const int len) { BYTE *jmp; DWORD dwback, dwold; DWORD jumpto, newjump; VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwback); if (src[0] == 0xE9) { jmp = (PBYTE)malloc(10); VirtualProtect(jmp, 10, PAGE_EXECUTE_READWRITE, &dwold); jumpto = (*(DWORD*)(src + 1)) + ((DWORD)src) + 5; newjump = (jumpto - (DWORD)(jmp + 5)); jmp[0] = 0xE9; *(DWORD*)(jmp + 1) = newjump; jmp += 5; jmp[0] = 0xE9; *(DWORD*)(jmp + 1) = (DWORD)(src - jmp); } else { jmp = (PBYTE)malloc(5 + len); VirtualProtect(jmp, 5 + len, PAGE_EXECUTE_READWRITE, &dwold); memcpy(jmp, src, len); jmp += len; jmp[0] = 0xE9; *(DWORD*)(jmp + 1) = (DWORD)(src + len - jmp) - 5; } src[0] = 0xE9; *(DWORD*)(src + 1) = (DWORD)(dst - src) - 5; for (int i = 5; i < len; i++) src[i] = 0x90; VirtualProtect(src, len, dwback, &dwback); return (jmp - len); }
А тут где-нибудь спасибо можно поставить?
-
Везде крашит
-
6 часов назад, keng сказал:
Так, ок. У меня Win10 x64 и мой же код работает некорректно. Хук отрабатывает, но что-то не так с перехваченной функцией, которой я подменяю оригинальную Present(). Моя рушит стек при вызове. Буду разбираться, но это займет какое-то время.
Если бы еще видео сделали бы по фиксу или лучше стрим какой нибудь было бы шикарно =)
-
Скрытый текст
#include <Windows.h> #include "Include\d3d9.h" #include "Include\d3dx9.h" #include <io.h> #include <stdio.h> #pragma comment(lib, "d3d9.lib") typedef IDirect3D9* (STDMETHODCALLTYPE *DIRECT3DCREATE9)(UINT); typedef HRESULT(WINAPI* tPresent)(LPDIRECT3DDEVICE9 pDevice, CONST RECT*, CONST RECT*, HWND, LPVOID); typedef HRESULT(WINAPI* tReset)(LPDIRECT3DDEVICE9 pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters); typedef DWORD(STDMETHODCALLTYPE *GETPROCESSHEAPS)(DWORD, PHANDLE); static DWORD vtableFrag9[] = { 0, 0, 0, 0 }; static DWORD* presentPtr = 0; static DWORD* resetPtr = 0; static DWORD offsetPresent = 0; static DWORD offsetReset = 0; static tPresent g_D3D9_Present = 0; static tReset g_D3D9_Reset = 0; LPDIRECT3DDEVICE9 npDevice; bool indicator = 0; //DWORD*vtbl = 0; //DWORD table; // //BOOL bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask) //{ // for (; *szMask; ++szMask, ++pData, ++bMask) // if (*szMask == 'x' && *pData != *bMask) // return false; // return (*szMask) == NULL; //} //DWORD FindPattern(DWORD dwAddress, DWORD dwLen, BYTE *bMask, char * szMask) //{ // for (DWORD i = 0; i < dwLen; i++) // if (bCompare((BYTE*)(dwAddress + i), bMask, szMask)) // return (DWORD)(dwAddress + i); // // return 0; //} void CreateConsole() { int hConHandle = 0; HANDLE lStdHandle = 0; FILE *fp; AllocConsole(); SetConsoleTitle("Generals console!"); lStdHandle = GetStdHandle(STD_OUTPUT_HANDLE); hConHandle = _open_osfhandle(PtrToUlong(lStdHandle), 0); fp = _fdopen(hConHandle, "w"); *stdout = *fp; setvbuf(stdout, NULL, _IONBF, 0); } void DrawIndicator(LPVOID self) { IDirect3DDevice9* dev = (IDirect3DDevice9*)self; dev->BeginScene(); D3DRECT rec = { 10, 10, 30, 30 }; D3DCOLOR color = 0; if (indicator) { color = D3DCOLOR_XRGB(0, 255, 0); } else { color = D3DCOLOR_XRGB(255, 0, 0); } dev->Clear(1, &rec, D3DCLEAR_TARGET, color, 1.0f, 0); dev->EndScene(); } HRESULT WINAPI hkPresent(LPDIRECT3DDEVICE9 pDevice, CONST RECT* src, CONST RECT* dest, HWND hWnd, LPVOID unused) { while (!npDevice) { npDevice = pDevice; } DrawIndicator(pDevice); return g_D3D9_Present(pDevice, src, dest, hWnd, unused); } HRESULT WINAPI hkReset(LPDIRECT3DDEVICE9 pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters) { return g_D3D9_Reset(pDevice, pPresentationParameters); } BOOL SearchHeap(HANDLE heap) { int vtableLenBytes = sizeof(DWORD) * 4; PROCESS_HEAP_ENTRY mem; mem.lpData = 0; while (HeapWalk(heap, &mem)) { if (mem.wFlags == PROCESS_HEAP_UNCOMMITTED_RANGE) continue; DWORD* p = (DWORD*)mem.lpData; for (int i = 0; i < (int)(mem.cbData / sizeof(DWORD)); i++) { if (memcmp(p, vtableFrag9, vtableLenBytes) == 0) { presentPtr = p + 11; resetPtr = p + 10; offsetPresent = *presentPtr; offsetReset = *resetPtr; g_D3D9_Present = (tPresent)((DWORD*)offsetPresent); g_D3D9_Reset = (tReset)((DWORD*)offsetReset); break; } p++; } if (presentPtr != 0) break; } return(presentPtr != 0); } void CheckAndHookPresent9() { if (presentPtr != 0 && (*presentPtr) == (DWORD)hkPresent) return; HANDLE heap = 0; HMODULE hKern = GetModuleHandleA("kernel32.dll"); GETPROCESSHEAPS getProcessHeaps = (GETPROCESSHEAPS)GetProcAddress(hKern, "GetProcessHeaps"); if (getProcessHeaps != 0) { HANDLE heaps[1000]; int numHeaps = (getProcessHeaps)(1000, heaps); for (int k = 0; k < numHeaps; k++) { heap = heaps[k]; if (SearchHeap(heap)) break; } } else { heap = GetProcessHeap(); SearchHeap(heap); } HeapLock(heap); if (presentPtr != 0) { (*presentPtr) = (DWORD)hkPresent; } if (resetPtr != 0) { (*resetPtr) = (DWORD)hkReset; } HeapUnlock(heap); } void CopyVMT9(DWORD* vtableFrag) { HWND hWnd = CreateWindowA("STATIC", "dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0); HMODULE hD3D9 = GetModuleHandleA("d3d9"); //DIRECT3DCREATE9 Direct3DCreate9 = (DIRECT3DCREATE9)GetProcAddress(hD3D9, "Direct3DCreate9"); lib add IDirect3D9* d3d = Direct3DCreate9(D3D_SDK_VERSION); D3DDISPLAYMODE d3ddm; d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm); D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = 1; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; IDirect3DDevice9* d3dDevicee = 0; d3d->CreateDevice(0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3dDevicee); DWORD* vtablePtr = (DWORD*)(*((DWORD*)d3dDevicee)); for (int i = 0; i < 4; i++) { vtableFrag[i] = vtablePtr[i + 6]; //6ad21c70 6acdb5a0 6adaf540 6ad20760 } d3dDevicee->Release(); d3d->Release(); DestroyWindow(hWnd); } PBYTE HookVTableFunction(PDWORD* dwVTable, PBYTE dwHook, INT Index) { DWORD dwOld = 0; VirtualProtect((void*)((*dwVTable) + (Index * 4)), 4, PAGE_EXECUTE_READWRITE, &dwOld); PBYTE pOrig = ((PBYTE)(*dwVTable)[Index]); (*dwVTable)[Index] = (DWORD)dwHook; VirtualProtect((void*)((*dwVTable) + (Index * 4)), 4, dwOld, &dwOld); return pOrig; } bool hooked = 0; DWORD WINAPI TF(LPVOID lpParam) { CopyVMT9(vtableFrag9); CheckAndHookPresent9(); //DWORD hhD3D9 = (DWORD)LoadLibraryA("d3d9.dll"); //table = FindPattern(hhD3D9, 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx"); //memcpy(&vtbl, (void*)(table + 2), 4); // while (!npDevice && !hooked) { Sleep(50); } hooked = !hooked; printf("npDevice: %x, g_D3D9_Present: %x, g_D3D9_Reset: %x\n",(DWORD*)npDevice, g_D3D9_Present, g_D3D9_Reset); //printf("npDevice: %x, g_D3D9_Present: %x, g_D3D9_Reset: %x\n", (DWORD*)table, vtbl[17], vtbl[16]); while (1) { Sleep(1000); //printf("npDevice: %x, g_D3D9_Present: %x, g_D3D9_Reset: %x\n", (DWORD*)npDevice, g_D3D9_Present, g_D3D9_Reset); HookVTableFunction((PDWORD*)npDevice, (PBYTE)hkReset, 16); HookVTableFunction((PDWORD*)npDevice, (PBYTE)hkPresent, 17); } return 0; } DWORD WINAPI KeyboardHook(LPVOID lpParam) { while (1) { if (GetAsyncKeyState(VK_F1)) { indicator = !indicator; Beep(500, 200); } Sleep(100); } return 0; } BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { CreateConsole(); CreateThread(0, 0, &TF, 0, 0, 0); CreateThread(0, 0, &KeyboardHook, 0, 0, 0); } case DLL_PROCESS_DETACH: break; } return 1; }
Вот так код у меня выглядит
-
Это все kenga хук, http://kekekeng.blogspot.ru/2012/10/direct3d-1.html, я так понимаю это создаем сигнатуру по которой будем искать нужный указатель. Проверок нету я так понял для уменьшения размера кода
-
41 минуты назад, keng сказал:
PS: Простыни исходного кода лучше убирать под тег "спойлер".
Я искал не нашел спойлер, похоже это скрытый текст
Вот проект, и exe: http://rgho.st/8Cs76zJNp
А вот как код в отладчике выглядит у вас и у меня:
Скрытый текстИзображения не работают, попробую так:
https://monosnap.com/file/6IaPnQju48gFkSmj0HFsgCu56kCkXh
https://monosnap.com/file/XtL5CQwF6hUUwFSZ2YZFFFCSthYlYW
У вас функции подсвечиваются и вызов этих функций понятный call address. Естественно не везде такой вызов, но в туториале именно такой. А у меня в отладчике мало чего понятного + в asm я новичок(
cmp строки
in Cheat Engine
Опубликовано
LIRW
Я попробовал как Вы написали, все равно крашит
push eax mov eax,[ecx+10] mov eax,[eax+8] cmp eax,'play' jne code //mov dword ptr [ecx+00000134],(float)100 jmp code code: pop eax
Даже в этом куске крашит, тут же ничего не изменятся для того что бы крашило
И почему бывает невозможно скрипт активировать, нажимаешь на него, а крестик не ставится
Сейчас готовой функцией попробую сравнить