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

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

Собственно,вопрос:как искать сигнатуры,т.е. как узнать какие байты меняются,а какие нет?

Видел видеоурок кенга про плагин к олли,хотелось бы знать,как искать их самому

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

Проверочные байты СЕ за тебя выставит, надо только в окне Автоассемблера в меню выбрать "Templates" -> AOB Injection" (в русской не помню, но примерно так: "Шаблоны" -> "AOB Инъекция").

Или в окне отладчика выбрать с помощью левой кнопки мыши (с зажатой клавишей Shift) нужные инструкции, затем кликнуть по ним правой кнопкой мыши, и выбрать пункт "Copy to clipboard" -> "Bytes only (no address)" (в русской: "Копировать в буфер обмена" -> "Только байты (без адреса)" - как-то так).

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

Привет! Ассемблерные инструкции компилируются в опкоды, и эти самые инструкции состоят из операторов и операндов. Допустим:

 

MOV EAX,EBX

MOV ECX,[EDX+0x10]

 

В первом случае ты получишь опкоды (это пример) "AABBCCDD", которые и будут сигнатурой. Во втором случае во втором операнде команды MOV есть смещение 0x10, которое нужно учитывать. Грубо говоря, сигнатура должна учитывать все вещи, которые существуют динамически - смещения, адреса и все такое. Поэтому если во втором случае ты имеешь такой опкод:

 

AAEEFF10

 

То 10 тут нужно заменить на ??. Почему так? Потому что до сигнатуры можно добавить 10 байт кода и все адреса\смещения съедут на 10 байт вперед. Код при этом может и не измениться, но сигнатура работать уже не будет, поэтому смещение, которое может поменяться в следующем патче, стоит учесть.

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

Для примера взят сапер:

По этим байтам (F3 0F 11 40 20 - байты) находятся две инструкции. Так что скорее всего может случиться глюк, при включении скрипта.

Вот допустим как Plugin AA делает:

 

Он захватывает только опкоды, остальное заменяет на XX (или ??).

Сигнатура  f3xxxxxxxx00xx00xx01xx00xx00xxxx0d захватывает 7 инструкций:

[ENABLE]aobscan(Timer, f3xxxxxxxx00xx00xx01xx00xx00xxxx0d)alloc(newMem, 64)label(returnHere)registersymbol(Timer)newMem:mov [rax+20],1jmp returnHereTimer:jmp newMemreturnHere:[DISABLE]Timer:movss [rax+20],xmm0unregistersymbol(Timer)dealloc(newMem) 
minesweeper.exe+2B75B - F3 0F11 40 20         - movss [rax+20],xmm0minesweeper.exe+2B760 - 00 00                 - add [rax],alminesweeper.exe+2B762 - 00 CD                 - add ch,clminesweeper.exe+2B764 - 01 00                 - add [rax],eaxminesweeper.exe+2B766 - 00 00                 - add [rax],alminesweeper.exe+2B768 - 00 48 8B              - add [rax-75],clminesweeper.exe+2B76B - 0D F0F40700           - or eax,7F4F0
Ссылка на комментарий
Поделиться на другие сайты

Плагин "Plugin AA Maker" штука интересная, но после появления встроенного шаблона генерации сигнатур в меню АА окна, этот плагин можно не использовать.

 

АА Maker подходит для поиска сигнатур, но

 

а) не указывает модуль, в котором ищет (exe или dll)

б) пропускаете первый пять байт или больше, которые нужны для проверки инъекций

 

minesweeper.exe+2B75B - F3 0F11 40 20 - movss [rax+20],xmm0
Здесь нужен не только байт F3, но и все остальные F30F114020, потому что нужен чтобы был rax, чтобы было смещение +20, и чтобы был регистр xmm0. AA Maker включает байт опкода, но не включает все первый пять байт или более для проверки ключевых данных, которые могут использоваться в инъекциях и могут быть разными на разных версиях игр. Если используете плагин AA Maker, то хотя бы первые пять байт оставляйте цельными и указывайте модуль в котором будет поиск сигны. Либо делайте инъекцию так чтобы она не работала с регистрами, не работала со смещениями относительно базового адреса, но сделать это может быть нелегко (об этом ниже, в последнем абзаце поста)

 

Вообще тема работоспособности читов на разных версия игр актуальна. Я кстати так и не доделал генерацию автоматической инъекции по правилам, по сигнатуре в плагине для CE. Т.е. например мы нашли сигнатуру, а по ней вышли на

 

