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

 eXeL@B —› Вопросы новичков —› Где начало оверлея
. 1 . 2 . >>
Посл.ответ Сообщение

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

Создано: 08 мая 2016 15:38 · Поправил: Kuzya69
· Личное сообщение · #1

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




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

Создано: 08 мая 2016 15:52
· Личное сообщение · #2

--> Link <--

-----
IZ.RU




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

Создано: 08 мая 2016 15:55
· Личное сообщение · #3

Самый нормальный способ поиска оверлея это по его сигнатуре.
Всё остальное так или иначе способно глючить.



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

Создано: 08 мая 2016 15:57 · Поправил: Kuzya69
· Личное сообщение · #4

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

Думал я об этом, чтоб создать сигнатуру, но боюсь, что вдруг сигнатура встретится в той-же самой таблице сертификатов. Если начинать искать оверлей после последней секции. Или в моем-же байт-коде, если вести поиск сигнатуры с конца файла.




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

Создано: 08 мая 2016 16:08
· Личное сообщение · #5

Kuzya69 пишет:
как определить конец файла

Может, не конец файла, а конец образа?

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


Смотрите по концу последней секции в хидере

Kuzya69 пишет:
Если начинать искать оверлей после последней секции.

Ну правильно ж мыслите. Что, тоже скучно?

Добавлено спустя 3 минуты
Пока тему не закрыли... не грамотен в терминах, поэтому - а что-то вроде "миддлвея" как называется?

-----
IZ.RU




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

Создано: 08 мая 2016 16:12 · Поправил: dosprog
· Личное сообщение · #6

Kuzya69 пишет:
Думал я об этом, чтоб создать сигнатуру, но боюсь, что вдруг сигнатура встретится в той-же самой таблице сертификатов. Если начинать искать оверлей после последней секции.


Во-первых, не встретится, если сигнатуру выбирать старательно,
а во-вторых, ищется она не с конца последней секции вперёд, а с конца файла и назад.
Тогда неожиданностей не будет.





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

Создано: 08 мая 2016 16:13 · Поправил: Kuzya69
· Личное сообщение · #7

DenCoder пишет:
Может, не конец файла, а конец образа?

Какой конец образа? Оверлей-же не проецируется в память, приходится маппировать файл в память, и смотреть его побайтно как файл.

DenCoder пишет:
Смотрите по концу последней секции в хидере

Я же писал, сразу за последней секцией идет сначала таблица сертификатов, а уже потом мой оверлей.


DenCoder пишет:
Ну правильно ж мыслите. Что, тоже скучно?

Ну а тут я совсем не понял.

dosprog пишет:
а во-вторых, ищется она не с конца последней секции вперёд, а с конца файла и назад.
Тогда неожиданностей не быват.

Ну я это и подразумевал, слова не те выбрал, я хотел написать "секции в файле" (а не секции в образе).
Или если имелось ввиду направление поиска, то именно так я и думал. Конец файла, это же конец его последней секции в файле?

dosprog пишет:
Во-первых, не встретится, если сигнатуру выбирать старательно,

Ну, например, можно показать гарантированный вариант, который не может встретиться в коде программы?
Я думал о стринге "overlay", но все равно не уверен на 100%.



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

Создано: 08 мая 2016 16:23 · Поправил: dosprog
· Личное сообщение · #8

Kuzya69 пишет:
Ну, например, можно показать гарантированный вариант, который не может встретиться в коде программы?


db 'DoSpRoG',0



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

Создано: 08 мая 2016 16:32
· Личное сообщение · #9

db 'DoSpRoG',0 =

0х44,0х6F,0х53,0х70,0х52,0х6F,0х47,0х00 =

Code:
  1. $ ==>    >    44            INC ESP
  2. $+1      >    6F            OUTS DX,DWORD PTR ES:[EDI]
  3. $+2      >    53            PUSH EBX
  4. $+3      >  - 70 52         JO SHORT $+52
  5. $+5      >    6F            OUTS DX,DWORD PTR ES:[EDI]
  6. $+6      >    47            INC EDI


Может и встретится,



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 08 мая 2016 16:46 · Поправил: vden
· Личное сообщение · #10

Kuzya69 пишет:
за границей последней секции располагается сначала таблица сертификатов, а уже следом идет этот оверлей

