Ответ

Предупреждение: в данной теме не было сообщений более 120 дней.
Если не уверены, что хотите ответить, то лучше создайте новую тему.
Имя:
E-mail:
Тема:
Иконка:

Вложение:
(Удалить вложение)
(Добавить ещё)
Ограничения: максимум вложений в сообщении — 4, максимальный размер всех файлов — 192 Кбайт, максимальный размер одного файла — 128 Кбайт
Визуальная проверка:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:
О какой игре форум? (три буквы заглавные):
Сколько будет (5*5 + 2) ответ цифрой.:

подсказка: нажмите alt+s для отправки или alt+p для предварительного просмотра сообщения


Сообщения в этой теме

Автор: DK
« : Июнь 11, 2014, 08:24:51 pm »

xanser, можно заменять участки любой длины.
Автор: xanser
« : Июнь 09, 2014, 12:37:21 pm »

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

Цитировать
Стал проверять значения ячеек, которые заменяю. Обнаружил, что вместо тех значений, которые должны быть судя по базе Alien'а, там смещенные на 0x20

Очень похоже на версию exe 1.1, там многое сдвинуто на 0x20, база для 1.0.

Цитировать
Инструкция call принимает разность между адресом функции, которая вызывается и адресом следующей за call инструкцией...
Именно так, если функция впереди, но она может быть и до, тогда там обратное смещение.
Автор: graveman
« : Июнь 09, 2014, 07:52:36 am »

Пытался поменять инструкцию ассемблера и даже просто заменить функцию. Обычно был вылет. Но несколько удивляло, что когда изменение прокатывало, измененная функция (в ней был вывод сообщения в лог) не вызывалась. Стал проверять значения ячеек, которые заменяю. Обнаружил, что вместо тех значений, которые должны быть судя по базе Alien'а, там смещенные на 0x20. То есть, чтобы поменять в exe значение ячейки, нужно к адресу в базе Alien прибавить 0x20. Может это уже известно, не знаю. Я только вчера обнаружил.
Вопрос еще такой. Инструкция call принимает разность между адресом функции, которая вызывается и адресом следующей за call инструкцией (где об этом почитать)?

Автор: DK
« : Апрель 06, 2014, 12:52:02 am »

Зависит от того, что надо менять и где.
Автор: Sektor
« : Апрель 06, 2014, 12:37:59 am »

Цитировать
это делается асм-вставкой.
Ты имеешь введу ему, голый код юзать? Т.е __declspec(naked) ?
Автор: DK
« : Апрель 05, 2014, 11:41:44 pm »

xanser, это делается асм-вставкой.
Автор: xanser
« : Апрель 02, 2014, 07:38:43 am »

Мы о разных вещах говорим, менять значения, менять адреса это действительно просто. Как правильно писать команды ассемблера в очищенном блоке. Туда можно писать произвольный асм-код подряд? потом сделать jmp куда нужно? У меня сложилось впечатление, что подряд нельзя, а только в определенные места с сохранением длины команд, несмотря на то, что весь блок уже очищен.

Наверное я не могу правильно объяснить, что мне нужно
Автор: Sektor
« : Апрель 02, 2014, 06:26:53 am »

Тогда все просто:

выделаем строку выше

Код: C++
  1. char str[] = "тут пишем что угодно";

а далее получаем адрес str, и записываем заместо того.

.text:00601A57 68 F8 3E 78 00      push    userdir_path
F8 3E 78 00 - эти байты, просто патчим на свой адрес строки та что в памяти.
Автор: xanser
« : Апрель 02, 2014, 05:14:47 am »

Через плагин, а есть разница? Так-то я пробовал оба способа, результат одинаковый
Автор: Sektor
« : Апрель 01, 2014, 09:39:15 pm »

Один вопрос. Это все дело статичного патчинга или опять через плагин?
Автор: xanser
« : Апрель 01, 2014, 07:42:00 pm »

Я имею ввиду строки команд, которые создает IDA PRO. Я смогу заменить например 1-байтовую команду 5-байтовой? Cоответственно вторая команда у меня начнется уже с 6-го байта, а не со 2-го как в оригинале, остальное подкорректирую нупами. Или нужно менять только один к одному 1 на 1, 5 на 5 и никакой сдвиг не допустим внутри законченного блока?

Вобщем мне нужно понять, эти варианты замены идентичны или один из них ошибочный?

Замена команд такой же длины

Код: ASM
  1.                                байты
  2.          |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
  3. оригинал |___|_________|___|_________|_________|_|_____|___|_____|
  4. замена   |x x|_________|x x|_________|x x x x x|_|x x x|___|x x x|   // работает

Последовательная замена

Код: ASM
  1.                                байты
  2.          |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
  3. оригинал |___|_________|___|_________|_________|_|_____|___|_____|
  4. замена   |_________|_________|_|___|x x x x x x x x x x x x x x x|   // не работает
