eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: DeeDee (+2 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

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

Ранг: 3.3 (гость)
Статус: Участник

Создано: 31 августа 2017 16:14 · Поправил: alex-rudenkiy New!
Цитата · Личное сообщение · #1

Здравствуйте, я хочу добавить CODE секцию в программу вручную, ну в общем, я добавляю в Section Header описание своей секции lol, затем меняю в заголовке число секций с 3 на 4, ну вот, потом добавляю байт-код (он не рабочий, чиста для примера) и потом пытаюсь его запустить в ollydbg, вроде-бы схема должна быть рабочей, но он даже не открывается, error вылетает, что делать, подскажите пожалуйста :

Name VirtSize VirtAddr SizeRaw PtrRaw Flags Pointing Directories
-------------------------------------------------------------------------------------------
.text 00003A56h 01001000h 00003C00h 00000400h 60000020h Import Table
.lol 00000050h 0100A200h 00000050h 0001D430h E0000020h
.data 00000B98h 01005000h 00000200h 00004000h C0000040h
.rsrc 00019160h 01006000h 00019200h 00004200h 40000040h Resource Table


{ Атач доступен только для участников форума } - Winmine__XP - с секцией.rar

Ранг: 125.6 (ветеран)
Статус: Участник

Создано: 31 августа 2017 16:44 New!
Цитата · Личное сообщение · #2

Почему бы не использовать инструментарий и не мучаться, если PE формат не ваша сильная сторона?

Ранг: 3.3 (гость)
Статус: Участник

Создано: 31 августа 2017 16:48 · Поправил: alex-rudenkiy New!
Цитата · Личное сообщение · #3

VOLKOFF пишет:
Почему бы не использовать инструментарий и не мучаться, если PE формат не ваша сильная сторона?

Потому-что хотелось как раз поближе и познакомится с PE, я вкурсе что есть такая возможность в ida, не всю же жизнь пользоваться крэкерскими приблудами


Ранг: 132.0 (ветеран)
Статус: Участник
Qt Developer

Создано: 31 августа 2017 17:32 · Поправил: hors New!
Цитата · Личное сообщение · #4

alex-rudenkiy пишет:
Здравствуйте, я хочу добавить CODE секцию в программу вручную, ну в общем, я добавляю в Section Header описание своей секции lol, затем меняю в заголовке число секций с 3 на 4, ну вот, потом добавляю байт-код (он не рабочий, чиста для примера) и потом пытаюсь его запустить в ollydbg, вроде-бы схема должна быть рабочей, но он даже не открывается, error вылетает, что делать, подскажите пожалуйста :


Описание новой секции нужно добавлять в конец таблицы секций, а не вставлять в середину, как у Вас.

Ранг: 3.3 (гость)
Статус: Участник

Создано: 31 августа 2017 17:47 · Поправил: alex-rudenkiy New!
Цитата · Личное сообщение · #5

hors пишет:
Описание новой секции нужно добавлять в конец таблицы секций, а не вставлять в середину, как у Вас.

Не помогает


Ранг: 8.9 (гость)
Статус: Участник

Создано: 31 августа 2017 23:56 · Поправил: dezmand07 New!
Цитата · Личное сообщение · #6

можно кодом добавить
Code:
  1. DWORD align(DWORD size, DWORD align, DWORD addr){
  2.     if (!(size % align)) return addr + size;
  3.     return addr + (size / align + 1) * align;
  4. }
  5.  
  6. bool AddSection(char *filepath, char *sectionName, DWORD sizeOfSection){
  7.     HANDLE file = CreateFile(filepath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  8.     if (file == INVALID_HANDLE_VALUE)  return false;
  9.  
  10.     DWORD fileSize = GetFileSize(file, NULL);
  11.  
  12.     BYTE *pByte = new BYTE[fileSize];
  13.     DWORD dw;
  14.  
  15.     ReadFile(file, pByte, fileSize, &dw, NULL);
  16.  
  17.     PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)pByte;
  18.     if (dos->e_magic != IMAGE_DOS_SIGNATURE) return false;
  19.  
  20.     PIMAGE_FILE_HEADER FH = (PIMAGE_FILE_HEADER)(pByte + dos->e_lfanew + sizeof(DWORD));
  21.     PIMAGE_OPTIONAL_HEADER OH = (PIMAGE_OPTIONAL_HEADER)(pByte + dos->e_lfanew + sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER));
  22.     PIMAGE_SECTION_HEADER SH = (PIMAGE_SECTION_HEADER)(pByte + dos->e_lfanew + sizeof(IMAGE_NT_HEADERS));
  23.  
  24.     ZeroMemory(&SH[FH->NumberOfSections], sizeof(IMAGE_SECTION_HEADER));
  25.     CopyMemory(&SH[FH->NumberOfSections].Name, sectionName, IMAGE_SIZEOF_SHORT_NAME);
  26.  
  27.     SH[FH->NumberOfSections].Misc.VirtualSize = align(sizeOfSection, OH->SectionAlignment, 0);
  28.     SH[FH->NumberOfSections].VirtualAddress = align(SH[FH->NumberOfSections - 1].Misc.VirtualSize, OH->SectionAlignment, SH[FH->NumberOfSections - 1].VirtualAddress);
  29.     SH[FH->NumberOfSections].SizeOfRawData = align(sizeOfSection, OH->FileAlignment, 0);
  30.     SH[FH->NumberOfSections].PointerToRawData = align(SH[FH->NumberOfSections - 1].SizeOfRawData, OH->FileAlignment, SH[FH->NumberOfSections - 1].PointerToRawData);
  31.     SH[FH->NumberOfSections].Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;
  32.  
  33.     SetFilePointer(file, SH[FH->NumberOfSections].PointerToRawData + SH[FH->NumberOfSections].SizeOfRawData, NULL, FILE_BEGIN);
  34.     SetEndOfFile(file);
  35.     OH->SizeOfImage = SH[FH->NumberOfSections].VirtualAddress + SH[FH->NumberOfSections].Misc.VirtualSize;
  36.     FH->NumberOfSections += 1;
  37.     SetFilePointer(file, 0, NULL, FILE_BEGIN);
  38.     WriteFile(file, pByte, fileSize, &dw, NULL);
  39.     CloseHandle(file);
  40.     return true;
  41. }

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



