Перевод кода с FASM на MASM

Тема в разделе "WASM.BEGINNERS", создана пользователем vanilly_cpp, 28 янв 2008.

  1. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Всем здрасте!

    Помогите кто может перевести сей код с синтаксиса FASM на MASM

    Код (Text):
    1. FORMAT PE GUI 4.0 on 'null'
    2.  
    3. entry start
    4. FILE_NAME equ 'file.exe'
    5.  
    6. include 'c:\fasmw\include\win32a.inc'
    7.  
    8. section '.main' code readable writable executable
    9.  
    10. data import
    11.  
    12. library kernel32,'KERNEL32.DLL',\
    13.       user32,'USER32.DLL'
    14.  
    15. include 'c:\fasmw\include\api\user32.inc'
    16. include 'c:\fasmw\include\api\kernel32.inc'
    17. end data
    18.  
    19. macro xinvoke proc,[arg]
    20.   {
    21.     common
    22.       if ~ arg eq
    23.     reverse
    24.       pushd arg
    25.     common
    26.       end if
    27.     call [ebx+_#proc-_delta]
    28.   }
    29.  
    30. proc start
    31.      locals
    32.     pVA  dd ?
    33.     shit dd ?
    34.      endl
    35.  
    36.     call   some_file   
    37.  
    38.     mov esi, fflile
    39.     add esi,[esi+3ch] ;peheader
    40.     mov ecx,[esi+34h] ;image base
    41.     mov edx,[esi+50h] ;image size
    42.  
    43.     lea edi,[edx+ecx]
    44.     ;imagebase+imagesize
    45.  
    46.     mov esi,alloced_size
    47.     add esi,10000h
    48.     and esi,0ffff0000h
    49.     ;округлить значения.
    50.  
    51.   @@:
    52.     add edi,10000h
    53.     invoke  VirtualAlloc,edi,esi,MEM_RESERVE+MEM_COMMIT,PAGE_EXECUTE_READWRITE
    54.     ;ищем новое место где-нибудь за imagebase+imagesize, чтоб разместить там загрузчик
    55.     test    eax,eax
    56.     jz  @b
    57.     mov [pVA],eax
    58.     ;сохранить
    59.  
    60.     mov esi,api_table
    61.     mov edi,esi
    62.   @@:
    63.     lodsd
    64.     test    eax,eax
    65.     jz  @f
    66.     mov eax,[eax]
    67.     stosd
    68.     jmp @b
    69.     ;так как таблицу импорта мы не переносим, адреса необходимых апи занесем в таблицу.
    70.   @@:
    71.     mov esi,alloced_area_start
    72.     mov edi,[pVA]
    73.     mov ecx,alloced_size
    74.     rep movsb
    75.     ;копирование на новое место загрузчика с образом файла
    76.     jmp [pVA]
    77.     ;прыжок на начало кода загрузчика
    78. endp
    79.  
    80.  
    81. ;дальше только базонезависимый код
    82. proc alloced_area_start
    83.      locals
    84.     pVA dd ?
    85.      endl
    86.     call    _delta
    87.      _delta:
    88.     pop ebx
    89.     ;ebx=delta
    90.     lea esi,[ebx+some_file-_delta]
    91.     push    esi
    92.     add esi,dword[esi+3ch]
    93.     mov ecx,[esi+34h] ;image base
    94.     mov edx,[esi+50h] ;image size
    95.  
    96.     mov edi,ecx
    97.     stdcall Allock_Region,ecx,edx
    98.     ;получим памяти под загрузку файла
    99.     mov [pVA],ecx
    100.     ;запомним это значение
    101.  
    102.     mov edx,esi
    103.     ;edx=pointer to PE header
    104.     pop esi
    105.     push    esi
    106.     ;последний параметр в process_sections
    107.  
    108.     mov ecx,[edx+54h]
    109.     add ecx,18h
    110.     ;размер заголовков и таблицы секций
    111.     rep movsb
    112.     ;перемещаем их
    113.  
    114.     lea eax,[edx+78h+16*8]
    115.     ;указатель на первый IMAGE_SECTION_HEADER
    116.     movzx   ecx,word[edx+6]
    117.     ;IMAGE_NT_HEADER.FileHeader.NumberOfSections
    118.     stdcall process_sections,ecx,eax,[pVA]
    119.     ;расставляем секции по местам
    120.     stdcall process_imports,dword[edx+78h+8],[pVA]
    121.     ;заполняем импорты
    122.  
    123.     push    MEM_RELEASE
    124.     ;теперь надо освободить память, занятую загрузчиком
    125.     push    0
    126.     mov eax,ebx
    127.     and eax,0fffff000h
    128.     push    eax
    129.     ;адрес
    130.     mov ecx,dword[edx+28h]
    131.     ;RVA точки входа
    132.     add ecx,[pVA]
    133.     ;VA
    134.     push    ecx
    135.     ;адрес возврата из VirtualFree
    136.     jmp [_VirtualFree+ebx-_delta]
    137.     ;освобождаем память
    138. endp
    139.  
    140. proc    process_imports pTab,pImageBase
    141. ;pTab - RVA таблицы импортов (берем из массива DataDirectory)
    142. ;pImageBase - указатель на "память"
    143.     pusha
    144.     mov edx,[pTab]
    145.     add edx,[pImageBase]
    146.     ;VA таблицы импортов
    147.       .loop:
    148.     push    edx
    149.     mov edi,[edx+4*4]
    150.     ;import address table (её и будем заполнять)
    151.     mov esi,[edx]
    152.     ;lookup table (можно сделать просто = import address table, они идентичны)
    153.     test    edi,edi
    154.     jz  .ends
    155.     ;последний IMAGE_IMPORT_DESCRIPTOR нулевой
    156.     test    esi,esi
    157.     jnz .ok
    158.     mov esi,edi
    159.       .ok:
    160.     mov ecx,[pImageBase]
    161.     add esi,ecx
    162.     add edi,ecx
    163.     ;VA соответствующих таблиц
    164.     mov eax,[edx+4*3]
    165.     add eax,ecx
    166.     ;VA имени DLL
    167.       @@:
    168.     cmp byte[eax],0
    169.     jnz @f
    170.     inc eax
    171.     jmp @b
    172.     ;могут быть нули для выравнивания
    173.       @@:
    174.     xinvoke LoadLibrary,eax
    175.     mov edx,eax
    176.     ;загрузить DLL
    177.       .po_1_dll:
    178.     lodsd
    179.     ;RVA IMAGE_IMPORT_BY_NAME
    180.     test    eax,eax
    181.     jz  .exit_it
    182.     ;таблица заканчивается нулевым элементом
    183.     bt  eax,31
    184.     ;если установлен 31 бит, то импорт по ординалу.
    185.     jnc .no_ord
    186.     and eax,0ffffh
    187.     jmp .getproc
    188.       .no_ord:
    189.     add eax,[pImageBase]
    190.     ;VA IMAGE_IMPORT_BY_NAME
    191.     add eax,2
    192.     ;VA IMAGE_IMPORT_BY_NAME.Name
    193.       .getproc:
    194.     push    edx
    195.     xinvoke GetProcAddress,edx,eax
    196.     ;получить адрес АПИ
    197.     pop edx
    198.     stosd
    199.     ;поместить его на свое место
    200.     jmp .po_1_dll
    201.       .exit_it:
    202.     pop edx
    203.     add edx,5*4
    204.     ;перейти к следующему IMAGE_IMPORT_DESCRIPTOR
    205.     jmp .loop
    206.       .ends:
    207.     pop edx
    208.     popa
    209.     ret
    210. endp
    211.  
    212. proc    process_sections num, pStable,pImageBase,pImage
    213. ;num - кол-во секций, берем Number Of Sections из IMAGE_FILE_HEADER
    214. ;pStable - указатель на таблицу секций (сразу за массивом DataDirectory)
    215. ;pImageBase - указатель на выделенную "память"
    216. ;pImage - указатель на образ Б
    217.     pusha
    218.     mov ecx,[num]
    219.     mov edx,[pStable]
    220.      @@:
    221.     push    ecx
    222.     mov edi,[edx+0ch]
    223.     ;Section RVA
    224.     add edi,[pImageBase]
    225.     ;Section VA
    226.     mov ecx,[edx+10h]
    227.     ;Physical Size
    228.     mov esi,[pImage]
    229.     add esi,[edx+14h]
    230.     ;Physical Offset
    231.     rep movsb
    232.     ;копируем секцию на её законное место
    233.     pop ecx
    234.     add edx,28h
    235.     ;следующая
    236.     dec ecx
    237.     jnz @b
    238.  
    239.     popa
    240.     ret
    241. endp
    242.  
    243. proc    Allock_Region pRegion,Size
    244.     pusha
    245.     mov edi,[pRegion]
    246.     mov esi,[Size]
    247.     add esi,edi
    248.     ;esi - указатель на конец выделяемой области
    249.     ;edi - указатель на начало
    250.      @@:
    251.     xinvoke UnmapViewOfFile,edi
    252.     xinvoke VirtualFree,edi,0,MEM_RELEASE
    253.     ;освободить память
    254.     xinvoke VirtualAlloc,edi,10000h,MEM_RESERVE+MEM_COMMIT,PAGE_EXECUTE_READWRITE
    255.     ;зарезервировать
    256.     test    eax,eax
    257.     jz  @f
    258.     ;без этой проверки функция работает, если параметры в "разумных" пределах
    259.     add edi,10000h
    260.     ;память резервируется по 10000h за шаг
    261.     cmp edi,esi
    262.     jl  @b
    263.      @@:
    264.     popa
    265.     ret
    266. endp
    267.  
    268. proc some_file
    269. ;_bin   file FILE_NAME
    270. ;файлик, который будем загружать
    271. ;   _bin_size     = $ - _bin
    272. ;alloced_size=$-alloced_area_start
    273.      locals
    274.  
    275. hndl dd ?
    276. size dd ?
    277. dwr dd ?
    278.     pVA dd ?
    279.      endl
    280.  
    281.     pusha
    282.  
    283.    
    284.     invoke CreateFile, offset FILE_NAME, GENERIC_READ, NULL, NULL, OPEN_EXISTING, NULL, NULL   
    285.    
    286.     ;mov esi, var
    287.     mov dword ptr hndl, eax
    288.     lea eax, dword ptr dwr
    289.     invoke GetFileSize, dword ptr hndl, eax
    290.     mov dword ptr size, eax
    291.     lea eax, dword ptr dwr
    292.     lea esi, dword ptr fflile
    293.     invoke ReadFile, dword ptr hndl, esi, dword ptr size, eax, NULL
    294.     invoke CloseHandle, dword ptr hndl
    295.  
    296.  
    297.     popa
    298.     ret
    299. endp                          
    300.  
    301.  
    302. api_table:
    303. _UnmapViewOfFile dd UnmapViewOfFile
    304. _VirtualAlloc    dd VirtualAlloc
    305. _LoadLibrary     dd LoadLibrary
    306. _GetProcAddress  dd GetProcAddress
    307. _VirtualFree     dd VirtualFree
    308. dd 0
    309. ;таблица АПИ, необходимых для работы загрузчика
    310. fflile:
    311. _bin    file FILE_NAME
    312. ;файлик, который будем загружать
    313.     _bin_size     = $ - _bin
    314. alloced_size=$-alloced_area_start
    Заранее огромное спасибо!
     
  2. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    хорошо, попробую конкретней

    наибольшую проблему вызывает
    макрос
    Код (Text):
    1. macro xinvoke proc,[arg]
    2.   {
    3.     common
    4.       if ~ arg eq
    5.     reverse
    6.       pushd arg
    7.     common
    8.       end if
    9.     call [ebx+_#proc-_delta]
    10.   }
    и точки в метках!
    Код (Text):
    1. .po_1_dll:
    как мне корректно заменить эти моменты?
     
  3. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Точки в метках роли никакой не играют.
    Макрос примерно так
    Код (Text):
    1. xinvoke macro  p1
    2. call dword ptr[ebx+p1-_delta]
    3. endm
    но заменить в коде, например, xinvoke VirtualFree,edi,0,MEM_RELEASE на
    Код (Text):
    1. push MEM_RELEASE
    2. push 0
    3. push edi
    4. xinvoke _VirtualFree
    по идее, так
     
  4. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    >>twgt
    Спасибо!

    Замучался я его переделывать, все равно не чего не получается!
    //*******************************************************

    Может кто подскажет как сделать так чтобы имя запускаемого из памяти файла

    FILE_NAME equ 'file.exe'

    принамалось из командной строки?
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    vanilly_cpp
    дописать код?
     
  6. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    >>censored
    Да! Если можно! Буду очень благодарен!

    Только было бы еще круче если сделать так, что б с этого кода компилилась .lib, или .dll и в экспортируемую ею
    ф-ю можео было бы передать
    'file.exe'

    Заранее спасибо!
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    vanilly_cpp
    :-D :-D :-D
    Не думаю, что censored предлагал свои услуги по дописыванию кода. :-D
     
  8. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    vanilly_cpp
    Святая простота... ) GetCommandLine поможет.