Фактически сертификат в оверлее. Но тут все просто. В data directories явно указано файловое смещение сертификата, не RVA, и размер (IMAGE_DIRECTORY_ENTRY_SECURITY). Складываете смещение + размер = нужное смещение.

Если сертификата нет, тогда оверлей по смещению конца raw data последней не пустой секции.

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

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

Создано: 08 мая 2016 16:48 · Поправил: dosprog
· Личное сообщение · #11

Kuzya69 пишет:
Может и встретится,


Может случиться вообще что угодно. Но, как правило, не случается.



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

Создано: 08 мая 2016 17:00 · Поправил: Kuzya69
· Личное сообщение · #12

vden пишет:
Фактически сертификат в оверлее. Но тут все просто. В data directories явно указано файловое смещение сертификата, не RVA (IMAGE_DIRECTORY_ENTRY_SECURITY). Складываете смещение + размер = нужное смещение.

Это все понятно. Именно так я и определил, что там таблица сертификата, а не оверлей левый. А если вариант, что сертификат перенесут в середину файла, или еще какой-нибудь элемент добавят в data directories? Я так и не нашел полного описания всех элементов в data directories. Только стандартные 0х10 штук. А если "NumberOfRvaAndSizes" будет больше 0х10?



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

Создано: 08 мая 2016 17:01
· Личное сообщение · #13

Kuzya69 пишет:
Я думал о стринге "overlay", но все равно не уверен на 100%.

А в чем проблема ? Открылся файл с атрибутом для чтения, например.Считали его размер, определили некоторую переменную, в которую записали размер.Читаем в цикле файл, уменьшая значение этой переменной, т.е. абсолютное смещение.Определили условие для нахождения строки "overlay" и как только смещение укажет на нужную строку, т.е. в буфер упадет нужная строка фиксированного размера в байтах (искомая сигнатура), то сразу прерываем цикл и сохраняем смещение в другую переменную.Ну и, естественно, строка встретится ровно столько раз, сколько она была определена в файле, а вот строки "DoSpRoG" там никогда не будет, если ее намеренно не вписать.

-----
TEST YOUR MIGHT




Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 08 мая 2016 17:10 · Поправил: vden
· Личное сообщение · #14

Kuzya69 пишет:
Это все понятно. А если вариант, что сертификат перенесут в середину файла, или еще какой-нибудь элемент добавят в data directories? Я так и не нашел полного описания всех элементов в data directories. Только стандартные 0х10 штук. А если "NumberOfRvaAndSizes" будет больше 0х10?


Ну тогда лучше не гадать, а посмотреть как оригинальная программа ищет оверлей.



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

Создано: 08 мая 2016 17:15
· Личное сообщение · #15

vden пишет:
А возможности посмотреть как находит оверлей оригинальная программа нет?

Ну оригинальная программа не ищет оверлея. Оверлей Я хочу прилеплять, без раздумий. Только нет уверенности, что на очередной версии недоделанный алгоритм поиска оверлея не даст сбой. Поэтому и хочется сделать нормальный, универсальный алгоритм поиска оверлея. Не задумываясь потом, может даже не только для этой программы.



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 08 мая 2016 17:25 · Поправил: vden
· Личное сообщение · #16

Такая структура, мне кажется, вполне подойдет:

Тег начала, Данные, Тег конца, Контрольная сумма, Размер

А там уже по усмотрению.



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

Создано: 08 мая 2016 17:31
· Личное сообщение · #17

То-есть получается, нет никакой возможности определить где заканчивается оригинальный файл и начинается оверлей в общем случае? Только частные варианты или использование маркеров?




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 08 мая 2016 17:39
· Личное сообщение · #18

Kuzya69 что за гадание, а если так, а может вот так. нормально можно оверлей доставать, вот 1 минута гугла: https://www.autoitscript.com/forum/topic/153277-pe-file-overlay-extraction/

-----
[nice coder and reverser]




Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 08 мая 2016 17:40 · Поправил: vden
· Личное сообщение · #19

Оверлей всегда начинается после данных последней не пустой секции. Другое дело кто и что хочет добавлять в конец файла.

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



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

Создано: 08 мая 2016 18:15 · Поправил: Kuzya69
· Личное сообщение · #20

Hellspawn пишет:
https://www.autoitscript.com/forum/topic/153277-pe-file-overlay-extraction/

