Ищется библиотека для работы с PE

Тема в разделе "WASM.HEAP", создана пользователем ntdll, 2 сен 2009.

  1. ntdll

    ntdll New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2009
    Сообщения:
    16
    Нужна либа для работы с PE либо с хорошей документацией, либо на C с хорошими коментариями.

    Смог найти только pelib и pe-lib.
    Первая на C++ выглядит не плохо, но документация у нее отвратительна. Вторая на MASM с хорошей документацией, но не полная - не умеет работать с tls, ресурсами и т.п. Дописывать остутствующие фичи на MASM'е - скучное занятие.

    Может кто-нибудь знает другие библиотеки?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ntdll
    ntdll.dll
    RtlImageNtHeader(), RtlImageRvaToVa() etc.
     
  3. ntdll

    ntdll New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2009
    Сообщения:
    16
    Clerk
    Мне нужно создавать файлы, а не получать доступ к полям существующих.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ntdll
    NtCreateFile чем не достаточно ?
    Тотже экспорт из базового модуля. Тыбы прежде чем ник себе брать, этот модуль хотябы поверхностно изучил.
     
  5. ntdll

    ntdll New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2009
    Сообщения:
    16
    Видимо не ясно выразился. Необходимы функции для создания PE-файлов: добавить/удалить секцию, добавить/удалить импортируемую функцию, получить VA адреса такой-то импортируемой функции, установить точку входа, установить базовый адрес, и т.д.
     
  6. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    Мажор :)
     
  7. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    Я даже помогу тебе начать это делать (это ведь самое сложное):

    Код (Text):
    1. ; ##############################################    ; проверить bound import !!!
    2. ; ###  AddNewSec                             ###
    3. ; ###  вход:  pMap: указатель на образ       ###
    4. ; ###  выход: EAX - адрес новой секции       ###
    5. ; ##############################################
    6.  
    7. AddNewSec proc USES EBX ECX EDX ESI EDI pMap:DWORD, pName:LPSTR, iSize:DWORD, dwFName: DWORD
    8.  
    9. LOCAL pNTh     :DWORD
    10. LOCAL iSecNum  :WORD
    11. LOCAL pNewSec  :DWORD
    12. LOCAL SecAlgn  :DWORD
    13.  
    14. ; 1. найти адрес конца файла
    15. ; 2. выровнять на FileAlignement вверх
    16. ; 3. прибавить размер секции, выровнять
    17. ; 4. закрыть мапенг
    18. ; 5. создать новый, с большим размером
    19. ; 5. проверить BoundImport и затереть, если есть
    20. ; 6. создать запись в таблице секций
    21. ; 7. поправить ImageSize
    22. ; 8. отредактировать count
    23.  
    24.     push   Loop4
    25.     ; ---- ПОЛУЧАЕМ АДРЕС ЗАГОЛОВКА И КОЛ-ВО СЕКЦИЙ ----
    26.     GetHdr:
    27.     invoke ImageNtHeader, pMap
    28.     or     EAX, EAX
    29.     je     ErrFin
    30.     mov    ESI, EAX
    31.     assume ESI: PTR IMAGE_NT_HEADERS
    32.     mov    pNTh, EAX
    33.     push   dword ptr [ESI].OptionalHeader.SectionAlignment
    34.     pop    SecAlgn
    35.     jmp    dword ptr[ESP]
    36.  
    37.     Loop4:                              ; сохраним адрес заголовка
    38.     add    ESP, 04h
    39.     push   word ptr [ESI].FileHeader.NumberOfSections
    40.     pop    iSecNum                                ; сохраним в переменную NumberOfSections
    41.  
    42.     ; ---- ВЫИЧЛИМ OFFSET АДРЕС НОВОЙ СЕКЦИИ  ----
    43.     mov    EAX, dwMapSize                         ; EAX <- размер файла
    44.     push   Loop1
    45.  
    46.     AlignUP:                                      ; выравнивание на FileAlignement
    47.     mov    EBX, [ESI].OptionalHeader.FileAlignment
    48.     dec    EBX
    49.     add    EAX, EBX
    50.     not    EBX
    51.     and    EAX, EBX
    52.     push   EAX
    53.     jmp    dword ptr[ESP+4]
    54.  
    55.     Loop1:
    56.     pop    pNewSec
    57.     add    EAX, iSize                             ; EAX <- не выровненный новый размер файла
    58.     push   Loop2
    59.     jmp    AlignUP
    60.  
    61.     Loop2:                                        ; EAX <- выровненный новый размер файла
    62.     pop    dwMapSize
    63.     add    ESP, 08h
    64.  
    65.     ; ---- ЗАКРЫВАЕМ ТЕКУЩИЙ МАПЕНГ ----
    66.     invoke FlushViewOfFile, pMap, 0
    67.     invoke UnmapViewOfFile, pMap
    68.     invoke CloseHandle, hRWFile
    69.  
    70.     ; ---- ОТКРЫВАЕМ НОВЫЙ (БОЛЬШЕГО РАЗМЕРА) ----
    71.     invoke CreateFile, dwFName, GENERIC_WRITE or GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
    72.     or     EAX, EAX
    73.     je     ErrFin
    74.     mov    hRWFile, EAX
    75.  
    76.     invoke CreateFileMapping, hRWFile, NULL, PAGE_READWRITE, 0, dwMapSize, NULL
    77.     mov    hMap, EAX
    78.  
    79.     invoke MapViewOfFile, hMap, FILE_MAP_WRITE, 0, 0, 0
    80.     or     EAX, EAX
    81.     je     ErrFin
    82.     mov    pMap, EAX
    83.      
    84.     ; ---- ПОЛУЧАЕМ АДРЕС ТАБЛИЦЫ СЕКЦИЙ ----    
    85.     push   Loop3
    86.     jmp    GetHdr                                 ; получаем новые pNTh и ассоциируем ESI  
    87.     Loop3:
    88.     inc    word ptr[ESI].FileHeader.NumberOfSections    
    89.     mov    EAX, [ESI].OptionalHeader.AddressOfEntryPoint              ; EAX <- Entry Point
    90.     invoke ImageRvaToSection, ESI, pMap, EAX
    91.     or     EAX, EAX
    92.     je     ErrFin
    93.     mov    EDI, EAX
    94.     assume EDI: PTR IMAGE_SECTION_HEADER                              ; EDI <- IMAGE_SECTION_HEADER
    95.     movzx  EAX, iSecNum
    96.     mov    EDX, 028h
    97.     mul    EDX
    98.     add    EAX, EDI                               ; EAX <- адрес в заголовке для новой секции
    99.  
    100.     ; ---- ЗАТРЕМ BOUND IMPORT (ЕСЛИ ОН ЕСТЬ) ----
    101.     push   EDI
    102.     mov    EDI, ESI
    103.     add    EDI, 0D0h
    104.     assume EDI: PTR IMAGE_DATA_DIRECTORY
    105.  
    106.     .IF (dword ptr [EDI].VirtualAddress != 00h)
    107.         mov    dword ptr [EDI].VirtualAddress, 00h
    108.         mov    dword ptr [EDI].isize, 00h    
    109.         mov    ECX, 0Ah
    110.  
    111.         .WHILE ECX != 0
    112.             mov    [EAX], dword ptr 00h
    113.             dec    ECX
    114.             add    EAX, 04h
    115.         .ENDW
    116.     .ENDIF
    117.     pop   EDI
    118.  
    119.     ; ---- ЗАПИСЫВАЕМ ДАННЫЕ ДЛЯ СЕКЦИИ ----
    120.     ; ---- Name
    121.     sub    EAX, 028h
    122.     mov    EDX, EAX
    123.     add    EDX, 08h
    124.     xor    EBX, EBX
    125.     mov    ESI, [pName]
    126.     mov    BL,  byte ptr [ESI]
    127.     .WHILE ((BL != 00h) || (EAX != EDX))                             ; пока не записали 8 символов или не кончилась строка
    128.         mov    byte ptr [EAX], BL                                    ; записываем очередной символ
    129.         inc    EAX
    130.         inc    ESI
    131.         mov    BL, byte ptr [ESI]                                    ; берем очередной символ
    132.     .ENDW
    133.     mov    EDI, EDX                                                  ; EDI <- указатель на заголовок секции + 08h
    134.  
    135.     ; ---- VirtualSize
    136.     mov    EAX, iSize                                                ; EAX <- желаемый размер секции
    137.     mov    EBX, SecAlgn                                              ; EBX <- выравнивающий фактор
    138.     dec    EBX
    139.     add    EAX, EBX
    140.     not    EBX
    141.     and    EAX, EBX                                                  ; размер секции выравненый на SectionAlignement
    142.     mov    dword ptr[EDI], EAX                                       ; запищем его в структуру
    143.     add    EDI, 04h                                                  ; увеличим указатель на заголовок
    144.  
    145.    ; ---- VirtualAdress
    146.     push   dword ptr[EDI-028h]                                       ; RVA пред. секции
    147.     mov    EAX, dword ptr[EDI-024h]                                  ; EAX <- SizeToRawData пред. секции
    148.     mov    EBX, SecAlgn
    149.     dec    EBX
    150.     add    EAX, EBX
    151.     not    EBX
    152.     and    EAX, EBX                                                  ; EAX <- выравненный адрес предыдущей секции
    153.     pop    EBX                                                       ; EBX <- RVA пред. секции
    154.     add    EAX, EBX                                                  ; EAX <- адрес начала новой секции
    155.     mov    dword ptr[EDI], EAX                                       ; запишем в структуру
    156.     add    EDI, 04h
    157.  
    158.     ; ----SizeOfRawData
    159.     mov    EAX, iSize
    160.     mov    dword ptr[EDI], EAX
    161.     add    EDI, 04h
    162.  
    163.     ; ---- PointerToRawData
    164.     mov    EAX, pNewSec
    165.     mov    dword ptr[EDI], EAX
    166.     add    EDI, 010h
    167.  
    168.     ; ---- Characteristics
    169.     mov    dword ptr[EDI],040000000h
    170.  
    171.     ; ---- сохраним ImageSize
    172.     mov    EAX, dword ptr [EDI-018h]                                 ; EAX <- virtual address
    173.     add    EAX, dword ptr [EDI-01Ch]                                 ; EAX <- new size of image
    174.     mov    EBX, pNTh
    175.     mov    dword ptr [EBX+050h], EAX
    176.  
    177.     mov    EAX, pNewSec
    178.     add    EAX, pMap
    179.  
    180. Fin:
    181.     ret
    182.  
    183. ErrFin:
    184.     xor    EAX, EAX
    185.     jmp    Fin
    186. AddNewSec endp
    бугага
     
  8. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
  9. ntdll

    ntdll New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2009
    Сообщения:
    16
    ?
    Дописывать придется настолько много, что проще будет написать все на C самому.
     
  10. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    А не можно ли выдавить из исходников PE Tools нужные функции и оформить это как DLL? Думаю еще полно программ, написанных на Си, да еще и с открытыми исходниками. Понятное дело, что на это нужно время и силы, да еще искать ошибки. Н-р, "добавить/удалить секцию" вроде LordPE делает.
     
  11. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    AndreyMust19, хорош разговоры разговаривать! ВАСМ ждёт от вас новых экспов для каспера!
     
  12. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    старые уже палятся )
     
  13. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    скорее просто чем "проще"
    еще одна тема из приватного раздела WASM.CRYPTORS
     
  14. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    А написать либу не...
    А заюзать написанную без документации не...
    А мож. еще красной икорки, да чтоб намазана была, да чтоб покрупнее и еще с официанткой с булками 8-го размера ?
     
  15. ntdll

    ntdll New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2009
    Сообщения:
    16
    Всем спасибо, критику принял, кодирую сам.
     
  16. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Не хотел бы устраивать споров. Если есть свободная библиотека или исходники - то к ним должна быть документация: какая ф-я что делает, какой прототип, что возвращает и т. д. Благодаря этой документации программисту не придется изучать исходники или дизассемблировать, а просто добавить сэмпл в свой проект. Любая даже скудная документация намного упрощает использование исходников и их редактирование.
     
  17. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    AndreyMust19
    В случае мелкософтовских исходников - 100%
    В случае "левых"... тут уже сложнее. Просто тот, кто ее писал мог многого не учесть... или сама библиотека работает "специфически" и использовать ее может быть очень небезопасно. На изучение исходника уйдет куда меньше времени, чем на поиск "странных" багов. Я хорошо помню как пользовался чужими компонентами Delphi. Тихий ужос. И как раз исходников не было, но была документация которая местами противоречит реальности.
     
  18. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Значит тебе не повезло с компонентами. Если дока не отражает реальности, значит человек не все понимал и, вероятно, имел мало опыта в создании компонентов. Наверняка и баги были.
     
  19. Wizard109

    Wizard109 New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    346
    AndreyMust19
    Дело не в повезло/неповезло.
    Человека купившего программу мало волнует кому где повезло, и если(скорее когда) находит багу он требует ее исправить. И вот тут начинается самое интересное...

    Если взять pelib и pe-lib. Кто их использовал ? Кто уверен что они рабочие ? Я впервые о них слышу, и в жизни не стану пользоваться если не узнаю как они работают или не увижу что ими пользовалось n-е количество человек как минимум года 2(контингент у которого можно разжиться Советом кстате...). Допустим ненавижу MFC и разработал для себя подобие Delphi на C++ (без визуального программирования, но все-же... лучше уж свои "компоненты" рисовать). Ну... местами я параноик :) Но каждый параноик уверен что его паранойя "здоровая". Я не исключение. :)
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    бред какойто вопрос, либоа для работы с пе.. с ним можно делать что угодно, можно зеродеев пачку запихать, можно импорт искать или секции расшаривать. Дурацкий вопрос.