Ранг: 533.2 (!)
Статус: Участник
оптимист

Создано: 1 сентября 2017 01:08 New!
Цитата · Личное сообщение · #7

alex-rudenkiy пишет:
Не помогает

1 Берём калькулятор программиста
2. Высчитываем начало виртуальной секции и RAW данные, берём начало предыдущей секции и прибавляем её размер 01006000 + 1А000(округляем) = 1020000 и 4200 + 19200 = 1D400 а у вас другие значения
3. прежде чем писать секцию надо убедится что у файла нет оверлея
4. после внесённых изменения правим кол во секций и меняем Image size

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



Ранг: 291.1 (наставник)
Статус: Участник

Создано: 1 сентября 2017 01:23 · Поправил: difexacaw New!
Цитата · Личное сообщение · #8

alex-rudenkiy

> error вылетает, что делать, подскажите пожалуйста :

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

FLG_SHOW_LDR_SNAPS и смотрим суть поломки.


Ранг: 533.2 (!)
Статус: Участник
оптимист

Создано: 1 сентября 2017 02:28 New!
Цитата · Личное сообщение · #9

difexacaw пишет:
FLG_SHOW_LDR_SNAPS и смотрим суть поломки.

Посоветовал хирург сантехнику как операцию на сердце сделать

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


Ранг: 125.6 (ветеран)
Статус: Участник

Создано: 1 сентября 2017 02:45 · Поправил: VOLKOFF New!
Цитата · Личное сообщение · #10

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

alex-rudenkiy пишет:
Не помогает

