 |
Инъекция кода - Вопросы и ответы, обсуждения - Ваши вопросы по C# только в данном разделе |
19.03.2015, 19:05
|
#1
|
|
|
|
Разведчик
|
 Регистрация: 06.09.2014
 Сообщений: 2
 Популярность: 10
 Сказал(а) спасибо: 17
Поблагодарили 1 раз в 1 сообщении
|
Инъекция кода
Здравствуйте. Недавно заинтересовался темой читерства, сейчас изучаю память и.т.д и вот возник вопрос, можно ли как то писать у себя в программе ассемблерный код который потом автоматически переведётся в байт код и его уже инжектить в процесс, или же так вручную байт код и пишут в программах ?
|
|
|
19.03.2015, 22:53
|
#2
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 14.06.2012
 Сообщений: 511
 Популярность: 7566
 Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
|
Re: Инъекция кода
шарп не поддерживает прямые ассемблерные вставки, но зато можно вполне просто запихнуть в процесс массив байт и вызвать его
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
|
|
|
Пользователь сказал cпасибо:
|
|
19.03.2015, 23:30
|
#3
|
|
|
|
Рыцарь-защитник
|
 Регистрация: 28.08.2009
 Сообщений: 603
 Популярность: 19129
 Золото Zhyk.Ru: 500
 Сказал(а) спасибо: 84
Поблагодарили 602 раз(а) в 321 сообщениях
|
Re: Инъекция кода
Для начала тебе нужны такие API как
Код:
VirtualAllocEx
VirtualFreeEx
CreateRemoteThread
MemoryWriteProcessMemory
Теперь ты пишешь byte код своего ассемблерного кода (прямо как в памяти, без реверсов и тд.)
например
Код:
List<byte> asm = new List<byte>();
asm.AddRange( new byte[] { 0x68, 0xB8, 0xFF, 0xFF } );
Потом ты записываешь эти байты в заранее выделенной памяти процесса.
Код:
int AdressAllocated = MemAlloc(4); //MemAlloc выделяет память и возвращает адрес 1 свободного байта.
Memory.WriteMem(AdressAllocated, asm.ToArray());
Теперь подошёл момент вызова, для этого необходим открытый handle с параметром Create.
Код:
uint dwThread = 0;
CreateRemoteThread(handleCreate, IntPtr.Zero, 0, AdressAllocated, IntPtr.Zero, 0, out dwThread);
После этого надо очистить память. Требуется handle с параметром Operations (VM_READ, VM_WRITE....)
Код:
Thread.Sleep(200);
VirtualFreeEx(handleOperaion, AdressAllocatedToRead, 4, FreeType.Decommit);
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.
|
|
|
Пользователь сказал cпасибо:
|
|
20.03.2015, 09:16
|
#4
|
|
|
|
Разведчик
|
 Регистрация: 06.09.2014
 Сообщений: 2
 Популярность: 10
 Сказал(а) спасибо: 17
Поблагодарили 1 раз в 1 сообщении
|
Re: Инъекция кода
Спасибо за такое подробное объяснение, вы не подскажете где мне взять нормальный справочник по байт кодам, в гугле искал так они там на одну и ту же команду разные, видимо для разных процессоров. Ещё подскажите вот для чего мы запускаем отдельный поток ? Я думал делается по другому, что вот мы в памяти игры допустим, подменяем какую нибудь команду на джимп на наш участок памяти, конечно соблюдая чётность байтов, и там уже пишем свой код а потом прыжок обратно. И в конце вашего примера когда мы освобождаем выделенную память я так понимаю поток убивается ? Да и вот ещё вопрос который мне непонятен, поток запустили, и как мне из моей программы, ну для примера хочу чтобы на форме отображалось количество патронов из игры, как мне из потока передавать эти данные в программу ? Или вот ещё хочу изменить количество патронов к примеру, ввожу желаемое кол-во и нажимаю добавить, или я должен буду записать эти данные в адрес потока с данными ? и уже этот отдельный поток будет это считывать и записывать по адресу патронов это значение ? Вот мне сам принцип понять бы. Я умею читать память, писать туда, создавать участки памяти в процессе, искать по сигнатуре. Мде сколько понаписал )) дико извиняюсь но вопросы эти не дают покоя сам искал честно ответы но не смог найти либо искал неверно.
Последний раз редактировалось JKHKJgj; 20.03.2015 в 09:26.
|
|
|
20.03.2015, 12:10
|
#5
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 14.06.2012
 Сообщений: 511
 Популярность: 7566
 Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
|
Re: Инъекция кода
взамен справочника могу посоветовать использовать любой дебагер, например OllyDbg, в нем составляете нужный вам ассемблерный код, а дальше просто выделяете эту облать и копируете как байты, и сразу прошу заметить не делать прямых вызовов CALL adress, а делать вызовы через регистр, то есть mov edx, adress; call edx. Собственно используйте любой свободный регистр.
А для чтения данных зачем лезть в поток, если можно те же пули считать через линейку указателей с помощью ReadProcessMemory
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
|
|
|
20.03.2015, 13:10
|
#6
|
|
|
|
Разведчик
|
 Регистрация: 06.09.2014
 Сообщений: 2
 Популярность: 10
 Сказал(а) спасибо: 17
Поблагодарили 1 раз в 1 сообщении
|
Re: Инъекция кода
Та я со флеш всё мучаюсь )) там нет указателей, я знаю какие регистры указывают на нужный мне адрес, то есть сканером сигнатур нахожу операнды которые пишут или читают в нужный мне адрес. Вот мне как то программе нужно передать этот самый адрес со значением. Чтобы потом я мог его изменять читать и.т.д. И ещё я думал может класс готовый какой есть, передаёшь туда допустим строку с ассемблерными командами он тебе уже байты возвращает, и пишешь их потом сразу в процесс. А как работать с указателями я уже разобрался вроде бы. Ведь делают читы на флеш и они работают потом у других пользователей вот как там обмен данными организуеться без указателей дойти не могу. Или может да запускать свой поток в нём уже читать эти регистры, помещать в память адрес которой мы уже будем знать, и с ним работать а поток будет проверять изменилос нет, или добавить патронов допустим если нужно, то есть в каком либо адресе количество появилось, и добавляем их, но как то запутанно получаеться (
PS: Как то сумбурно описал, попробую ещё )) как я это представляю.
1-Есть наша программа, в которой мы можем смотреть количество патронов допустим и кнопка добавить патроны, и поле для ввода количества. Она же находит нужный нам процесс игры и инжектит туда код, и запускает поток.
2- Вот этот поток он просто копирует количество патронов из адреса игры в свой адрес. И начинает в цикле проверять изменилось ли количество патронов и обновлять если да, И будет ещё 1 адрес в который мы из нашей программы будем помещать количество патронов которые нужно добавить, поток так же в цикле проверяет этот адрес и если там что то появилось то прибавляет к патронам по адресу игры. То есть поток посредник такой.
Ведь из нашей программы мы точно знаем все адреса нашего потока.
Или есть какой то другой способ ?
PPS: Да как я писал вначале что делаем джимп на наш код неправильно, так наш код будет работать только тогда когда будет вызвана данная функция из игры только, а вот в отдельном потоке да ) в цикле будет постоянно работать.
Последний раз редактировалось JKHKJgj; 20.03.2015 в 13:29.
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 20:23.
|
 |