PDA

Просмотр полной версии : [Статья] Поиск по сигнатуре и получение адреса со значением


JKHKJgj
10.04.2015, 23:00
Здравствуйте уважаемые коллеги, я сам начинающий кулхацкер так что опытные не грузите сильно за ошибки а лучше укажите на ошибки :rolleyeyes: Знаю в коде нужно упорядочить типы данных, добавить проверки от ошибочного ввода значений и.т.д но код вполне работоспособен и думаю очень поможет начинающим. Кстати способ этот я избрал так как пишу читы именно для флеш игры потому поиск по сигнатуре. И так приступим. Для начала видео что у нас должно в итоге получится.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

А теперь собственно как это реализовано.
1: Ищем сигнатуру участка кода который что то делает с нужным нам значением в памяти просто читает для отображения на экране или изменяет. Желательно найти инструкцию которая постоянно читает искомое значение, иначе у нас адрес будет появляться не сразу а только при выполнении инструкции.
2: В Cheat Engine делаем инъекцию кода и пишем что то подобное:


alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
label(sun)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here

originalcode:
mov eax,[edi+00005578] // Оригинальная строка кода
push esi // Сохраняем регистр esi так как будем с ним работать
lea esi, [edi+00005578] // инструкция lea вычисляет адрес и помещает его в регистр esi
mov [sun],esi // теперь сохраняем этот адрес
pop esi // Восстанавливаем первоначальное значение регистра, вытаскиваем из стека.

exit:
jmp returnhere

sun:
dd 00000000

"PlantsVsZombies.exe"+94445:
jmp newmem
nop
returnhere:


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

3: После выполнения скопируем получившийся байт код в 2 массива.


byte[] bSunAsmPart1 = { 0x8B, 0x87, 0x78, 0x55, 0x00, 0x00, 0x56, 0x8D, 0xB7, 0x78, 0x55, 0x00, 0x00, 0x89, 0x35 };
byte[] bSunAsmPart2 = { 0x5E, 0xE9 };


Смысл в том что первый массив у нас идёт до адреса с нашей меткой, а наша метка будет располагаться как раз после всего этого кода, расчитаем адрес нашей метки

byte[] SunOffsLb = BitConverter.GetBytes(uSunAddrNewMem + 25);


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

Далее вычисляем адрес возврата в код игры


byte[] bSunAddrRet = BitConverter.GetBytes(((uSunAddrOrCode + 5u) - (uSunAddrNewMem + uSunBytesCode)));


И наконец то объединяем все 4 массива в 1 который и будем записывать в память


byte[] bSunNewCode = arr.ArrayCombination(bSunAsmPart1, bSunAddrLabel, bSunAsmPart2, bSunAddrRet);


Вот и всё записываем этот массив в начало нашей выделенной памяти. И теперь раз мы знаем адрес нашей метки мы можем считать от туда значение адреса с нужным нам значением.
Ну и конечно же не забудьте вписать записать команду jmp на наш код.

Вот сам проект.
Доработал немного чит, теперь восстанавливает изначальный код игры при выходе.
Теперь работает добавление золота.
Так же отсутствуют какие либо проверки от ошибочных действий, не реализована заморозка.

62782
Cheat - Plants vs Zombies.vshost.exe ([Ссылки могут видеть только зарегистрированные и активированные пользователи] b520f479fde785/analysis/1431597110/)
Cheat - Plants vs Zombies.exe ([Ссылки могут видеть только зарегистрированные и активированные пользователи] 13ea39e087f7f9/analysis/1431819618/)
Cheat - Plants vs Zombies.exe ([Ссылки могут видеть только зарегистрированные и активированные пользователи] 10ed1ae1feaeb9/analysis/1431819874/)