Перейти к содержанию

Ручной поиск указателей и немного халявы


Рекомендуемые сообщения

Статья-напоминалка для тех, кто не умеет искать указатели вручную, плюс небольшая хитрость, которая позволяет иногда сильно упростить и ускорить процесс. Пароль на архив - адрес нашего сайта без "http://". Формат - PDF.

gamehacklab.keng.pointers.finding.pdf.zip

  • Плюс 3
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, keng сказал:

Пароль на архив - адрес нашего сайта без "http://".

keng, "Перестаньте говорить загадками - Вы меня изводите...":D Напиши какой пароль.

 Перебрал несколько вариантов, но у меня не один не открыл архив.

Варианты, которые я перебрал:

Правда я копировал ссылку.

Может это и мешает?

Т.е. нужно вручную набирать.

 

Ссылка на комментарий
Поделиться на другие сайты

Just now, Garik66 said:

Со второго раза всё-таки открыл ;).

keng, как всегда всё СУПЕР!!! - родовой талант учителя не пропьёшь.

Спасибо за отзыв, но мне самому пока не нравится. Возможно, еще подредактирую.

Ссылка на комментарий
Поделиться на другие сайты

Очень полезный урок! Спасибо! Уважаемый Keng ответьте пожалуйста на вопрос - у меня инструкция mov[ebp-10],edx ну и игра 32Bit - ваш код подойдет к такой инструкции??? если просто заменить инструкцию оригинальную? поясню откуда взялся такой вопрос - попытался написать код сам - когда дошел до инструкции Push RBX - не особо понял что писать в ней в моем случае. 

 

Вообщем написал такой код - при запуске получил краш процесса.

Spoiler

[ENABLE]
alloc(newmem,2048,"FClient.exe"+F04BF)
label(returnhere)

newmem:
mov [ebp-10],edx
push ebx
mov ebx,00402407
mov [ebx],ebp
sub [ebx],10
pop ebx
jmp returnhere

"FClient.exe"+F04BF:
JMP newmem
returnhere:

[DISABLE]
"FClient.exe"+F04BF:
mov [ebp-10],edx
dealloc(newmem)

 

 

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

@NickSpirit, привет! Я в статье описал общий принцип, если ты не полностью понял пример - то задавай вопросы, постараюсь ответить. У меня игра была 64-битная, а регистр RBX я использовал, потому что мне так захотелось. RBX - один из так называемых регистров общего назначения, и без разницы, какой из них использовать. Команды push и pop нужны, чтобы мы могли сохранить и затем восстановить изначальное значение регистра. На твой код я смотрю и пока что мне кажется, что все написано правильно. Предлагаю сделать следующее:

 

0. Открой CE, затем - окно отладчика ("Memory Viewer")

1. В нижней его части (которая еще называется дампом памяти) ПКМ -> "Goto address" ("Перейти на адрес")

2. Вбивай адрес code cave, куда должен сохраниться указатель. В случае твоего скрипта - 0x00402407

3. А дальше смотри в верхний левый угол дампа памяти. Там будет надпись Protect: *что-нибудь*. Тебе нужно, чтобы в этом поле стояло "Protect: Read\Write"

4. Если там стоит какая-то другая защита - то попробуй другой адрес для code cave

 

Вот картинка, для наглядности:

ce_mem_protect.png.99fde8aa75f4ec366a35e

 

Поясню, что за ахинею написал. Память процесса поделена на страницы, каждой странице при ее выделении выдается та или иная защита - какие-то данные можно только читать, какие-то - читать и писать, а в каких-то может вообще лежать исполняемый код, который можно еще и выполнять. Сделано это для удобства, конечно же. Так вот, если в страницу памяти, выделенную с правами только на чтение, попытаться что-то записать - получится исключение и операционная система программу закроет, то есть игра вылетит. Такая вот штука.

 

PS: Исходный код и все, что длинное, принятно оборачивать в тег "спойлер", так что я твой пост чуток отредактировал.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо, за пояснения! Очень толково ответили на мои вопросы. Обязательно попробую.

Изменено пользователем NickSpirit
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

А может быть такое что все свободные адреса в памяти имеют статус либо Read Only либо Executable\Read only???

 

Сорри уже нашел доступные для записи. 

Изменено пользователем NickSpirit
Ссылка на комментарий
Поделиться на другие сайты

  • 11 месяцев спустя...
  • 1 год спустя...

есть ли возможность в автоматическом режиме найти пустые адреса памяти, в которые можно записывать?

Изменено пользователем Redear
Ссылка на комментарий
Поделиться на другие сайты

24 минуты назад, Redear сказал:

пустые адреса памяти, в которые можно записывать

Создай скрипт типа такого:

Спойлер

[ENABLE]
alloc(newmem,200) //выделяем память под наш код (newmem)
registersymbol(newmem) //Регистрируем наш код

[DISABLE]
dealloc(newmem) //отменяем вылеоение памяти
unregistersymbol(newmem) //Снимаем регистрацию

 


Всё, теперь ты можешь писать в newmem всё что хочешь, в пределах выделенного места. То есть например:

Спойлер

//Пишем в наше место что нибудь
mov [newmem],1 
mov [newmem+4],5
mov byte ptr [newmem+8],1
mov byte ptr [newmem+9],1 

 


