Русский / Russian English / Английский

Сейчас на форуме: evgen82, reverser (+5 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Вопросы новичков —› Как вставить в код новую процедуру.
Посл.ответ Сообщение

Ранг: 3.2 (гость)
Статус: Участник

Создано: 5 июня 2013 06:22 New!
Цитата · Личное сообщение · #1

Мне необходимо вставить свою процедуру в код программы. Процедура это копия оригинальной, с небольшими изменениям. Т.к. пустого места было не достаточно, я делал все как указано здесь http://exelab.ru/rar/htm.php?n=084 , т.е. создавал новую секцию, менял точку входа и т.д.
Вопрос который меня немного смущает. Это то что Олли перестал воспринимать оригинальную секцию кода как код... Хотя программа работает и запускается. И еще один неприятный момент. Когда я в свою новую секцию вставляю копию оригинальной процедуры (binary copy- binary paste) , то при всей одинаковости байт, у меня все вызовы вложенных процедур (call адрес) указывают на совершенно левые места. Я смутно догадываюсь от чего это может быть, но как с этим бороться не понимаю. Прошу помощи.


Ранг: 564.4 (!)
Статус: Участник
_Вечный_Студент_

Создано: 5 июня 2013 06:42 New!
Цитата · Личное сообщение · #2

Может стоит почитать немного теории о структуре PE file? Благо о ней написано более, чем достаточно.

Ранг: 0.6 (гость)
Статус: Участник

Создано: 5 июня 2013 06:42 · Поправил: zxcoder New!
Цитата · Личное сообщение · #3

>Это то что Олли перестал воспринимать оригинальную секцию кода как код
Олли смотрит на BaseOfCode и SizeOfCode в PE заголовке
>(call адрес) указывают на совершенно левые места
call может быть как абсолютным (указывается точный адрес перехода), так и относительным (смещение относительно адреса call'a )

Ранг: 3.2 (гость)
Статус: Участник

Создано: 5 июня 2013 06:50 New!
Цитата · Личное сообщение · #4

plutos пишет:
Может стоит почитать немного теории о структуре PE file? Благо о ней написано более, чем достаточно.

Да читал я, даже видео смотрел! Однако там обычно голая теория, перевести в практику ее пока не получается. Поэтому и задаю вопрос в ветку для новичков. Ответы по существу пожалуйста...

Ранг: 188.1 (ветеран)
Статус: Участник

Создано: 5 июня 2013 08:31 New!
Цитата · Личное сообщение · #5

yarcom
Если изменений немного, то можно попытаться найти "пустые" места в коде и вставлять туда новый код (кусками с jmp-ами на следующий кусок).

Ранг: 3.2 (гость)
Статус: Участник

Создано: 5 июня 2013 08:44 · Поправил: yarcom New!
Цитата · Личное сообщение · #6

crypto пишет:
Если изменений немного, то можно попытаться найти "пустые" места в коде и вставлять туда новый код (кусками с jmp-ами на следующий кусок).

А может существует способ расширить уже имеющуюся секцию кода?


Ранг: 1024.9 (!!!!)
Статус: Участник

Создано: 5 июня 2013 08:49 New!
Цитата · Личное сообщение · #7

конечно!
нужно только будет поправить все релоки

Ранг: 3.2 (гость)
Статус: Участник

Создано: 5 июня 2013 09:17 · Поправил: yarcom New!
Цитата · Личное сообщение · #8

reversecode пишет:
конечно!
нужно только будет поправить все релоки
Чуточку подробнее если можно. Или ссылку на инструкцию именно к такому случаю. И еще такой момент, даст ли мне это какие-нибудь преимущества по сравнению с созданием новой секции? Потому как не могу понять в чем причина, но моя "внешняя" функция не работает так как стандартная, хотя все ссылки call переделал на исходные. Т.е. при одинаковом вызове, делаю new origin на моей процедуре, все выполняется также, кроме того что где-то в недрах ntdll выходит непонятный ексепшн. На стандартной все нормально...


Ранг: 544.6 (!)
Статус: Участник
оптимист

Создано: 5 июня 2013 09:52 New!
Цитата · Личное сообщение · #9

reversecode пишет:
нужно только будет поправить все релоки

причём релоки к обычному CALL вызову?
yarcom пишет:
о при всей одинаковости байт, у меня все вызовы вложенных процедур (call адрес) указывают на совершенно левые места

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

Ранг: 53.9 (постоянный)
Статус: Участник

Создано: 5 июня 2013 09:57 New!
Цитата · Личное сообщение · #10

yarcom пишет:
Процедура это копия оригинальной, с небольшими изменениям.

Если изменения действительно небольшие, то почему просто не пропатчить эту процедуру ?
Для мест где необходима вставка кода можно делать прыжки на код вставленный в пустое место туда/обратно (с исполнением затертых инструкций).
И еще не понятно зачем менять точку входа.


Ранг: 1024.9 (!!!!)
Статус: Участник

Создано: 5 июня 2013 10:14 · Поправил: reversecode New!
Цитата · Личное сообщение · #11

ClockMan пишет:
причём релоки к обычному CALL вызову?

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

yarcom пишет:
Просто конец надо немного растянуть...

на баш?

Ранг: 3.2 (гость)
Статус: Участник

Создано: 5 июня 2013 10:19 · Поправил: yarcom New!
Цитата · Личное сообщение · #12

Zorn пишет:
Для мест где необходима вставка кода можно делать прыжки на код вставленный в пустое место туда/обратно (с исполнением затертых инструкций).

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

Zorn пишет: И еще не понятно зачем менять точку входа. Просто делал по инструкции из статьи приведенной выше. Пробовал не менять, но олли показывает совсем не то что хотелось бы...

reversecode пишет: он хотел расширить секцию кода что бы вставить свой код в средину, Зачем же в середину, можно и конец. Просто конец надо немного растянуть...


Ранг: 1024.9 (!!!!)
Статус: Участник

Создано: 5 июня 2013 10:35 New!
Цитата · Личное сообщение · #13

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

Ранг: 3.2 (гость)
Статус: Участник

Создано: 5 июня 2013 10:46 New!
Цитата · Личное сообщение · #14

reversecode пишет:
внимательнее читайте кому и что отвечаете,
не надо мне приписывать ответы которые я не говорил
Прошу прощение, заработался.
Но все-таки хотелось бы услышать ответы.


Ранг: 334.2 (мудрец)
Статус: Участник
born to be evil

Создано: 5 июня 2013 15:10 New!
Цитата · Личное сообщение · #15

yarcom пишет:
все вызовы вложенных процедур (call адрес) указывают на совершенно левые места

при обычных call (E8) надо править относительные адреса. при абсолютных call far (FF 15) - надо корректировать релоки, или менять их на относительные E8. да, еще вариант для абсолютных - типа call $+5, pop eax, add eax,xxx, call eax

Ранг: 49.7 (посетитель)
Статус: Участник

Создано: 5 июня 2013 19:04 New!
Цитата · Личное сообщение · #16

yarcom возьми MultiAsm и не парься
плагин для Олли, всмысле.

Ранг: 0.6 (гость)
Статус: Участник

Создано: 5 июня 2013 23:45 New!
Цитата · Личное сообщение · #17

Господа, причем тут вообще релоки ? Автору поста нужно скопировать процедуру в другую секцию, а если мы применим релоки то все call'ы абсолютные в новой процедуре будут указзывать на новые поправленные невалидные адреса, вся проблема в относительных call'ax их и надо править.

Ранг: 99.6 (постоянный)
Статус: Участник

Создано: 7 июня 2013 14:10 New!
Цитата · Личное сообщение · #18

yarcom
В плагине ODbgScript с помощью инструкций alloc, exec - ende
можно вставить в программу и выполнить ассемблерный код. Может вам подойдет.

Ранг: -2.1 (нарушитель)
Статус: Участник

Создано: 8 июня 2013 14:31 New!
Цитата · Личное сообщение · #19

Я задался тем же вопросом. Вижу такой путь:

1. получить .asm из Иды.
2. выдрать оттуда все сегменты данных, переменные которых нужны
3. получить .map из Иды со всеми символами, кроме локальных.
4. получить болванки сегментов кода из .map заполненные nop (90h). Все символы будут метками в этих сегментах по нужным смещениям.
5. скомпоновать болванки сегментов кода, сегменты данных и все остальные сегменты заменённые на болванки в правильном порядке в одном .asm файле. Проследить, чтобы размеры сегментов совпадали с размерами в исходном экзешнике.
6. добавить туда свой сегмент кода в конце, содержащий свой ассемблерный код или stub для вызова C (если это необходимо в силу несовпадения calling convention).
7. скомпилировать всё это безобразие, убедиться что новом коде адреса по вызовам и переменным совпадают с адресами в оригинальном экзешнике.
8. откусить новый сегмент из нового экзешника, прилепить к старому экзешнику, пересчитать заголовки.
9. пропатчить старый код -- заменить старые вызовы на новые.
10. запустить всё это безобразие, убедиться что всё зависло, найти все ошибки, исправить.

Как раз пишу скрипт для осуществления 2. и 4. Вместо 1. и 2. можно также воспользоваться .map файлом для BSS сегмента (неинициализированных данных).

Ранг: 3.2 (гость)
Статус: Участник

Создано: 9 июня 2013 18:21 · Поправил: yarcom New!
Цитата · Личное сообщение · #20

Всем спасибо. Уже сам разобрался. Сделал так:
1. Создал новую секцию.
2. Скопировал туда код процедуры.
3. Перебил все callы
4. Записал в файл.
5. Долго мучался с отладкой, в итоге все получилось. )


Ранг: 2006.0 (!!!!)
Статус: Модератор
retired

Создано: 9 июня 2013 18:30 New!
Цитата · Личное сообщение · #21

Видимо, на этом можно закрыть.
 eXeL@B —› Вопросы новичков —› Как вставить в код новую процедуру.
Эта тема закрыта. Ответы больше не принимаются.

Видеокурс ВЗЛОМ