movss [rax+20],xmm0, но мы не хотим знать ни rax и не хотим знать +20 и не знаем xmm0, мы хотим только знать маску

 

movss [register1+offset1],register2

 

или знаем маску

 

movss [address1],register1

 

и знаем правило например "вписать значение 9999". Далее уже в самое игре, после активации чита, должен быть сгенерирован АА скрипт по правилу "Постоянное значение".  АА скрипт должен сам создаваться по маске.

 

Данный способ может существенно увеличить живучесть читов, но не на 100%. Я помню пример, когда после выхода новой версии игры, код в ней значительно менялся и никакая сигнатура там не работала. Это значит нужен уже другой подход. Если одни сигнатуры не работают, то могут работать другие и их надо найти имея под рукой множество версий игр...

 

Пока может быть другой способ. Это стараться избегать внутри инъекции регистров, смещений. Это может быть "ноппинг", "исправление прыгов", "правка простых инструкций" и даже может быть работа с первым стековым адресом по ESP или RSP на определенном адресе кода найденного по сигнатуре...

 

Такие дела...

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

  • 3 года спустя...
В 22.04.2015 в 18:45, Гость сказал:

(в русской: "Копировать в буфер обмена"

это не сигнатура это аобкарта , сигнатура это когда в aobscan статистические оставлены а динамические затёрты иксами.

В 22.04.2015 в 19:53, Garik66 сказал:

Plugin AA делает:

а где его скачать и как пользоваться?

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

59 минут назад, Stigmaer сказал:

это не сигнатура это аобкарта , сигнатура это когда в aobscan статистические оставлены а динамические затёрты иксами.

не верно
почитай:
 

Спойлер

II. Создание шаблона сигнатуры функции
Шаблон состоит из двух частей: сигнатуры и маски. Сигнатурой является та самая уникальная последовательность байт. Маска указывает на то, какие части сигнатуры могут изменятся, чтобы игнорировать их при поиске.

Для получения нужной нам информации будем использовать Interactive Disassemler(IDA). После открытия исследуемой библиотеки, необходимо включить показ кодов микрокоманд. В меню Options->General... во вкладке Disassembly в поле Number of opcode bytes поставьте 10. После чего слева от ассемблерных микрокоманд появятся их машинное представление.

Как только вы нашли требуемуемую функцию, можно приступать к созданию шаблона.

Сигнатурой функции является та самая уникальная последовательность байт. Просто скопируйте их из дизассемблера. Главное условие - эта последовательность должна быть уникальна в пределах программы. Я использую 32 байта в качестве сигнатуры, но размер никак не ограничен. Сразу следует отметить, что это должны быть именно ПЕРВЫЕ n байт, так как адресом является точка входа функции, а это и есть её начало. Это упрощает поиск.

Далее нужно составить маску сигнатуры, тем самым исключив динамические части. Адреса, как операнды микрокоманд, изменяются всегда. На самом деле, только их исключать из поиска и имеет смысл. Обычно это микрокоманды:

  • jmp
  • call
  • условные переходы jXX(jc, jnz, jbne etc.)
  • lea
  • mov

Определимть использование адреса легко - размер микрокоманды от 5 байт и выше(в 32-разрядных системах размер адреса равен 4 байтам, с этим связано ограничение на 4 ГиБ ОЗУ). Микрокоманды, работающие с непосредственными значениями и\или регистрами, могут быть больше, чем 5 байт, однако не нуждаются в исключении. Маска представляет собой строку, в которой байты, содержащие динамические значения отмечены знаками вопроса('?'), а все остальные 'x' или любым другим.

Рассмотрим небольшой пример. После кода идут символы маски, которые соответствуют кодам микрокоманд.

 

Код

; пролог функции не нуждающийся в исключении
.text:01D6C2F0 55                      push    ebp
.text:01D6C2F1 8B EC                   mov     ebp, esp
.text:01D6C2F3 56                      push    esi
x
xx
x

;обычные операции с регистрами
.text:01D6C2F4 8B 75 08                mov     esi, [ebp+arg_0]
.text:01D6C2F7 56                      push    esi
xxx
x

;вызов функции, первый байт - опкод, остальные 4 - адрес, его мы помечаем знаками вопроса
.text:01D6C2F8 E8 B3 08 00 00          call    sub_1D6CBB0
x????

;обычные операции с регистрами
.text:01D6C2FD 83 C4 04                add     esp, 4
.text:01D6C300 83 F8 01                cmp     eax, 1
xxx
xxx

;короткий переход не использует адрес, лишь смещение относительно текущего адреса
.text:01D6C303 7C 38                   jl      short loc_1D6C33D
xx

;сравнение регистра eax с адресом
;первый байт - опкод, второй - регистр eax, остальные - адрес
.text:01D6C305 3B 05 28 6F 13 02       cmp     eax, dword_2136F28
xx????

;опять короткий переход
.text:01D6C30B 7F 30                   jg      short loc_1D6C33D
xx

;перемещение в регистр адреса
;первый байт - опкод, второй - регистр edx, остальные - адрес
.text:01D6C30D 8B 15 24 6F 13 02       mov     edx, dword_2136F24
xx????

;обычные операции с регистрами и непосредственными значениями
.text:01D6C313 8D 0C 80                lea     ecx, [eax+eax*4]
.text:01D6C316 C1 E1 09                shl     ecx, 9
.text:01D6C319 03 C8                   add     ecx, eax
.text:01D6C31B 6A 39                   push    39h
xxx
xxx
xx
xx

;обратите внимание, код микрокоманды занимает 7 байт, но не использует адреса
;это значит что исключать из поиска ничего не нужно
.text:01D6C31D 8D 84 CA F8 AF FF FF    lea     eax, [edx+ecx*8-5008h]
xxxxxxx

;опять опычные операции
.text:01D6C324 8D 70 7C                lea     esi, [eax+7Ch]
.text:01D6C327 56                      push    esi
xxx
x

;вызов функции, первый байт - опкод, остальные - адрес
.text:01D6C328 E8 F3 9E FC FF          call    sub_1D36220
x????
В итоге мы получим: 

 

Код

сигнатура: "55 8B EC 56 8B 75 08 56 E8 B3 08 00 00 83 C4 04 83 F8 01 7C 38 3B 05 28 6F 13 02 7F 30 8B 15 24 6F 13 02 8D 0C 80 C1 E1 09 03 C8 6A 39 8D 84 CA F8 AF FF FF 8D 70 7C 56 E8 F3 9E FC FF"
маска: "xxxxxxxxx????xxxxxxxxxx????xxxx????xxxxxxxxxxxxxxxxxxxxxx????"

 

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

а где его скачать и как пользоваться?

Здесь, либо в подписи @MasterGH но он не для последних версий СЕ. 

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

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

не верно

Вообще то то что я написал это из видеоурока Кенга, не помню названия но он там по заявке весёлую ферму ломал, и это его слова, если я не прав, значит и Кенг не грамотный!

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

но он не для последних версий СЕ

я пользуюсь версией 6.4  она пойдёт?

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

  • 2 месяца спустя...

Добрый день, я нашёл сигнатуру в игре инди кот, эта сигнатура отвечает за количество опыта, и мне нужно её заменить так чтоб опыта стало 1 000 000, на какую сигнатуру мне менять, как её найти, или создать, при попытке заменить число в памяти сигнатура меняется но игра Крашится 

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

53 минуты назад, Risugava сказал:

Добрый день, я нашёл сигнатуру в игре инди кот, эта сигнатура отвечает за количество опыта, и мне нужно её заменить так чтоб опыта стало 1 000 000, на какую сигнатуру мне менять, как её найти, или создать, при попытке заменить число в памяти сигнатура меняется но игра Крашится 

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

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

10 минут назад, Xipho сказал:

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

Есть ссылка на статью или видео? 

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

1 минуту назад, Xipho сказал:

Нет. Поиск по форуму в помощь. А видео можно смотреть на нашем канале, ссылка на который есть у меня в подписи.

Понял спасибо, а с чего начать, можете порекомендовать? 

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

2 часа назад, Risugava сказал:

Понял спасибо, а с чего начать, можете порекомендовать? 

Рекомендую начать с самого начала. Без знания основ дальше никуда.

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

  • 1 год спустя...

А возможно найти сигнатуру с прыжками? На пример 

Спойлер

cmp [esi+88],(float)60
jne code
mov dword ptr [esi+000002B4],(float)0

 

Если возможно то как?

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

5 часов назад, Pitronic сказал:

А возможно найти сигнатуру с прыжками? На пример 

Такую ты точно не найдешь :)  так как, игра не использует для сравнения точки "cmp" 

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

99.jpg

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

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

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

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