А на счёт твоего кода, как бы там ни было, мне кажется ты записываешь в адрес переход по которому ничего не даст, то есть ведёт в никуда, попробуй сделать отладку. Мне не совсем понятно что ты пытаешься сделать, но если хочешь записать в тот адрес что то своё, то просто сделай:

mov [ebp-10],edx //В место edx что то своё


 

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

спасибо, пост с кодом делал не я. но у меня аналогичная проблема.

я конечно нубас в геймхакинге. и у меня задача найти указатели. мне просто нужны указатели для вывода их в тренер. (типо показатели силы,магии, брони итп.) никаких скриптов которые бы изменяли игру не планирую. чисто информационное окно.

 

столкнулся с проблемой поиска указателей. перекопал форум, пересмотрел видео. пробовал трассировку итп не могу найти указатели. Единственный вариант который как я думал может сработать это описанный в этой ветке. Типа ищем код - копируем значение в выделенную ячейку памяти. но увы, ячейки пустые находятся только на чтение/исполнение. Брейкпоинты тоже не работают. Хотя может я нубас.

 

 

 

 

Ссылка на комментарий
Поделиться на другие сайты

есть еще маленькая проблема, версии игры выходят практически еженедельно и искать указатели практически бессмысленно ибо они становятся недействительны. Поэтому считаю копирование информации с кода игры хорошее решение. или я ошибаюсь?

Ссылка на комментарий
Поделиться на другие сайты

47 минут назад, Redear сказал:

они становятся недействительны

Для этого и существуют скрипты, берёшь какую нибудь инструкцию которая работает с твоим игроком, например с его здоровьем, типа такой
Пример:

mov [eax+123],ecx

На неё делаешь скрипт, в скрипте создаёшь метку, вроде такого:

Спойлер

[ENABLE] //В этом разделе метку
label(MyPlayer) //Метку делаем
registersymbol(MyPlayer) //Регистрируем её

//Всякий код ---
//Твой код
mov [MyPlayer],eax //Предположим что ты сделал на mov [eax+123]. //Записываем в метку наш адрес игрока.

//Тут после кода и возвратного прыжка пишем:
MyPlayer:
dd 0 //Выделяем памяти под метку, что бы хватило на адрес игрока, обычно 4 байта, если 64 бит то может быть 8.

[DISABLE] //Прямо сразу после
unregistersymbol(MyPlayer) //Снимаем регистрацию с метки.

 


Теперь, добавляешь в таблицу MyPlayer (в строку адреса вписываешь).
В итоге получаешь при активации адрес своего игрока, и наплевать на обновления. (инъекцию AOB делать надо).
Но учти, что инструкция должна работать только с твоим игроком.

  • Понравилось 1
Ссылка на комментарий
Поделиться на другие сайты

Спойлер

 


[ENABLE]
alloc(newmem,2048,"TH2.exe"+124FD8)
label(returnhere)
label(resM)
registersymbol(resM) 

newmem:
mov [edx],cx
push ebx
mov ebx,[resM]
mov [ebx],edx
pop ebx
jmp returnhere

"TH2.exe"+124FD8:
JMP newmem
returnhere:
resM:
dd 0

[DISABLE]
"TH2.exe"+124FD8:
mov [edx],cx
dealloc(newmem)
unregistersymbol(resM) 

Что то не работает, игра вылетает). Извините, подскажите)

Изменено пользователем Redear
Ссылка на комментарий
Поделиться на другие сайты

29 минут назад, Redear сказал:

Что то не работает,

Всё не работает, например ты пустой адрес записываешь в ebx, после в [00000000](ebx) записываешь edx, и соответственно вылет.
AOB - когда выбираешь как сделать инъекцию кода, есть выбор AOB. Это инъекция с поиском байт - CE ищет байты и после туда внедряет код.
Лучше всего тебе пойти посмотреть самые начальные уроки.
Какое название у игры?

Ссылка на комментарий
Поделиться на другие сайты

41 минуту назад, Redear сказал:

Что то не работает, игра вылетает). 

И откуда ты такое взял?

Попробуй так:

Спойлер

[ENABLE]
alloc(newmem,2048,"TH2.exe"+124FD8)
label(returnhere)
label(resM)
registersymbol(resM) 

newmem:
mov [resM],edx
mov [edx],cx
jmp returnhere

"TH2.exe"+124FD8:
JMP newmem
returnhere:
resM:
dd 0

[DISABLE]
"TH2.exe"+124FD8:
mov [edx],cx
dealloc(newmem)
unregistersymbol(resM) 

 

 

Ссылка на комментарий
Поделиться на другие сайты

14 минут назад, Garik66 сказал:

И откуда ты такое взял?

Эту наркоманию я сделал на основе гайда в этом посте)

 

25 минут назад, inaginary сказал:

Какое название у игры?

Спойлер

диябло: мод the hell 2

 

14 минут назад, Garik66 сказал:

Попробуй так:

Гарик, большое спасибо. все равно не работает, вылетает. Вы уже кстати копали эту игру, токо первую часть мода "the hell 1". сейчас в ТХ2 новый движок, сигнатуры полностью поменялись(

Изменено пользователем Redear
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.