![]() |
Привет, сегодня мы будем вызывать игровую функцию из exe. Пример вызова в dll: C++: Код:
#define FUNC_CMessages__AddMessageJumpQ 0x69F1E0Для вызова из exe мы будем использовать: -OpenProcess -VirtualAllocEx -WriteProcessMemory -CreateRemoteThread Создаем структуру для передачи аргументов в удаленный поток(CreateRemoteThread): C++: Код:
structСоздаем прототип: C++: Код:
typedefСоздаем нашу функцию, которую будем вызывать. Под ней создаем еще одну, для получения размера C++: Код:
DWORD __stdcallЗаполняем структуру: C++: Код:
strcpyФункция для получения id процесса: C++: Код:
DWORDC++: Код:
// получаем хэндл процессаПолучаем: Цитата:
Создаем структуру и прототип: C++: Код:
typedefЗаполняем структуру: C++: Код:
myBeepC++: Код:
DWORD __stdcallC++: Код:
HANDLE hProcess |
а самое интересное не написал. Переключение процессов планировщиком происходит в момент вызова CreateRemoteThread или по истечению кванта? Т.е. поток выполняется сразу или отложено, при переключение процесса?
|
Цитата:
|
Обновил. Изменил реализацию, добавил пример с WinAPI
|
Цитата:
|
клёвый гайд , взял себе
|
Цитата:
Поэтому что бы найти адрес функции относительно другого процесса, нужно: Использовать CreateToolhelp32Snapshot, Module32First, Module32Next для нахождения адреса библиотеки в чужом процессе. Затем загрузить туже библиотеку в свой процесс через LoadLibrary. А после найти адрес функции относительно своего процесса через GetProcAddress. Затем просто вычисляем: адрес_библиотеки_в_чужом процессе + адрес_функции_в_нашем_проце ссе - адрес_библиотеки_в_нашем_пр оцессе. |
Цитата:
|
Цитата:
Но в Виндоусе на каждый процесс свой экземпляр библиотеки. |
Цитата:
2. Почему тогда фокус с получением адреса библиотечной функции из своего процесса работает? |
Цитата:
Цитата:
На скрине ниже, можно заметить что у samp.dll отличаются базовые адреса в разных процессах. https://forum.antichat.xyz/attachments/27331951/ |
Цитата:
|
При попытке выполнения этого кода gta просто выключается, без ошибок, как будто завершается процесс
|
круто конечно
жаль что баян (the CreateRemoteThread & WriteProcessMemory technique старше меня) и перепизжено на разные форумы тысячу раз Цитата:
Цитата:
Цитата:
|
Проблемy с разным адресом процедуры из-за релокаций можно решить так
C++: Код:
DWORD RVA |
Цитата:
Так же находят адрес LoadLibraryA инжекторы |
Цитата:
|
Цитата:
|
Цитата:
ru.wikipedia.org hint: PspAllocateProcess |
Цитата:
Цитата:
|
А получить координаты костей можно как-то через удалённый способ? :/
|
@CleanLegend помоги братец
C++: Код:
#include Укажите на ошибки, почему сообщение в чат не отправляется, непон. И да, на эту строку C++: Код:
VirtualFreeExВыдаёт пред, очково Код: Код:
Предупреждение C6333 Недопустимый параметр: передача MEM_RELEASE и ненулевого параметра dwSize в "VirtualFreeEx" не допускается. Это приведет к сбою вызова. |
Цитата:
Тоже самое и с текстом: "samp.dll", в памяти игры у тебя его нет, поэтому тоже ошибка, передавай в структуру. Цитата:
C++: Код:
WaitForSingleObjectЦитата:
|
@CleanLegend опять какая-то ерунда.
1594114830318.pngVintik · 6 Июл 2020 в 16:18' data-fancybox="lb-post-524694" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/61639/" style="cursor: pointer;" title="1594114830318.png"> https://forum.antichat.xyz/attachments/27524694/ Что уж теперь не так то? Я всё пофиксил из того, что ты сказал. Цитата:
|
Цитата:
|
Цитата:
Второй второй. Я сделал на DLL коллбэк (обычный 5-байтовый jmp в начале функции) на исходящее от тебя в чат сообщение и хотел бы понять, как игнорировать (не пропускать сообщение) в некоторых случаях (например, если текст содержит мат) – пытался сделать jmp в конец функции, но краш. |
Цитата:
что бы игнорировать функцию просто поставь ret(если функция не возвращает никаких аргументов) |
Цитата:
2) а если возвращает чтот? |
Цитата:
2. анализируй функцию, если возврат идет в виде true/false , то будет примерно так: C++: Код:
true |
Также следует добавить, что взвращаемое функцией значение можно получить, разместив следуюищий код между созданием удаленного потока и закрытием хендла процесса:
C: Код:
unsigned |
У меня ошибка, @CleanLegend живой, поможешь?
Вообщем такое же окошко вылезает, без понятия что делать Цитата:
|
Цитата:
Код свой скинь |
C++:
Код:
#include практически не отличается от кода в заголовке, разве что функция получения pID другая (но 100 процентов рабочая), и strcpy заменил на strcpy_s, т.к. на что то ругался я так то новичок в c++, пытаюсь постепенно понять значения неизвестных функций UPD: нашел способ поставить strcpy как у автора темы, но все равно получаю ошибку. SA-MP 0.3.7 Exception At Address: 0x13500013 Base: 0x041E0000 ОЙ ахахаах переключил на x86 и заработало). Не подскажите, а почему раньше не работало? _SendMSG msg = (_SendMSG)sArg->pAdr; // передаем адрес . В этой строчке мы передаем адрес функции нашему прототипу функции, верно? А для чего нужна пустая функция void __stdcall RemoteThread_end() {}? |
Цитата:
Цитата:
C++: Код:
( |
Цитата:
|
| Время: 14:53 |