Возьми же наконец CFFE кликни 2 раза мышкой чтобы добавить твою многострадальную секцию правильно и сравни с тем, что делаешь ты. Плюс сразу увидишь много подсвеченных ошибок PE полей (понимая что ошибки не в них непосредственно а из-за поломки структуры хидера твоими изящными вставками)

P.S.
Professional PE Explorer (для большей иронии название полное ) на вашем сэмпле просто крашится в нирвану. Черканул аффтару про этот и еще старый баг, в прошлый раз он быстро пофиксил.

| Сообщение посчитали полезным: ajax, alex-rudenkiy, difexacaw, sefkrd



Ранг: 329.2 (мудрец)
Статус: Участник
born to be evil

Создано: 1 сентября 2017 11:11 · Поправил: ajax New!
Цитата · Личное сообщение · #11

тему об улучшениях форума снесли, так понимаю? в пи хомячка, посты после нескольких дней. clerk, это для того, чтоб народ гуглил и т.п. каждый 2 ньюб регается для хелпа "прям щас", не втыкая в мануалы
hors
вау, ты еще тут появляешься где апдейды die?

Ранг: 3.3 (гость)
Статус: Участник

Создано: 1 сентября 2017 14:50 New!
Цитата · Личное сообщение · #12

VOLKOFF пишет:
CFFE

А что это за инструмент такой, полное название можно?

Добавлено спустя 18 минут
ClockMan пишет:
прежде чем писать секцию надо убедится что у файла нет оверлея

Наверное не стоило бы мне это спрашивать, но а причём здесь оверлей, если он в память не грузится и нам по идее всё-равно должно быть на overlay?

Overlay - это всё то, что находится за последней секцией как я помню.

Ранг: 15.7 (новичок)
Статус: Участник

Создано: 1 сентября 2017 15:11 New!
Цитата · Личное сообщение · #13

alex-rudenkiy пишет:
А что это за инструмент такой, полное название можно?


CFF Explorer

Ранг: 3.3 (гость)
Статус: Участник

Создано: 1 сентября 2017 15:48 · Поправил: alex-rudenkiy New!
Цитата · Личное сообщение · #14

VOLKOFF пишет:
Возьми же наконец CFFE кликни 2 раза мышкой чтобы добавить твою многострадальную секцию правильно

Ну всё, секция добавлена, думал всё, славу богу, но не тут то было, при запуске программа сразу же крашится ...



Пишет "Ошибка при запуске приложения (0xc000007b)...", может он что-то забывает на автомате делать?


Ранг: 533.2 (!)
Статус: Участник
оптимист

Создано: 1 сентября 2017 15:51 New!
Цитата · Личное сообщение · #15

alex-rudenkiy пишет:
а причём здесь оверлей, если он в память не грузится

Всё с вами понятно свободы

Ранг: 3.3 (гость)
Статус: Участник

Создано: 1 сентября 2017 15:54 New!
Цитата · Личное сообщение · #16

ClockMan пишет:
Всё с вами понятно свободы

Ну а что, я --> здесь <-- прочитал

Ранг: 125.6 (ветеран)
Статус: Участник

Создано: 1 сентября 2017 15:59 New!
Цитата · Личное сообщение · #17

ClockMan пишет:
Всё с вами понятно

Практика показывает, что не стоит ждать чего-то выдающегося от человека называющего секции lol, kek и fuck

alex-rudenkiy пишет:
но не тут то было

ну уж с такой тулзой зафакапить создание секции это надо постараться Искренний респект


Ранг: 533.2 (!)
Статус: Участник
оптимист

Создано: 1 сентября 2017 16:01 New!
Цитата · Личное сообщение · #18

alex-rudenkiy пишет:
c000007b

STATUS_INVALID_IMAGE_FORMAT

Добавлено спустя 1 минуту
VOLKOFF пишет:
lol, kek и fuck

Я заметил какойто юных недовирусописатель

Ранг: 3.3 (гость)
Статус: Участник

Создано: 1 сентября 2017 18:58 · Поправил: alex-rudenkiy New!
Цитата · Личное сообщение · #19

VOLKOFF пишет:
fuck

