Нужна либа для работы с PE либо с хорошей документацией, либо на C с хорошими коментариями. Смог найти только pelib и pe-lib. Первая на C++ выглядит не плохо, но документация у нее отвратительна. Вторая на MASM с хорошей документацией, но не полная - не умеет работать с tls, ресурсами и т.п. Дописывать остутствующие фичи на MASM'е - скучное занятие. Может кто-нибудь знает другие библиотеки?
ntdll NtCreateFile чем не достаточно ? Тотже экспорт из базового модуля. Тыбы прежде чем ник себе брать, этот модуль хотябы поверхностно изучил.
Видимо не ясно выразился. Необходимы функции для создания PE-файлов: добавить/удалить секцию, добавить/удалить импортируемую функцию, получить VA адреса такой-то импортируемой функции, установить точку входа, установить базовый адрес, и т.д.
Я даже помогу тебе начать это делать (это ведь самое сложное): Код (Text): ; ############################################## ; проверить bound import !!! ; ### AddNewSec ### ; ### вход: pMap: указатель на образ ### ; ### выход: EAX - адрес новой секции ### ; ############################################## AddNewSec proc USES EBX ECX EDX ESI EDI pMap:DWORD, pName:LPSTR, iSize:DWORD, dwFName: DWORD LOCAL pNTh :DWORD LOCAL iSecNum :WORD LOCAL pNewSec :DWORD LOCAL SecAlgn :DWORD ; 1. найти адрес конца файла ; 2. выровнять на FileAlignement вверх ; 3. прибавить размер секции, выровнять ; 4. закрыть мапенг ; 5. создать новый, с большим размером ; 5. проверить BoundImport и затереть, если есть ; 6. создать запись в таблице секций ; 7. поправить ImageSize ; 8. отредактировать count push Loop4 ; ---- ПОЛУЧАЕМ АДРЕС ЗАГОЛОВКА И КОЛ-ВО СЕКЦИЙ ---- GetHdr: invoke ImageNtHeader, pMap or EAX, EAX je ErrFin mov ESI, EAX assume ESI: PTR IMAGE_NT_HEADERS mov pNTh, EAX push dword ptr [ESI].OptionalHeader.SectionAlignment pop SecAlgn jmp dword ptr[ESP] Loop4: ; сохраним адрес заголовка add ESP, 04h push word ptr [ESI].FileHeader.NumberOfSections pop iSecNum ; сохраним в переменную NumberOfSections ; ---- ВЫИЧЛИМ OFFSET АДРЕС НОВОЙ СЕКЦИИ ---- mov EAX, dwMapSize ; EAX <- размер файла push Loop1 AlignUP: ; выравнивание на FileAlignement mov EBX, [ESI].OptionalHeader.FileAlignment dec EBX add EAX, EBX not EBX and EAX, EBX push EAX jmp dword ptr[ESP+4] Loop1: pop pNewSec add EAX, iSize ; EAX <- не выровненный новый размер файла push Loop2 jmp AlignUP Loop2: ; EAX <- выровненный новый размер файла pop dwMapSize add ESP, 08h ; ---- ЗАКРЫВАЕМ ТЕКУЩИЙ МАПЕНГ ---- invoke FlushViewOfFile, pMap, 0 invoke UnmapViewOfFile, pMap invoke CloseHandle, hRWFile ; ---- ОТКРЫВАЕМ НОВЫЙ (БОЛЬШЕГО РАЗМЕРА) ---- invoke CreateFile, dwFName, GENERIC_WRITE or GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0 or EAX, EAX je ErrFin mov hRWFile, EAX invoke CreateFileMapping, hRWFile, NULL, PAGE_READWRITE, 0, dwMapSize, NULL mov hMap, EAX invoke MapViewOfFile, hMap, FILE_MAP_WRITE, 0, 0, 0 or EAX, EAX je ErrFin mov pMap, EAX ; ---- ПОЛУЧАЕМ АДРЕС ТАБЛИЦЫ СЕКЦИЙ ---- push Loop3 jmp GetHdr ; получаем новые pNTh и ассоциируем ESI Loop3: inc word ptr[ESI].FileHeader.NumberOfSections mov EAX, [ESI].OptionalHeader.AddressOfEntryPoint ; EAX <- Entry Point invoke ImageRvaToSection, ESI, pMap, EAX or EAX, EAX je ErrFin mov EDI, EAX assume EDI: PTR IMAGE_SECTION_HEADER ; EDI <- IMAGE_SECTION_HEADER movzx EAX, iSecNum mov EDX, 028h mul EDX add EAX, EDI ; EAX <- адрес в заголовке для новой секции ; ---- ЗАТРЕМ BOUND IMPORT (ЕСЛИ ОН ЕСТЬ) ---- push EDI mov EDI, ESI add EDI, 0D0h assume EDI: PTR IMAGE_DATA_DIRECTORY .IF (dword ptr [EDI].VirtualAddress != 00h) mov dword ptr [EDI].VirtualAddress, 00h mov dword ptr [EDI].isize, 00h mov ECX, 0Ah .WHILE ECX != 0 mov [EAX], dword ptr 00h dec ECX add EAX, 04h .ENDW .ENDIF pop EDI ; ---- ЗАПИСЫВАЕМ ДАННЫЕ ДЛЯ СЕКЦИИ ---- ; ---- Name sub EAX, 028h mov EDX, EAX add EDX, 08h xor EBX, EBX mov ESI, [pName] mov BL, byte ptr [ESI] .WHILE ((BL != 00h) || (EAX != EDX)) ; пока не записали 8 символов или не кончилась строка mov byte ptr [EAX], BL ; записываем очередной символ inc EAX inc ESI mov BL, byte ptr [ESI] ; берем очередной символ .ENDW mov EDI, EDX ; EDI <- указатель на заголовок секции + 08h ; ---- VirtualSize mov EAX, iSize ; EAX <- желаемый размер секции mov EBX, SecAlgn ; EBX <- выравнивающий фактор dec EBX add EAX, EBX not EBX and EAX, EBX ; размер секции выравненый на SectionAlignement mov dword ptr[EDI], EAX ; запищем его в структуру add EDI, 04h ; увеличим указатель на заголовок ; ---- VirtualAdress push dword ptr[EDI-028h] ; RVA пред. секции mov EAX, dword ptr[EDI-024h] ; EAX <- SizeToRawData пред. секции mov EBX, SecAlgn dec EBX add EAX, EBX not EBX and EAX, EBX ; EAX <- выравненный адрес предыдущей секции pop EBX ; EBX <- RVA пред. секции add EAX, EBX ; EAX <- адрес начала новой секции mov dword ptr[EDI], EAX ; запишем в структуру add EDI, 04h ; ----SizeOfRawData mov EAX, iSize mov dword ptr[EDI], EAX add EDI, 04h ; ---- PointerToRawData mov EAX, pNewSec mov dword ptr[EDI], EAX add EDI, 010h ; ---- Characteristics mov dword ptr[EDI],040000000h ; ---- сохраним ImageSize mov EAX, dword ptr [EDI-018h] ; EAX <- virtual address add EAX, dword ptr [EDI-01Ch] ; EAX <- new size of image mov EBX, pNTh mov dword ptr [EBX+050h], EAX mov EAX, pNewSec add EAX, pMap Fin: ret ErrFin: xor EAX, EAX jmp Fin AddNewSec endp бугага
А не можно ли выдавить из исходников PE Tools нужные функции и оформить это как DLL? Думаю еще полно программ, написанных на Си, да еще и с открытыми исходниками. Понятное дело, что на это нужно время и силы, да еще искать ошибки. Н-р, "добавить/удалить секцию" вроде LordPE делает.
А написать либу не... А заюзать написанную без документации не... А мож. еще красной икорки, да чтоб намазана была, да чтоб покрупнее и еще с официанткой с булками 8-го размера ?
Не хотел бы устраивать споров. Если есть свободная библиотека или исходники - то к ним должна быть документация: какая ф-я что делает, какой прототип, что возвращает и т. д. Благодаря этой документации программисту не придется изучать исходники или дизассемблировать, а просто добавить сэмпл в свой проект. Любая даже скудная документация намного упрощает использование исходников и их редактирование.
AndreyMust19 В случае мелкософтовских исходников - 100% В случае "левых"... тут уже сложнее. Просто тот, кто ее писал мог многого не учесть... или сама библиотека работает "специфически" и использовать ее может быть очень небезопасно. На изучение исходника уйдет куда меньше времени, чем на поиск "странных" багов. Я хорошо помню как пользовался чужими компонентами Delphi. Тихий ужос. И как раз исходников не было, но была документация которая местами противоречит реальности.
Значит тебе не повезло с компонентами. Если дока не отражает реальности, значит человек не все понимал и, вероятно, имел мало опыта в создании компонентов. Наверняка и баги были.
AndreyMust19 Дело не в повезло/неповезло. Человека купившего программу мало волнует кому где повезло, и если(скорее когда) находит багу он требует ее исправить. И вот тут начинается самое интересное... Если взять pelib и pe-lib. Кто их использовал ? Кто уверен что они рабочие ? Я впервые о них слышу, и в жизни не стану пользоваться если не узнаю как они работают или не увижу что ими пользовалось n-е количество человек как минимум года 2(контингент у которого можно разжиться Советом кстате...). Допустим ненавижу MFC и разработал для себя подобие Delphi на C++ (без визуального программирования, но все-же... лучше уж свои "компоненты" рисовать). Ну... местами я параноик Но каждый параноик уверен что его паранойя "здоровая". Я не исключение.
бред какойто вопрос, либоа для работы с пе.. с ним можно делать что угодно, можно зеродеев пачку запихать, можно импорт искать или секции расшаривать. Дурацкий вопрос.