Ну в принципе я это спрашивал в самом первом посту.
Автор скрипта делает допущение, что последние байты оригинального файла - это конец сертификата.
Так и я делаю. Но гложат сомнения, поэтому и открыл тему.
Если бы где-то это правило о конце файла было прописано как закон, то я бы не спрашивал.
Ведь никто не помешает мне изменить файл так, что свой оверлей я поставлю сразу за последней секцией файла, а сертификат после оверлея. Или сертификат поставить между секциями(тут я конечно не уверен). Но можно будет попробовать на какой-нибудь простенькой программе.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 08 мая 2016 18:29
· Личное сообщение · #21

Kuzya69 и что это меняет? если сертификат будет, то о нем должно быть упоминание в таблице, а там и размер и адрес указаны

-----
[nice coder and reverser]


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

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

Создано: 08 мая 2016 18:40
· Личное сообщение · #22

Hellspawn пишет:
и что это меняет?

Ну да поторопился с придумыванием конфликтной ситуации.
Пожалуй только одна ситуация может конфликт дать.
Например количество элементов в data directories будет больше 0х10. И мы не знаем какие параметры для этих (больших чем 0х10) элементов заданы (VA или Rwa). И оказывается, что один из элементов стоит за сертификатом.




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

Создано: 08 мая 2016 20:51 · Поправил: DenCoder
· Личное сообщение · #23

Kuzya69 пишет:
Какой конец образа? Оверлей-же не проецируется в память

мда... Go to school!
Краткий ликбез:
Файлы - на диске
Образ (исполняемый, будь то dll, exe, ocx, scr, или ещё что) - проецируется nt-загрузчиком в память процесса по разделам. За границы разделов, указанные в массиве структур IMAGE_SECTION_HEADER, не выходит. У MapViewOfFile()/ есть аргумент dwDesiredAccess, когда он FILE_MAP_EXECUTE, то происходит именно так, как я сказал. У более низкоуровневой ZwCreateSection(), которой пользуется загрузчик, также есть dwDesiredAccess, и происходит то же, что выше, когда он равен SECTION_MAP_EXECUTE

Добавлено спустя 2 минуты
Kuzya69 пишет:
Но гложат сомнения, поэтому и открыл тему.

При сомнениях проще взять и проверить!

Добавлено спустя 5 минут
Kuzya69
По оверлею простой эксперимент с идой - поставьте на загрузке exe или dll галку на manual load и везде отвечаете "да", пока ида не спросит Вас, нужно ли грузить оверлей. Ильфаку-то поверите? )

Добавлено спустя 19 минут
Kuzya69 пишет:
Например количество элементов в data directories будет больше 0х10

Оно никогда на винде не будет больше! Потому как в WinNt.h прописано
Code:
  1. #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16


Ладно, если б не было документировано, понятно ещё - что ж делать, надо спрашивать... Но это всё уже давным давно открыто...

2004 год. Мне было интересно узнать формат PE Header'а, интернета не было. Съездил на книжный рынок, купил книгу Румянцева "Исследование программ Win32. До дизассемблера и отладчика." А Вы тут пурги нагнали с вагон!!!

-----
IZ.RU


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

Ранг: 16.3 (новичок), 2thx
Активность: 0.030
Статус: Участник

Создано: 08 мая 2016 21:10 · Поправил: VT-x
· Личное сообщение · #24

Kuzya69
Разве сертификат не станет не валидным, если вы файл измените в том же EOF?
Оверлей обычно так смотрю
Code:
  1. PIMAGE_DOS_HEADER pidh= (PIMAGE_DOS_HEADER)lpBuff;
  2. PIMAGE_NT_HEADERS pinh= PIMAGE_NT_HEADERS(DWORD(lpBuff) + DWORD(pidh->e_lfanew));
  3. PIMAGE_OPTIONAL_HEADER pioh =&(pinh->OptionalHeader);
  4. //Последняя секция
  5. PIMAGE_SECTION_HEADER pish = (PIMAGE_SECTION_HEADER)&lpBuff[pidh->e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * (pinh->FileHeader.NumberOfSections-1)];
  6. DWORD dwOvrStartNoAlign = pish->PointerToRawData + pish->SizeOfRawData;
  7. DWORD dwOvrStartAlign = ALIGN_UP(dwOvrStartNoAlign,pioh->SectionAlignment);
  8. if(dwOvrStart!=dwOvrStartNoAlign) /*not aligned*/ dwNormOvrStart =  dwOvrStartAlign;





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