ну блин, я смотрю data (4 буквы), text (4 буквы), rsrc (4 буквы), так ещё у меня нечего и не получается, злой и написал первое что в голову пришло

Добавлено спустя 4 минуты
Так вы не вкурсе, в чём косяк? Ох, опять всё самому разбираться )

Добавлено спустя 15 минут
Я помню в последний раз меня так сильно выбесила модель MVVM в C#.net, особенно после того как ты всю жизнь делал линейный (скорее всего не правильно называю) программы, а там сплошные binding'и и ещё эта структура только чего стоит Model, ViewModel, View, я тогда помню вообще поник, нужно же так придумать названия, ну вроде-бы потом разобрался и программы норм стали получаться


Ранг: 307.7 (мудрец)
Статус: Участник

Создано: 1 сентября 2017 19:55 New!
Цитата · Личное сообщение · #20

вариант для winmine.exe: после добавления секции с "начинкой", запусти - сразу как файл получится нерабочим - пожми его ASPackом. Запусти. Magic ?


Ранг: 291.1 (наставник)
Статус: Участник

Создано: 2 сентября 2017 02:15 New!
Цитата · Личное сообщение · #21

VOLKOFF

> Это же его "фишка" - дать вполне корректный "умный" ответ который хотя бы частично попадает в зону тематики

Да, согласен; это моя ошибка. Я не вдовался в тех детали, так как небыло времени, а описал общее решение классической задачи - любое действие юзер загрузчика логгируется.

В данном случае это не годится, как не странно

Процесс создаётся из секции(обьект), они бывают трёх типов. Создание процесса это создание конвеера на основе образа который создатся ранее как image-секция. Именно на этом этапе ядро выполняет валидации.

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

Если углубиться в детали, то фейл создания секции можно узнать только отладив в км, место около MiCreateImageFileMap() -> MiVerifyImageHeader().

Следует заметить что так как этим механизмам уделяется особое внимание по выше описанной причине, то они активно допиливаются. И в более новой версии системы валидации изменены до не узнаваемости(2k:creasect.c).

Я не стал писать сразу это всё, так как думал что проблема с юзер загрузчиком.

Добавлено спустя 12 минут
ajax

> это для того, чтоб народ гуглил

Да, достаточно для поиска. Давайте посмотрим:

Первая ссылка в гугле на мс --> Link <--

Находим нашу опцию --> Link <--

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

Если же отладчик какой то фейл выдаёт - нет проблем, открываем им же самого себя, ставим останов на NtCreateSection и получаем статус - bad image.


Ранг: 582.6 (!)
Статус: Модератор
Research & Development

Создано: 2 сентября 2017 22:48 New!
Цитата · Личное сообщение · #22

alex-rudenkiy
Для Hiew есть плагин PeVerify ver 0.43, он показывает, какие конкретные ошибки в файле.

А на счёт твоей конкретной ошибки (STATUS_INVALID_IMAGE_FORMAT), то полагаю, что ты не подумал о размере образа в памяти.
Считай SizeOfImage, когда увеличиваешь размер образа.

Тебе пригодится, изучай:
PE Format Poster (pe101.pdf)
PE Format Poster Detailed (pe1012.pdf)
Portable executable (Картинка)

Ранг: 407.9 (мудрец)
Статус: Участник

Создано: 3 сентября 2017 09:40 · Поправил: dosprog New!
Цитата · Личное сообщение · #23

К сожалению, тот плагин PEVerify чаще выдаёт информацию, которую понимает только его автор,
- пользу от того плагина можно оценить только в 10-20%, имхо.

Jupiter пишет:
Кривой SizeOfImage, полагаю, покажет.


Покажет..

К тому плагину был бы уместен объёмный документейшен, которого нету.


Ранг: 582.6 (!)
Статус: Модератор
Research & Development

Создано: 3 сентября 2017 14:57 New!
Цитата · Личное сообщение · #24

dosprog
Кривой SizeOfImage, полагаю, покажет.


Ранг: 329.2 (мудрец)
Статус: Участник
born to be evil

