X86Jumps
-
Постов
122 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные X86Jumps
-
-
вариантов не много
просто тупо запустить игру и через cheat engine посмотреть
dissect code, посмотреть что используется
D3D11CreateDevice или Direct3DCreate9
можно и без dissect, просто в search code написать одну из этих функций или goto перейти на нее и поставить breakpoint
вариант когда через GetModuleHandle тоже подходит, d3d9.dll,d3d11.dll, если один из вариантов возвратит не ноль, значит то и используется
-
речь идет про direct3d? а то в directx еще другие вещи входят)
в одной игре может использоваться более 1 библиотеки d3d, хотя такое не часто конечно
в сталкере последнем вроде было d3d8 d3d9 d3d10 d3d11)
можно попробовать проверить через GetModuleHandle последовательно библиотеки d3d
-
19 часов назад, MasterGH сказал:
А что с ним не так было?
Работает фильтр на конечное условие и на поиск этого условия. На начальное условие не см
в окне трейса поиск по условиям не пашет, ну по крайне мере в 6.7 так, в 6.5 работало))
-
поиск в trace не пофиксили?
-
2 часа назад, temtriss сказал:
У меня так же было)) Для устранения #include <array>
ошибка правильно выходила, эта не баг
выше я описал причину. Без #include <array> я бы даже не смог использовать этот контейнер из stl (хотя он еще в tr)
-
mov [ptr],val
-
проще было бы использовать тогда уже vector а не array
а облачать еще в скобки нужно потому что это уже не просто данные массива
упрощенно array это template<class Ty, size_t Size> struct {Ty[Size] data;}
а подобные простые классы или структуры (или union) можно инициализировать упрощенно
у меня уже тут ошибку дает
std::vector<std::array<int, 2>> data2 = { { 1, 2 } };
а вот так не дает
std::vector<std::vector<int>> data = { { 1, 1 } };
можно присваивать, как ты присвоил a
с vector of array не пашет упрощение, потому что список инициализации для
вот тут про это говорится
https://stackoverflow.com/questions/6041459/c-vector-of-arrays
из-за того что это уже не просто array, а vector<array> правило для упрощения инициализации не работает
можно еще тут прочесть (не сказать что я все уяснил)) )
http://ru.cppreference.com/w/cpp/container/array
http://ru.cppreference.com/w/cpp/container/vector
http://ru.cppreference.com/w/cpp/language/aggregate_initialization
http://ru.cppreference.com/w/cpp/language/list_initialization
(хотя кажется лучше en версию читать)) )
чтобы понять как он хранится в памяти проще в ide дебаг запустить и посомтреть locals
(у vector есть allocator,allocator_vals,first,last)
- 2
- 2
-
строки нельзя сравнивать через cmp
это будет сравнение как чисел, разве что указатель на него сравнивать (если это const строка)
а так строки сравнивают через cmps-инструкции или другие
(хотя не знаю зачем сроки сравнивать для чита)) чаще работаем с указателями или некими перечислениями)
- 1
-
В видео про спавн врагов в ре6, во второй его части пользователь спросил: могу ли я сделать подобное для ре4, версия 1.1
Еще в феврале в 10-х числах начал искать. Как-то несколько дней что-то проверял, потом нашел зацепку, потом затянулось и только в марте снова взялся.
Только сейчас дошли руки записать видео, скрипт пробный уже недели 2 готов был.
Версия игры 1.1., это не Ultra HD Remaster или как он там в стим называется, но кажется в нем все так же работает, разве что указатели в других местах.
Сделал пробный скрипт спавна врагов. Спавнит в упрощенном варианте, рядом с игроком.
Если на уровне не предусмотрены враги, то возможен вылет при попытке спавна (возможно файл не загружен в памяти, а при создании объекта не проверяется, что не загружен).
Как обычно работает на Tab. Сначала инициализирует массив со всеми структурами npc/enemy, прописано изначально только на врагов (0x12). При смене уровня обновляет массив заново.
Можно убрать инициализацию цикла и создавать, заполняя данные вручную.
По крайне мене когда я пытался, если спавнить не врагов а все иное, то вылет происходит, не сильно проверял почему, т.к. главной целью было спавнить врагов.
видео
Скрипт
Спойлер[ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat alloc(newmem,2048) alloc(enemies,2048) label(returnhere) label(originalcode) label(exit) label(skip) label(tick) label(data) label(loop) //label(initdata) label(exitloop) registerSymbol(data) registerSymbol(enemies) newmem: //this is allocated memory, you have read,write,execute access //place your code here test eax, eax je originalcode pushad pushf //cmp [enemies], 0 //jne exitloop mov ecx, [033F6EC4+8] //current object count on level mov edi, [leveldata] cmp ecx, edi je exitloop mov [enemies], 0 xor ebp,ebp mov edi,[00A3A280] mov ecx, [033F6EC4+8] mov [leveldata], ecx //save it mov ecx, enemies+4 loop: lea esi,[edi+ebp+000063F8] cmp byte [esi+1], 12 jne @f inc [enemies] mov [ecx], esi add ecx, 4 skiploop: add ebp, 20 cmp ebp, 2000 jb loop exitloop: push 9 call GetAsyncKeyState test eax,eax je @f call GetTickCount sub eax, [tick] cmp eax, 200 jb @f //get random index between 0..enemies count call rand xor edx, edx div [enemies] mov ecx, enemies+4 mov esi, [ecx+edx*4] movzx eax, [esi+1] push eax mov ecx, 033F6EC4 call 00409F93 test eax, eax je @f mov ecx, [data] mov [ecx*4+data+4], eax inc [data] mov esi, [033F6EAC] mov ecx, [esi+c0] mov [eax+c0], ecx mov ecx, [esi+c4] fld [floats] //mov [eax+c4], ecx fstp [eax+c4] mov ecx, [esi+c8] mov [eax+c8], ecx /* mov byte ptr [eax+11d], 4 //mov [eax+478], 0404 mov [eax+47a], 0404 //mov [eax+00000464], 5A0E1BCA mov [eax+474], 08012420 */ //mov ecx, eax //mov edx, [eax] //call [edx+10] mov ebp, eax //get random index between 0..enemies count call rand xor edx, edx div [enemies] mov ecx, enemies+4 mov esi, [ecx+edx*4] mov eax, ebp //initdata sub esp, 100 //relocated code 005A943A mov dl,[esi+02] mov [eax+0000011D],dl mov cl,[esi+03] mov [eax+00000485],cl mov edx,[esi+04] mov [eax+00000474],edx mov cl,[esi+0B] mov [eax+00000492],cl //movsx edx,word ptr [esi+1A] //mov [esp+14],edx //fild dword ptr [esp+14] //fmul dword ptr [game.exe+5CEC80] { [1000.00] } //fstp dword ptr [eax+0000046C] mov cx,[esi+08] //fld dword ptr [game.exe+634D00] { [6.28] } mov [eax+00000478],cx //fmul dword ptr [game.exe+5D6BA8] { [0.00] } mov [eax+0000047A],cx //movsx ecx,word ptr [esi+12] //mov [esp+14],ecx //fild dword ptr [esp+14] //fmul st(0),st(1) //fstp dword ptr [eax+000000D0] //movsx edx,word ptr [esi+14] //mov [esp+14],edx lea edx,[eax+000000C0] //mov edi,edx //fild dword ptr [esp+14] //fmul st(0),st(1) //fstp dword ptr [eax+000000D4] //movsx ecx,word ptr [esi+16] //mov [esp+14],ecx //fild dword ptr [esp+14] //fmul st(0),st(1) //fstp dword ptr [eax+000000D8] //movsx ecx,word ptr [esi+0C] //mov [esp+14],ecx //fstp st(0) //fild dword ptr [esp+14] //fmul dword ptr [game.exe+5CE9E0] { [10.00] } //fstp dword ptr [edx] //movsx ecx,word ptr [esi+0E] //mov [esp+14],ecx //fild dword ptr [esp+14] //fmul dword ptr [game.exe+5CE9E0] { [10.00] } //fstp dword ptr [eax+000000C4] //movsx ecx,word ptr [esi+10] //mov [esp+14],ecx //lea ecx,[eax+00000130] //mov [eax+00000488],bl //fild dword ptr [esp+14] //fmul dword ptr [game.exe+5CE9E0] { [10.00] } //fstp dword ptr [eax+000000C8] //////////////////////////////////////////////// //.................... mov ecx,[game.exe+2FF6EAC] { [172A07A0] } fld dword ptr [ecx+000000C8] fsub dword ptr [eax+000000C8] fld dword ptr [ecx+000000C0] mov ecx,eax {ptr as this} fsub dword ptr [edx] mov edx,[eax] mov [eax+00000464],5A0E1BCA { 1510874058 } fld st(0) fmul st(0),st(1) fld st(2) fmul st(0),st(3) faddp fstp dword ptr [eax+00000460] fstp st(0) fstp st(0) call dword ptr [edx+10] add esp, 100 call kernel32.GetTickCount mov [tick], eax skip: popf popad originalcode: add eax, 000000C0 exit: jmp returnhere tick: dd 0 floats: dd (float)100.00 leveldata: dd 0 data: dd 0 //size //list enemies: dd 0 //size //list "game.exe"+31E4DE: jmp newmem returnhere: [DISABLE] //code from here till the end of the code will be used to disable the cheat unregisterSymbol(data) unregisterSymbol(enemies) dealloc(newmem) dealloc(enemies) "game.exe"+31E4DE: add eax, 000000C0 //Alt: db 05 C0 00 00 00
ссылка на файл
http://s000.tinyupload.com/?file_id=08064413723196487564
Указатель на объект, который используется для спавна npc/врагов (и игрока единожды) 0x033F6EC4
+4 указатель на игрока
+8 максимально возможно количество объектов
+14 - последний созданный объект
в каждом объекте +8 - предыдущий объект
таким образом происходит полный обход всех объектов
0x009D3558 класс врага
0x009EF690 класс игрока
если кому интересно, допишу подробнее информацию из заметок, что вел
*оказалось записывал с отключенной функцией подавления шума, она сильно делала тише запись, но шумов не было. Когда усилил сигнал тут, то шумы очень сильно слышны были, подавил как мог в Audacity. Громкость не повышал аудиозаписи сильно, чтобы шумы не были уж слишком слышны.
- 3
- 3
-
аа, я не понял что это название игры))
а надпись всегда ниже? всегда одно и тоже расстояние? цвета надписи для врага не меняются через настройки?
-
а в каких играх отображается ник при наведение на врага?
-
хм интересно, ответы через 7 8 лет))
а актуально делать ответ когда даже сам автор выложил его?)
-
в directx sdk в dxut вроде свой список выпадающий используется (в примерах)
-
а imgui не пойдет чтоли?
-
чтоб не тормозило то можно ограничить перезапись значения текста, когда надо только
и если ты знаешь какие адреса нужно проверять
то может добавить запись в зареганный символ и его и считывать
-
В 23.01.2018 в 15:11, vadik111 сказал:
В C++ так нельзя буквами сделать чтобы туда значение записать
в с/с++ есть разыменовывание указателя, обратная получению адреса (&): *ptr
тогда можно изменять значение которое в указателе (или просто обращаться к нему для проверки)
но т.к. у тебя данные не в своем адресном пространстве, то используются функции записи/чтения в процесс ReadProcessMemory/WriteProcessMemory
хотя не очень понятно что ты хочешь
-
неужели сервер спокойно отреагирует, когда клиент локально у себя будет врагов перемещать и убивать и отсылать команду что убил?))даже не сверит что он далеко?
-
ну я про то если он локально их тупо на себя переместит и убьет - это сервер засчитает?) а то мало ли, определит что чит))
-
а разве в онлайн игре можно переопределить поведение ботов?за них же сервер отвечает
-
можешь таймер создать и там прописать проверку что есть процесс нужный
-
в начале не было про то что если меняется переменная, то меняется и в 2й форме
проще тогда как указатель на переменную делать и присвоить адрес нужной переменной
тогда что хочешь меняй
а выводит потому что как он при не видимой 2й форме тебе покажет что то?)))
-
а что нет переменных окон, чтобы к ним обращаться друг к другу?form1,form2?
-
может через gdi лучше рисовать?
-
а как ты хочешь получить ответ ? вот если ecx тебе нужен, то смотришь откуда он берется, берется из eax+4
ты его скорее всего знаешь, раз ты только про ecx спросил
Как програмно узнать версию DirectX
in Высокоуровневое программирование
Опубликовано
так надо конкретно какую то игру определить или как типа injector чтоб определил и делал потом hook для разных интерфейсов?
если второе, то вариант с getmodulehandle в библиотеке не самый плохой
просто без конкретики как то не очень ясно что нужно))
например в cheat engine хук d3d делает так: он грузит последовательно d3d11 d3d10 d3d9 библиотеки и создает интерфейсы на болванке созданного окна
т.к. это в виде dll он уже в памяти процесса игры висит и поэтому вернет в любом случае существующий указатель
а какие не были, получается создаст лишний раз (loadlibrary используется)
тогда как getmodulehandle только вернет handle на существующий модуль. Конечно в игре может быть сразу 2 3 рендерера как в каком-нибудь STALKER
но это не часто, или как в ue4 где несколько вариантов рендерера (rhi), но он только 1 раз создается, т.е. как в сталкер не меняется рендерер
partoftheworlD ну видеокарта может и d3d12 поддерживать)) а игра tomb raider II будет использовать DirectDevice7))