Сейчас на форуме: asfa, bartolomeo (+7 невидимых)

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

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

Создано: 28 июня 2012 03:54 · Поправил: Dynamic
· Личное сообщение · #1

Доброго времени суток! Есть приложение без исходников. Между кодом функций видим:
Code:
  1. 0075E9C3     CC             INT3
  2. 0075E9C4     CC             INT3
  3. 0075E9C5     CC             INT3
  4. 0075E9C6     CC             INT3
  5. 0075E9C7     CC             INT3
  6. 0075E9C8     CC             INT3
  7. 0075E9C9     CC             INT3
  8. 0075E9CA     CC             INT3

Хотелось бы написать утилиту, в учебных целях, которая уберет/сократит промежутки между функциями.
Исходя из этого, мне необходимо будет пофиксить абсолютные и относительные ссылки. С фиксом абсолютных проблем не должно возникнуть. Собираюсь использовать данные, которые лежат в .reloc секции. А как же мне быть с фиксом относительных ссылок? Каким образом мне находить места, которые возможно нуждаются в правке?




Ранг: 158.5 (ветеран), 219thx
Активность: 0.120.01
Статус: Участник

Создано: 28 июня 2012 05:47 · Поправил: ZaZa
· Личное сообщение · #2

А какой в этом смысл? Уменьшить размер?
А что делать с теми функциями (процедурами), которые вызываются динамически, то есть примерно так:
Code:
  1. MOV EAX, 00456789
  2. CALL [EAX]

А если значение, по которому будем вызывать высчитывается?
А что делать с упакованными файлами?
Я считаю: проблем много, выгоды никакой...

Update:
Придется писать анализатор. Ведь если ты уберешь лишние байты в начале файла, то тебе придется менять все ссылки, которые находятся ниже по коду...

-----
One death is a tragedy, one million is a statistic.


| Сообщение посчитали полезным: Dynamic

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

Создано: 28 июня 2012 06:09 · Поправил: Dynamic
· Личное сообщение · #3

ZaZa пишет:
А какой в этом смысл?

Смысл в том, что бы реализовать механизм. Не более.

ZaZa пишет:
то есть примерно так:

Вы привели пример с абсолютной ссылкой, которую я найду с помощью данных в секции .reloc и поправлю.

ZaZa пишет:
А что делать с упакованными файлами?

Мне нужно реализовать утилиту, которая будет работать с моим образцом. Так что универсальность мне не нужна.




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

Создано: 28 июня 2012 11:58
· Личное сообщение · #4

В общем случае написать это без вариантов. В частном-пиши полный анализатор типа иды и всячески помогай ему при помощи map, pdb, интерактивно и тд.

| Сообщение посчитали полезным: ajax, Dynamic

Ранг: 39.4 (посетитель), 9thx
Активность: 0.01=0.01
Статус: Участник

Создано: 28 июня 2012 13:21
· Личное сообщение · #5

Dynamic пишет:
Вы привели пример с абсолютной ссылкой, которую я найду с помощью данных в секции .reloc и поправлю.

смелые планы, эта секция далеко не всегда будет в наличии

| Сообщение посчитали полезным: Dynamic

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

Создано: 28 июня 2012 13:51 · Поправил: Dynamic
· Личное сообщение · #6

ZaZa пишет:
Update:
Придется писать анализатор. Ведь если ты уберешь лишние байты в начале файла, то тебе придется менять все ссылки, которые находятся ниже по коду...

Верно. Так и планировал. Сейчас проблема в поиске мест с относительными ссылками.

2nd пишет:
смелые планы, эта секция далеко не всегда будет в наличии

А мне универсальности и не надо. Главное что в моем EXE она есть.


Возможно есть способы собрать адреса мест в секции кода, которые содержат относительные ссылки? Возможно с помощью плагинов/скриптов к OllyDbg?

------------------------------------------
Добавлено:

Если вариантов нету, то буду писать парсер листинга OllyDbg

Какие команды кроме CALL и всех видов прыжков мне надо учесть?




Ранг: 158.5 (ветеран), 219thx
Активность: 0.120.01
Статус: Участник

Создано: 29 июня 2012 23:11
· Личное сообщение · #7

Dynamic пишет:
Какие команды кроме CALL и всех видов прыжков мне надо учесть?


Вот такую, например:
Code:
  1. PUSH 00401000
  2. RET


-----
One death is a tragedy, one million is a statistic.




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

Создано: 29 июня 2012 23:31 · Поправил: Dynamic
· Личное сообщение · #8

401000 - абсолютный адрес, а не относительный. Так что его я найду в .reloc

ZaZa пишет:
А если значение, по которому будем вызывать высчитывается?


Ну дык в основе просчетов будет лежать адрес, который зависит от ImageBase. Опять поможет .reloc



Ранг: 39.4 (посетитель), 9thx
Активность: 0.01=0.01
Статус: Участник

Создано: 30 июня 2012 00:46 · Поправил: 2nd
· Личное сообщение · #9

Dynamic пишет:
Ну дык в основе просчетов будет лежать адрес, который зависит от ImageBase. Опять поможет .reloc

от ImageBase он зависит, но reloc тут может и не помочь, грубо говоря
Code:
  1.      call  xxx
  2. xxx: pop eax
  3.      jmp  eax+245h


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



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

Создано: 30 июня 2012 02:08 · Поправил: Dynamic
· Личное сообщение · #10

В примере от ZaZa .reloc поможет 100 %, ибо адрес абсолютный.

Я понимаю, что можно придумать ситуации, при которых решить задачу будет весьма сложно.
Мое приложение скомпилировано с помощью VS2008 и таких сложностей в нем нету.

Можете привести пример кода, при компилировании которого будут строится jmp, которые "прыгают" по функциям и при расчете учитывают промежутки между ними?




Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 30 июня 2012 04:39
· Личное сообщение · #11

Archer пишет:
В частном-пиши полный анализатор типа иды и всячески помогай ему при помощи map, pdb, интерактивно и тд.

Анализатор написать несложно, всего лишь нужно потратить время, кучу нейромедиаторов (серого вещества, проще говоря), побороть лень и преодолеть не один психологический барьер.

Dynamic
Схема примерно такая:
Дизасм раскладывает загруженный код на функции, функции на блоки, блоки на структуры с инструкциями. Каждый блок представляет собой вершину графа с исходящими к другим вершинам ветвями и входящими - ветвления, граф - функция, весь код - система графов. Раскладывая код, обнаруживаются места, требующие анализа, который можно проводить ходом назад по полученным структурам с инструкциями и по блокам с выявлением регистров и переменных, которые учавствуют в вычислении адреса прыжка...

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

-----
IZ.RU


| Сообщение посчитали полезным: Dynamic

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

Создано: 04 июля 2012 01:16
· Личное сообщение · #12

У меня получилось. Написал утилиту, которая убрала байты(0xCC...) между кодом функций, пофиксила все абсолютные и относительные ссылки. В конечном результате программа работает.




Ранг: 158.5 (ветеран), 219thx
Активность: 0.120.01
Статус: Участник

Создано: 04 июля 2012 01:56
· Личное сообщение · #13

Dynamic
Молодец! Выкладывай сорцы и закрывай тему, раз проблема решена... Заранее благодарен за понимание!

-----
One death is a tragedy, one million is a statistic.



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