Автор: Sektor
« : Апрель 01, 2014, 07:29:13 pm »

Если говорить про строки, то туда в push передается адрес строки, т.е указатель 4 байта.
Автор: xanser
« : Апрель 01, 2014, 05:16:17 pm »

Код я собрал для примера, все это у меня в cpp подменивается побайтово. Глубину стэка я проверил, в примере идет блок считывания из реестра, т.е. в начале и в конце блока глубина стека например 0E4 (я просто не дописал и там много push в начале). Точно также в моей замене, в начале и в конце 0E4, внутри идет два push и два pop, чтобы восстановить уровень стека. Мой блок работает, но внутри команды с разрывами nop, как только я пытаюсь написать без разрывов, а nop до конца блока, кажется что код понимается уже по другому. Так вот про строки байтов - это принциально сохранить при замене длину команд в байтах или она не важна и ошибка была в чем-то другом?
Автор: Sektor
« : Апрель 01, 2014, 04:50:45 pm »

Pop - тоже надо нопить, ведь это выталкивание их стека... Конечно будут вылеты... Есть ли код целиком этого самого участка?
Автор: xanser
« : Апрель 01, 2014, 04:48:01 pm »

А у меня вопрос по замене ассемблерного кода ассемблерным. Хочу заменить первый кусок кода на второй. Сначала я делал в лоб, писал команды подряд, после них все занупил. Программа вылетела на нулевом адресе 0x000000, не знаю что это такое, я так понял мой код не понравился, хотя я сто раз его проверил и уверен в правильности. Тогда я сделал то же самое, но распределил команды по строкам так, чтобы сохранить количество байтов в строках, т.е. меняю 5 байтов на 5, 2 на 2 и т.д., между ними занупил и все заработало. Вопрос - нужно ли сохранять эту построчную структуру байтов или можно писать любые команды подряд и они правильно поймутся?

Оригинал:

Код: ASM
  1. .text:00601A52 50                                            push    eax             ; phkResult
  2. .text:00601A53 68 19 00 02 00                                push    20019h          ; samDesired
  3. .text:00601A58 6A 00                                         push    0               ; ulOptions
  4. .text:00601A5A 68 88 63 6D 00                                push    offset SubKey   ; "Software\\Microsoft\\Windows\\CurrentVersi"...
  5. .text:00601A5F 68 01 00 00 80                                push    80000001h       ; hKey
  6. .text:00601A64 FF 15 C0 23 6F 00                             call    ds:RegOpenKeyExA
  7. .text:00601A6A 85 C0                                         test    eax, eax
  8. .text:00601A6C 0F 85 AC 00 00 00                             jnz     loc_601B1E
  9. .text:00601A72 C7 84 24 BC 00 00 00 00 01 00 00              mov     [esp+0E4h+cbData], 100h
  10. .text:00601A7D 8D 84 24 BC 00 00 00                          lea     eax, [esp+0E4h+cbData]
  11. .text:00601A84 50                                            push    eax             ; lpcbData
  12. .text:00601A85 8D 84 24 BC 00 00 00                          lea     eax, [esp+0E8h+Type]
  13. .text:00601A8C 68 F8 3E 78 00                                push    offset userdir_path ; lpData
  14. .text:00601A91 50                                            push    eax             ; lpType
  15. ........

Работающий код:

Код: ASM
  1. .text:00601A52 90                                            nop
  2. .text:00601A53 68 50 BD 68 00                                push    _programPath
  3. .text:00601A58 90 90                                         nop
  4. .text:00601A5A 68 F8 3E 78 00                                push    userdir_path
  5. .text:00601A5F E8 FC 0A 04 00                                call    _strcpy
  6. .text:00601A64 90 90 90 90 90 90                             nop
  7. .text:00601A6A 90 90                                         nop
  8. .text:00601A6C 90 90 90 90 90 90                             nop
  9. .text:00601A72 90 90 90 90 90 90 90 90 90 90 90              nop
  10. .text:00601A7D 90 90 90 90 90 90 90                          nop
  11. .text:00601A84 59                                            pop    ecx
  12. .text:00601A85 90 90 90 90 90 90 90                          nop
  13. .text:00601A8С 90 90 90 90 90                                nop
  14. .text:00601A91 59                                            pop    ecx
  15. ........

Неработающий код:

Код: ASM
  1. .text:00601A52 68 50 BD 68 00                                push    _programPath
  2. .text:00601A57 68 F8 3E 78 00                                push    userdir_path
  3. .text:00601A5С E8 FF 0A 04 00                                call    _strcpy
  4. .text:00601A61 59                                            pop    ecx
  5. .text:00601A62 59                                            pop    ecx
  6. .text:00601A63 90 90 90 90 90 90 90 90 90 90 90+             nop
  7. ........