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

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

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

Создано: 29 ноября 2013 16:15
· Личное сообщение · #1

Хочу сделать базонезависимый код. Есть код, который будет размещаться в пустом месте секции чужой программы. Этот код перебирает все адреса идущие вниз по секции от места внедрения кода (адрес инкрементируется), и попутно ищется определенная комбинация байт. Задача стоит такая, чтоб не выскочить за пределы текущей секции. То-есть ограничить перебор адресов последним адресом секции. Есть-ли какие "хитрые команды", которыми можно определить этот "последний адрес"?
Типа как эта, я ее применил, чтоб определить "текущий адрес".
Code:
  1. call $+5
  2. pop eax





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

Создано: 29 ноября 2013 16:19
· Личное сообщение · #2

LdrFindEntryForAddress/RtlPcToFileHeader() -> IMAGE_SECTION_HEADER.SizeOfRawData

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

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


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

Создано: 29 ноября 2013 16:19 · Поправил: ajax
· Личное сообщение · #3

virtual size секции. считывается из PE заголовка файла:
--> Link <--

Dr0p
не напрягай мосх. чую, это просто мемпатчер. размер нужен для поиска паттерна

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


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

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

Создано: 29 ноября 2013 16:33
· Личное сообщение · #4

Как вариант еще можно через VirtualQuery получить размер




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

Создано: 29 ноября 2013 16:38 · Поправил: Dr0p
· Личное сообщение · #5

ajax

Догадываюсь что он будет делать. PEB.Ldr -> сканим список, находим секцию. Низя, если конечно не стартап код, перед доступом к базе данных лдр необходимо залочить её(LdrLockLoaderLock()), иначе другой поток может чота загружать отгружать, что в конце концов отвалится всё.)



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

Создано: 29 ноября 2013 16:54 · Поправил: Kuzya69
· Личное сообщение · #6

Это будет обычный лоадер. Который загружает этот код в программу-жертву. Этот код найдет нужные байты и пропатчит их. Скажем так, стремлюсь к унивесальности, чтоб не писать одно и тоже под разные версии программ-жертв.




Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 29 ноября 2013 17:31
· Личное сообщение · #7

Вообще да, самое боянистое - прицепить Windows.h, дернуть нужные структуры и посмотреть размер SizeOfRawData) А дальше - просто прибавляем к полученному текущему адресу.

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




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

Создано: 29 ноября 2013 20:36 · Поправил: dosprog
· Личное сообщение · #8

и всё-же -- не RawSize, а VirtSize (как и сказали ajax и Veliant ), если патч памяти. В файле код может быть упакован.

Crawler,
узнали размер SizeOfRawData... А дальше - просто прибавляем к полученному текущему адресу.
-- и что получим в результате?..




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

Создано: 30 ноября 2013 03:51 · Поправил: Dr0p
· Личное сообщение · #9

Именно raw, это размер дисковой секции, без учёта хардверного выравнивания(для не bss верно, но она не executable).

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

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

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

Ну в принципе получилось все. Правда пришлось подумать при изучении РЕ-заголовка.
Всем спасибо!
Просто вызов стандартных апи может у меня обломиться. Например при использовании другого компа, а тем-более другой винды. Да и код получился приятный, короткий.



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

Создано: 30 ноября 2013 13:46
· Личное сообщение · #11

Kuzya69,
...вызов стандартных апи может у меня обломиться. Например при использовании другого компа, а тем-более другой винды.
-- ) Так адреса функций нужно получать через GetProcAddress(), тогда не обломится.

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

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

Создано: 06 декабря 2013 21:26 · Поправил: dosprog
· Личное сообщение · #12

Dr0p,Crawler,
вяло поясню, что имелось в виду. Размер дисковой секции вполне может быть 0, если упакованный код содержится в другой дисковой секции.
Так что же тогда в ней искать, если RawSize==0 ?...

--ADD--
Dr0p,
Возможно, недостаточно чётко сформулировал.
Например, UPX превращает в файле секцию кода в "пустышку" с RawSize=0 и VirtSize = реальный_размер_распакованного_кода, а сам запакованный код в файле лежит в другой секции (специально добавленной UPX'ом). В памяти код распаковывается в свою изначальную секцию и запускается на выполнение, при этом в PE-хидере в памяти для этой секции кода продолжает оставаться RawSize=0.
Ну, да ладно. Не стОит продлевать оффтоп... Просто уточнил сказанное. (Это если рассматривать общий случай).




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

Создано: 06 декабря 2013 23:17
· Личное сообщение · #13

dosprog

Ну если данных на диске нет, то и искать нечего.


 eXeL@B —› Вопросы новичков —› Как найти конец текущей секции?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати