Сейчас на форуме: asfa, Rio, _MBK_, Adler (+9 невидимых)

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

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

Создано: 05 июня 2013 06:22
· Личное сообщение · #1

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




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 05 июня 2013 06:42
· Личное сообщение · #2

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

-----
Give me a HANDLE and I will move the Earth.




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

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

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



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

Создано: 05 июня 2013 06:50
· Личное сообщение · #4

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

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



Ранг: 188.1 (ветеран), 419thx
Активность: 0.140
Статус: Участник

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

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



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

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

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

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




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 05 июня 2013 08:49
· Личное сообщение · #7

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



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

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

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




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 05 июня 2013 09:52
· Личное сообщение · #9

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

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

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

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 53.9 (постоянный), 19thx
Активность: 0.040
Статус: Участник

Создано: 05 июня 2013 09:57
· Личное сообщение · #10

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

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




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

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

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

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

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

на баш?



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

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

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

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

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

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




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 05 июня 2013 10:35
· Личное сообщение · #13

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



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

Создано: 05 июня 2013 10:46
· Личное сообщение · #14

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




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 05 июня 2013 15:10
· Личное сообщение · #15

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

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

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 49.7 (посетитель), 19thx
Активность: 0.050
Статус: Участник

Создано: 05 июня 2013 19:04
· Личное сообщение · #16

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



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

Создано: 05 июня 2013 23:45
· Личное сообщение · #17

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



Ранг: 102.0 (ветеран), 18thx
Активность: 0.070.02
Статус: Участник

Создано: 07 июня 2013 14:10
· Личное сообщение · #18

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



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

Создано: 08 июня 2013 14:31
· Личное сообщение · #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 (гость)
Активность: 0.010
Статус: Участник

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

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




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 09 июня 2013 18:30
· Личное сообщение · #21

Видимо, на этом можно закрыть.


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