Создано: 3 сентября 2017 15:17 New!
Цитата · Личное сообщение · #25

Jupiter
CFF корректит сайз


Ранг: 582.6 (!)
Статус: Модератор
Research & Development

Создано: 4 сентября 2017 11:26 New!
Цитата · Личное сообщение · #26

ajax
Ну так ТС то код пишет, ему ж надо вроде как разбираться (я надеюсь)


Ранг: 329.2 (мудрец)
Статус: Участник
born to be evil

Создано: 4 сентября 2017 16:39 New!
Цитата · Личное сообщение · #27

Jupiter
сырков уйма. нюанс, что ТС не хочет гуглить. о чем мой первый пост в этой ветке


Ранг: 582.6 (!)
Статус: Модератор
Research & Development

Создано: 4 сентября 2017 17:04 New!
Цитата · Личное сообщение · #28

ajax
Я дал ссылки как на краткие (для ленивых) так и на очень подробные схемы-описания от Ange Albertini (corkami), так что даже если ТС предпочитает обучаться, не слизывая с чужих сорсов, то и в этом случае ему должно помочь.
Так то всяких библиотек для работы с PE предостаточно. От небольших до фреймворков.


Ранг: 291.1 (наставник)
Статус: Участник

Создано: 4 сентября 2017 17:35 · Поправил: difexacaw New!
Цитата · Личное сообщение · #29

Jupiter

> ему ж надо вроде как разбираться

Давайте взглянем.

Трассируем MiCreateImageFileMap(), причём делаем это на XP, так как для неё имеются сурки. Находим место с фейлом:

-> STATUS_INVALID_IMAGE_FORMAT

--> Link <--

[ECX-8]: 0xA200
EAX: 0x100A200
VAR: 0x1005000

Дизасмим ядро:

Code:
  1. PAGE:004D3E90                 mov     eax, [ebp+var_8]
  2. PAGE:004D3E93                 and     dword ptr [esi+1Ch], 0
  3. PAGE:004D3E97                 and     dword ptr [esi+14h], 0
  4. PAGE:004D3E9B                 mov     [esi], eax
  5. PAGE:004D3E9D                 mov     eax, [ecx-8]    ; IMAGE_SECTION_HEADER.VirtualAddress
  6. PAGE:004D3EA0                 add     eax, [ebp+var_5C]
  7. PAGE:004D3EA3                 cmp     [ebp+var_40], eax
  8. PAGE:004D3EA6                 jnz     loc_4D40A1
  9. PAGE:004D3EAC                 test    edi, edi
  10. PAGE:004D3EAE                 jz      loc_4D40A1


Открываем сурец из w2k/wrk и находим наше место:

Code:
  1.             Subsection += 1;
  2.             Subsection->ControlArea = ControlArea;
  3.             Subsection->NextSubsection = NULL;
  4.             Subsection->UnusedPtes = 0;
  5.  
  6.             if (((NextVa != (PreferredImageBase + SectionTableEntry->VirtualAddress)) && (InvalidAlignmentAllowed == FALSE)) ||
  7.                 (SectionVirtualSize == 0)) {
  8.  
  9.                 //
  10.                 // The specified virtual address does not align
  11.                 // with the next prototype PTE.
  12.                 //
  13.  
  14.                 MI_BAD_IMAGE (0x1A);
  15.                 Status = STATUS_INVALID_IMAGE_FORMAT;
  16.                 goto BadPeImageSegment;
  17.             }


Видим что IMAGE_SECTION_HEADER.VirtualAddress невалид(0xA200).

{ Атач доступен только для участников форума } - mi.png

Ранг: 140.7 (ветеран)
Статус: Участник

Создано: 4 сентября 2017 18:52 New!
Цитата · Личное сообщение · #30

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

Выравненные по section alignment секции должны идти одна за другой без наложений друг на друга и пропусков между секциями.
. 1 . 2 . >>
 eXeL@B —› Вопросы новичков —› Проблема с добавлением секции

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS