передача базового адреса kernel32.dll в IMAGE_DOS_HEADER

Тема в разделе "WASM.BEGINNERS", создана пользователем vadak, 25 окт 2011.

  1. vadak

    vadak New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2010
    Сообщения:
    41
    Вобщем незнаю как реализовать сабж в fasm, в MASM'е это выглядит:
    Код (Text):
    1. assume  esi:ptr IMAGE_DOS_HEADER
    а как будет в фасме?
    вот код:
    Код (Text):
    1. format PE console 4.0
    2. include 'C:\asma\fasm\include\win32a.inc'
    3. entry start
    4. section '.data' data writeable readable
    5. buffer db 'hello world!',0
    6. section '.code' code readable executable
    7. image_dos IMAGE_DOS_HEADER
    8. start:
    9.     mov eax,    [fs:0x30]
    10.     mov eax,    [eax+0xc]
    11.     mov esi,    [eax+0x1c]
    12.     lodsd
    13.     mov eax,    [eax+0x8]; в еакс базовый адрес kernel32.dll
    14.     mov image_dos,  eax    
    15.  
    16.     invoke ExitProcess,0
    17.     section '.idata' import data readable writeable
    18. library kernel32,'kernel32.dll'
    19. import kernel32,\
    20.     ExitProcess,'ExitProcess'
    Чтобы можно было обращатся mov edx, [image_dos.e_magic] к примеру.
    В файл %fasminc%/Equates/kernel32.dll добавил свою структуру согласно мсдн:
    Код (Text):
    1. struct IMAGE_DOS_HEADER
    2.      e_magic       dw ? ;        Сигнатура заголовка
    3.      e_cblp       dw ? ;         количество байт на последней странице файла
    4.      e_cp       dw ? ;       количество страниц в файле
    5.      e_crlc       dw ? ;         Relocations
    6.      e_cparhdr       dw ? ;      Размер заголовка в параграфах
    7.      e_minalloc       dw ? ;         Минимальные дополнительные параграфы
    8.      e_maxalloc       dw ? ;         Максимальные дополнительные параграфы
    9.      e_ss       dw ? ;       начальное  относительное значение регистра SS
    10.      e_sp       dw ? ;       начальное значение регистра SP
    11.      e_csum       dw ? ;         контрольная сумма
    12.      e_ip       dw ? ;       начальное значение регистра IP
    13.      e_cs       dw ? ;       начальное относительное значение регистра CS
    14.      e_lfarlc       dw ? ;       адрес в файле на таблицу переадресации
    15.      e_ovno       dw ? ;         количество оверлеев
    16.      e_res  dw 4 dup(0) ;        Зарезервировано
    17.      e_oemid       dw ? ;        OEM идентифкатор
    18.      e_oeminfo       dw ? ;      OEM информация
    19.      e_res2 dw 10 dup(0) ;   Зарезервировано
    20.      e_lfanew   dd ?    ;        адрес в файле нового .exe заголовка (PE)
    21. ends
     
  2. xyz

    xyz New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2008
    Сообщения:
    28
    mov esi, [eax+IMAGE_DOS_HEADER.e_lfanew]
    в esi будет содержимое e_lfanew поля
    ...
    mov eax, [eax+0x8]; в еакс базовый адрес kernel32.dll
    add eax, [eax+IMAGE_DOS_HEADER.e_lfanew]

    eax - теперь указывает на IMAGE_NT_HEADERS
     
  3. vadak

    vadak New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2010
    Сообщения:
    41
    xyz
    То что нужно, благодарю за помощь!