0

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

Как правило, когда компилятор помещает файл .exe вместе, вы увидите .text, .data., .rdata, .rsrc и т. Д. ... но как автор мог бы скрывать эти имена, чтобы смутить кого-то, кто выполняет статический анализ ?

ответ

1

Насколько я знаю, это только названия разделов, и некоторые упаковщики, такие как UPX, меняют эти имена на UPX0 или что-то еще, но это действительно не имеет значения, поскольку они являются просто именами, и вы можете изменить их на все вы хотите. важная информация в файлах PE включает адрес этих разделов. Вы можете узнать больше о файлах PE в here. Это очень хороший учебник по структуре PE. Кроме того, это лучший учебник я когда-либо читал о PE файлов (here)

1

dumpbin Visual Studio утилита может быть использована с параметром /HEADERS, чтобы просмотреть все заголовки разделов. Часть продукции вы можете быть заинтересованы в будет выглядеть примерно так:

 
SECTION HEADER #1 
    .text name 
    1000 virtual size 
    1000 virtual address (00401000 to 00401FFF) 
    200 size of raw data 
    200 file pointer to raw data (00000200 to 000003FF) 
     0 file pointer to relocation table 
     0 file pointer to line numbers 
     0 number of relocations 
     0 number of line numbers 
60000020 flags 
     Code 
     Execute Read 

Как вы можете видеть, что это дает название как «.text» для секции кода данного конкретного ехе. В этом разделе можно переименовать что-нибудь, пока это соответствует в Microsoft specification:

Для [имена длиннее 8 байт], это поле содержит косую черту (/), что сопровождается ASCII представление десятичного число, которое является смещением в таблице строк. Исполняемые изображения не используют таблицу строк и не поддерживают имена разделов длиной более 8 символов.

Есть способы найти раздел, независимо от его названия.

Для текстовых разделов им потребуется установить по меньшей мере флаг Execute. И виртуальный адрес раздела .text должен быть таким же, как и точка входа, которая определена в необязательном заголовке.

Раздел импорта (часто называемый .idata) должен иметь свой адрес, заданный во втором элементе массива каталогов, который приходит в конце необязательного заголовка. Опять же, глядя на часть выгрузки самосвала:

 
    2 number of directories 
    0 [  0] RVA [size] of Export Directory 
2000 [  0] RVA [size] of Import Directory 

В этом случае раздел .idata начинается с виртуального адреса 0x2000. Кроме того, для этого раздела требуется, по крайней мере, флаг Read.

Раздел .data может быть сложнее отследить. Как и в разделе импорта, он должен иметь как минимум флаг Read, но чтобы убедиться, что вы можете отсканировать раздел .text для кодов операций, которые перемещают данные на адрес или из адреса. Этот адрес должен находиться в одном из разделов данных, и вы можете найти начало раздела, посмотрев выравнивание раздела в необязательном заголовке.
Например, если вы найдете 68 17 32 40 00, что соответствует PUSH 0x00403217, а выравнивание раздела - 0x1000, тогда начало раздела .data может быть 0x3000 (где 0x00400000 - это база изображений).

1

AFAIK, эти имена не имеют значения и могут быть любыми. Загрузчик просматривает флагов заголовка и раздела и другие данные, чтобы понять, сколько памяти требуется для программы, где (если нет перестановок), какие части должны быть исполняемыми, какие записываемые, которые можно читать и так далее.Загрузчик заботится об этом и делает дополнительные вещи, такие как перемещение и привязка к DLL. У вас может быть только один раздел с большинством вещей в нем, код, постоянные данные, непостоянные данные, информация о импорте. Например, мой компилятор собирает все данные и импортирует информацию под .data. На данный момент существует максимум 3 различных раздела: .text, .data, .reloc (перестановки необязательны, кстати), и Windows довольна.

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