![]() |
eXeL@B —› Вопросы новичков —› Как вставить в код новую процедуру. |
Посл.ответ | Сообщение |
|
Создано: 05 июня 2013 06:22 · Личное сообщение · #1 Мне необходимо вставить свою процедуру в код программы. Процедура это копия оригинальной, с небольшими изменениям. Т.к. пустого места было не достаточно, я делал все как указано здесь http://exelab.ru/rar/htm.php?n=084 , т.е. создавал новую секцию, менял точку входа и т.д. Вопрос который меня немного смущает. Это то что Олли перестал воспринимать оригинальную секцию кода как код... Хотя программа работает и запускается. И еще один неприятный момент. Когда я в свою новую секцию вставляю копию оригинальной процедуры (binary copy- binary paste) , то при всей одинаковости байт, у меня все вызовы вложенных процедур (call адрес) указывают на совершенно левые места. Я смутно догадываюсь от чего это может быть, но как с этим бороться не понимаю. Прошу помощи. ![]() |
|
Создано: 05 июня 2013 06:42 · Личное сообщение · #2 |
|
Создано: 05 июня 2013 06:42 · Поправил: zxcoder · Личное сообщение · #3 >Это то что Олли перестал воспринимать оригинальную секцию кода как код Олли смотрит на BaseOfCode и SizeOfCode в PE заголовке >(call адрес) указывают на совершенно левые места call может быть как абсолютным (указывается точный адрес перехода), так и относительным (смещение относительно адреса call'a ) ![]() |
|
Создано: 05 июня 2013 06:50 · Личное сообщение · #4 |
|
Создано: 05 июня 2013 08:31 · Личное сообщение · #5 |
|
Создано: 05 июня 2013 08:44 · Поправил: yarcom · Личное сообщение · #6 |
|
Создано: 05 июня 2013 08:49 · Личное сообщение · #7 |
|
Создано: 05 июня 2013 09:17 · Поправил: yarcom · Личное сообщение · #8 reversecode пишет: конечно! нужно только будет поправить все релоки Чуточку подробнее если можно. Или ссылку на инструкцию именно к такому случаю. И еще такой момент, даст ли мне это какие-нибудь преимущества по сравнению с созданием новой секции? Потому как не могу понять в чем причина, но моя "внешняя" функция не работает так как стандартная, хотя все ссылки call переделал на исходные. Т.е. при одинаковом вызове, делаю new origin на моей процедуре, все выполняется также, кроме того что где-то в недрах ntdll выходит непонятный ексепшн. На стандартной все нормально... ![]() |
|
Создано: 05 июня 2013 09:52 · Личное сообщение · #9 reversecode пишет: нужно только будет поправить все релоки причём релоки к обычному CALL вызову? yarcom пишет: о при всей одинаковости байт, у меня все вызовы вложенных процедур (call адрес) указывают на совершенно левые места потомучто СALL вызова идут относительно секции кода,для рипанья и вставки кода есть спец плагины для олли. ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. ![]() |
|
Создано: 05 июня 2013 09:57 · Личное сообщение · #10 yarcom пишет: Процедура это копия оригинальной, с небольшими изменениям. Если изменения действительно небольшие, то почему просто не пропатчить эту процедуру ? Для мест где необходима вставка кода можно делать прыжки на код вставленный в пустое место туда/обратно (с исполнением затертых инструкций). И еще не понятно зачем менять точку входа. ![]() |
|
Создано: 05 июня 2013 10:14 · Поправил: reversecode · Личное сообщение · #11 |
|
Создано: 05 июня 2013 10:19 · Поправил: yarcom · Личное сообщение · #12 Zorn пишет: Для мест где необходима вставка кода можно делать прыжки на код вставленный в пустое место туда/обратно (с исполнением затертых инструкций). не подходит, процедура одна для запуска кучи плагинов, а мне надо конкретный, при условии что остальные тоже будут запускаться. Zorn пишет: И еще не понятно зачем менять точку входа. Просто делал по инструкции из статьи приведенной выше. Пробовал не менять, но олли показывает совсем не то что хотелось бы... reversecode пишет: он хотел расширить секцию кода что бы вставить свой код в средину, Зачем же в середину, можно и конец. Просто конец надо немного растянуть... ![]() |
|
Создано: 05 июня 2013 10:35 · Личное сообщение · #13 |
|
Создано: 05 июня 2013 10:46 · Личное сообщение · #14 |
|
Создано: 05 июня 2013 15:10 · Личное сообщение · #15 yarcom пишет: все вызовы вложенных процедур (call адрес) указывают на совершенно левые места при обычных call (E8) надо править относительные адреса. при абсолютных call far (FF 15) - надо корректировать релоки, или менять их на относительные E8. да, еще вариант для абсолютных - типа call $+5, pop eax, add eax,xxx, call eax ----- От многой мудрости много скорби, и умножающий знание умножает печаль ![]() |
|
Создано: 05 июня 2013 19:04 · Личное сообщение · #16 |
|
Создано: 05 июня 2013 23:45 · Личное сообщение · #17 |
|
Создано: 07 июня 2013 14:10 · Личное сообщение · #18 |
|
Создано: 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 сегмента (неинициализированных данных). ![]() |
|
Создано: 09 июня 2013 18:21 · Поправил: yarcom · Личное сообщение · #20 |
|
Создано: 09 июня 2013 18:30 · Личное сообщение · #21 |
![]() |
eXeL@B —› Вопросы новичков —› Как вставить в код новую процедуру. |
Эта тема закрыта. Ответы больше не принимаются. |