Создано: 08 мая 2016 21:19
· Личное сообщение · #25

VT-x
2 строки лишние

нормально будет
Code:
  1. dwNormOvrStart = ALIGN_UP((pish->PointerToRawData + pish->SizeOfRawData), pioh->SectionAlignment);


-----
IZ.RU




Ранг: 16.3 (новичок), 2thx
Активность: 0.030
Статус: Участник

Создано: 08 мая 2016 21:29
· Личное сообщение · #26

Просто очень часто школоло поделки попадают на вход в крипт с noaligned EOF )




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

Создано: 08 мая 2016 21:32 · Поправил: DenCoder
· Личное сообщение · #27

Да, и, кстати, про VirtualSize не забывайте, оно никогда не выровнено по границе. И всё, что свыше VirtualSize, не загрузится )

Добавлено спустя 4 минуты
VT-x пишет:
Просто очень часто школоло поделки попадают на вход в крипт с noaligned EOF

И? У Вас код аналогичен
Code:
  1. = c;
  2. = ALIGN_UP(a, ALIGNMENT);
  3. if(!= b) OverlayStart = b;

Внимательней посмотрите

Добавлено спустя 58 минут
Проще говоря правильней будет
Code:
  1. OverlayStart = pish->PointerToRawData + pish->VirtualSize


Добавлено спустя 59 минут
Если не прав - поправьте.

Добавлено спустя 1 час 3 минуты
Длина оверлея будет:
Code:
  1. OverlaySize = GetFileSize(hFile, NULL) - pish->PointerToRawData + pish->VirtualSize


Добавлено спустя 1 час 6 минут
Я забыл, что в файлах, накрытых вмпротом, например, не факт, что именно за последней секцией будет оверлей. Правильней будет сказать - за секцией с максимальным конечным адресом

-----
IZ.RU





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 08 мая 2016 23:14
· Личное сообщение · #28

DenCoder поправляю, при чем тут VirtualSize вообще?))) и к последней секции не имеет смысла цепляться, нужно перечислить все. ну и выравнивание учесть желательно для размера.

вот код https://www.strchr.com/creating_self-extracting_executables

Code:
  1.  // For each section
  2.   DWORD maxpointer = 0, exesize = 0;
  3.   for(int i = 0; i < header->FileHeader.NumberOfSections; i++) {
  4.     if(sectiontable->PointerToRawData > maxpointer) {
  5.       maxpointer = sectiontable->PointerToRawData;
  6.       exesize = sectiontable->PointerToRawData +
  7.         sectiontable->SizeOfRawData;
  8.     }
  9.     sectiontable++;
  10.   }
  11.  
  12.   // Seek to the overlay
  13.   DWORD filesize = GetFileSize(hFile, NULL);
  14.   SetFilePointer(hFile, exesize, NULL, FILE_BEGIN);
  15.   data = (BYTE*)malloc(filesize - exesize + 1);
  16.   ReadFile(hFile, data, filesize - exesize, &read, NULL);
  17.   CloseHandle(hFile);


-----
[nice coder and reverser]


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


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

Создано: 09 мая 2016 00:16
· Личное сообщение · #29

Ну может чего подзабыл, завтра посмотрю )

-----
IZ.RU




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

Создано: 09 мая 2016 01:47 · Поправил: dosprog
· Личное сообщение · #30

Kuzya69 пишет:
То-есть получается, нет никакой возможности определить где заканчивается оригинальный файл и начинается оверлей в общем случае?


Как это - "нет способов?"
Конец последней секции, описанной в заголовке, это и есть начало оверлея.
Что-то, гляжу, обсуждение по кругу пошло.

DenCoder пишет:
Я забыл, что в файлах, накрытых вмпротом, например, не факт, что именно за последней секцией будет оверлей. Правильней будет сказать - за секцией с максимальным конечным адресом

Так это и есть последняя секция, описанная заголовке.

Kuzya69 пишет:
Ну оригинальная программа не ищет оверлея. Оверлей Я хочу прилеплять, без раздумий.


Возня с оверлеями это костыльный вариант.
Впрочем, если сделать всё по уму, то работать будет.




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


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