перевод кода с fasm->masm

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

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Пытаюсь перевести код загрузчика из статьи Запуск файла из памяти. Основная работа сделала ида, но появилось много подводных комней...

    Вот мой masm вариант:
    Код (Text):
    1. .686p
    2. .mmx
    3. .model flat,stdcall
    4. option casemap:none
    5.  
    6. include \masm32\include\windows.inc
    7. include \masm32\include\kernel32.inc
    8. includelib \masm32\lib\kernel32.lib
    9. include \masm32\include\user32.inc
    10. includelib \masm32\lib\user32.lib
    11.  
    12. externdef _imp__MessageBoxA@16:PTR pr4
    13. externdef _imp__GetProcAddress@8:PTR pr2
    14. externdef _imp__LoadLibraryA@4:PTR pr1
    15. externdef _imp__UnmapViewOfFile@4:PTR pr1
    16. externdef _imp__VirtualAlloc@16:PTR pr4
    17. externdef _imp__VirtualFree@12:PTR pr3
    18.                
    19. .code
    20. alloced_area_start proc
    21.           local pVA:dword
    22.  
    23.           call @F
    24.        @@:
    25.           pop ebx
    26.           sub ebx,offset @B
    27.  
    28.         lea esi,[ebx + offset some_file]
    29.         push    esi
    30.         add esi, [esi+3Ch]
    31.         mov ecx, [esi+34h]
    32.         mov edx, [esi+50h]
    33.         mov edi, ecx
    34.         push    edx
    35.         push    ecx
    36.         call    Allock_Region
    37.         mov pVA,ecx
    38.         mov edx, esi
    39.         pop esi
    40.         push    esi
    41.         mov ecx, [edx+54h]
    42.         add ecx, 18h
    43.         rep movsb
    44.         lea eax, [edx+0F8h]
    45.         movzx ecx, word ptr [edx+6]
    46.  
    47.         push    pVA
    48.         push    eax
    49.         push    ecx
    50.         call    process_sections
    51.  
    52. ;pusha
    53. ;push 0
    54. ;push 0
    55. ;push 0
    56. ;push 0
    57. ;call _imp__MessageBoxA@16
    58. ;popa
    59.  
    60.         push    pVA
    61.         push    dword ptr [edx+80h]
    62.         call    process_imports
    63.         push    8000h
    64.         push    0
    65.         mov eax, ebx
    66.         and eax, 0FFFFF000h
    67.         push    eax
    68.         mov ecx, [edx+28h]
    69.         add ecx, pVA
    70.         push    ecx
    71.         jmp _imp__VirtualFree@12
    72. alloced_area_start  endp
    73.  
    74. process_imports proc near
    75. arg_0   = dword ptr  8
    76. arg_4   = dword ptr  0Ch
    77.         push    ebp
    78.         mov ebp, esp
    79.         pusha
    80.         mov edx, [ebp+arg_0]
    81.         add edx, [ebp+arg_4]
    82. loc_40119D:
    83.         push    edx
    84.         mov edi, [edx+10h]
    85.         mov esi, [edx]
    86.         test    edi, edi
    87.         jz  loc_4011F5
    88.         test    esi, esi
    89.         jnz short loc_4011AD
    90.         mov esi, edi
    91. loc_4011AD:
    92.         mov ecx, [ebp+arg_4]
    93.         add esi, ecx
    94.         add edi, ecx
    95.         mov eax, [edx+0Ch]
    96.         add eax, ecx
    97. loc_4011B9:
    98.         cmp byte ptr [eax],0
    99.         jnz loc_4011C1
    100.         inc eax
    101.         jmp loc_4011B9
    102. loc_4011C1:
    103.         push    eax
    104.         call _imp__LoadLibraryA@4
    105.         mov edx, eax
    106. loc_4011CA:
    107.         lodsd
    108.         test    eax, eax
    109.         jz  loc_4011EF
    110.         bt  eax, 1Fh
    111.         jnb loc_4011DC
    112.         and eax, 0FFFFh
    113.         jmp  loc_4011E2
    114. loc_4011DC:
    115.         add eax, [ebp+arg_4]
    116.         add eax, 2
    117. loc_4011E2:
    118.         push    edx
    119.         push    eax
    120.         push    edx
    121.         call _imp__GetProcAddress@8
    122.         pop edx
    123.         stosd
    124.         jmp loc_4011CA
    125. loc_4011EF:
    126.         pop edx
    127.         add edx, 14h
    128.         jmp loc_40119D
    129. loc_4011F5:
    130.         pop edx
    131.         popa
    132.         leave
    133.         retn    8
    134. process_imports endp
    135.  
    136. process_sections    proc near
    137. arg_0   = dword ptr  8
    138. arg_4   = dword ptr  0Ch
    139. arg_8   = dword ptr  10h
    140. arg_C   = dword ptr  14h
    141.         push    ebp
    142.         mov ebp, esp
    143.         pusha
    144.         mov ecx, [ebp+arg_0]
    145.         mov edx, [ebp+arg_4]
    146. loc_401205:
    147.         push    ecx
    148.         mov edi, [edx+0Ch]
    149.         add edi, [ebp+arg_8]
    150.         mov ecx, [edx+10h]
    151.         mov esi, [ebp+arg_C]
    152.         add esi, [edx+14h]
    153.         rep movsb
    154.         pop ecx
    155.         add edx, 28h
    156.         dec ecx
    157.         jnz loc_401205
    158.         popa
    159.         leave
    160.         retn    10h
    161. process_sections endp
    162.  
    163. Allock_Region   proc near
    164. arg_0   = dword ptr  8
    165. arg_4   = dword ptr  0Ch
    166.         push    ebp
    167.         mov ebp, esp
    168.         pusha
    169.         mov edi, [ebp+arg_0]
    170.         mov esi, [ebp+arg_4]
    171.         add esi, edi
    172. loc_40122F:
    173.         push    edi
    174.         call _imp__UnmapViewOfFile@4
    175.         push    8000h
    176.         push    0
    177.         push    edi
    178.         call _imp__VirtualFree@12
    179.         push    40h
    180.         push    3000h
    181.         push    10000h
    182.         push    edi
    183.         call _imp__VirtualAlloc@16
    184.         test    eax, eax
    185.         jz loc_401265
    186.         add edi, 10000h
    187.         cmp edi, esi
    188.         jl loc_40122F
    189. loc_401265:
    190.         popa
    191.         leave
    192.         retn    8
    193. Allock_Region   endp
    194.  
    195. some_file:
    196. DB 77,90,0,0,80,69,0,0,76,1,1,0,0,0,0,0
    197. DB 0,0,0,0,0,0,0,0,120,0,15,1,11,1,0,0
    198. DB 0,0,0,0,0,0,0,0,0,0,0,0,188,0,0,0
    199. DB 0,0,0,0,0,0,0,0,0,0,20,19,4,0,0,0
    200. DB 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0
    201. DB 0,0,0,0,18,1,0,0,188,0,0,0,0,0,0,0
    202. DB 2,0,0,0,0,16,0,0,0,16,0,0,0,16,0,0
    203. DB 0,16,0,0,0,0,0,0,2,0,0,0,0,0,0,0
    204. DB 0,0,0,0,225,0,0,0,49,0,0,0,0,0,0,0
    205. DB 0,0,0,0,46,105,109,112,111,114,116,0,49,0,0,0
    206. DB 188,0,0,0,49,0,0,0,188,0,0,0,0,0,0,0
    207. DB 0,0,0,0,0,0,0,0,32,0,0,224,106,0,104,219
    208. DB 0,20,19,106,0,106,0,255,21,252,0,20,19,232,0,0
    209. DB 0,0,106,0,100,137,32,255,100,36,4,72,101,108,108,111
    210. DB 0,0,0,0,0,0,0,0,0,0,0,0,0,245,0,0
    211. DB 0,252,0,0,0,85,83,69,82,51,50,0,4,1,0,0
    212. DB 0,0,0,0,0,0,77,101,115,115,97,103,101,66,111,120
    213. DB 65,0
    214. size_some_file = 274
    215.  
    216. alloced_area_end:
    217. alloced_size   equ (offset alloced_area_end - offset alloced_area_start)
    218.  
    219. start proc
    220.           local pVA:dword
    221.         mov esi, offset some_file
    222.         add esi, [esi+3Ch]
    223.         mov ecx, [esi+34h]
    224.         mov edx, [esi+50h]
    225.         lea edi, [edx+ecx]
    226.         mov esi, alloced_size
    227.         add esi, 10000h
    228.         and esi, 0FFFF0000h
    229.        @@:
    230.         add edi, 10000h
    231.           invoke VirtualAlloc,edi,esi,MEM_RESERVE+MEM_COMMIT,PAGE_EXECUTE_READWRITE
    232.         test    eax, eax
    233.         jz @B
    234.         mov pVA, eax
    235.         mov esi, offset alloced_area_start
    236.         mov edi, pVA
    237.         mov ecx, alloced_size
    238.         rep movsb
    239.         jmp pVA
    240. start endp
    241. end start
    Доходит до процедуры process_sections и ругается что "The memory could not be written".
    Не могу понять в чем дело, помогите пожалуйста.
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Flasher
    Разве у тебя между some_file: ... alloced_area_end: находится образ исполняемого файла?
     
  3. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Вот оригинал:
    Код (Text):
    1. FORMAT PE GUI 4.0 on 'null'
    2.  
    3. entry start
    4. FILE_NAME equ 'file.exe'
    5.  
    6. include '%fasminc%\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 '%fasminc%\apia\user32.inc'
    16. include '%fasminc%\apia\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.     mov esi,some_file
    36.     add esi,[esi+3ch] ;peheader
    37.     mov ecx,[esi+34h] ;image base
    38.     mov edx,[esi+50h] ;image size
    39.  
    40.     lea edi,[edx+ecx]
    41.     ;imagebase+imagesize
    42.  
    43.     mov esi,alloced_size
    44.     add esi,10000h
    45.     and esi,0ffff0000h
    46.     ;округлить значения.
    47.  
    48.   @@:
    49.     add edi,10000h
    50.     invoke  VirtualAlloc,edi,esi,MEM_RESERVE+MEM_COMMIT,PAGE_EXECUTE_READWRITE
    51.     ;ищем новое место где-нибудь за imagebase+imagesize, чтоб разместить там загрузчик
    52.     test    eax,eax
    53.     jz  @b
    54.     mov [pVA],eax
    55.     ;сохранить
    56.  
    57.     mov esi,api_table
    58.     mov edi,esi
    59.   @@:
    60.     lodsd
    61.     test    eax,eax
    62.     jz  @f
    63.     mov eax,[eax]
    64.     stosd
    65.     jmp @b
    66.     ;так как таблицу импорта мы не переносим, адреса необходимых апи занесем в таблицу.
    67.   @@:
    68.     mov esi,alloced_area_start
    69.     mov edi,[pVA]
    70.     mov ecx,alloced_size
    71.     rep movsb
    72.     ;копирование на новое место загрузчика с образом файла
    73.     jmp [pVA]
    74.     ;прыжок на начало кода загрузчика
    75. endp
    76.  
    77.  
    78. ;дальше только базонезависимый код
    79. proc alloced_area_start
    80.      locals
    81.     pVA dd ?
    82.      endl
    83.     call    _delta
    84.      _delta:
    85.     pop ebx
    86.     ;ebx=delta
    87.     lea esi,[ebx+some_file-_delta]
    88.     push    esi
    89.     add esi,dword[esi+3ch]
    90.     mov ecx,[esi+34h] ;image base
    91.     mov edx,[esi+50h] ;image size
    92.  
    93.     mov edi,ecx
    94.     stdcall Allock_Region,ecx,edx
    95.     ;получим памяти под загрузку файла
    96.     mov [pVA],ecx
    97.     ;запомним это значение
    98.  
    99.     mov edx,esi
    100.     ;edx=pointer to PE header
    101.     pop esi
    102.     push    esi
    103.     ;последний параметр в process_sections
    104.  
    105.     mov ecx,[edx+54h]
    106.     add ecx,18h
    107.     ;размер заголовков и таблицы секций
    108.     rep movsb
    109.     ;перемещаем их
    110.  
    111.     lea eax,[edx+78h+16*8]
    112.     ;указатель на первый IMAGE_SECTION_HEADER
    113.     movzx   ecx,word[edx+6]
    114.     ;IMAGE_NT_HEADER.FileHeader.NumberOfSections
    115.     stdcall process_sections,ecx,eax,[pVA]
    116.     ;расставляем секции по местам
    117.     stdcall process_imports,dword[edx+78h+8],[pVA]
    118.     ;заполняем импорты
    119.  
    120.     push    MEM_RELEASE
    121.     ;теперь надо освободить память, занятую загрузчиком
    122.     push    0
    123.     mov eax,ebx
    124.     and eax,0fffff000h
    125.     push    eax
    126.     ;адрес
    127.     mov ecx,dword[edx+28h]
    128.     ;RVA точки входа
    129.     add ecx,[pVA]
    130.     ;VA
    131.     push    ecx
    132.     ;адрес возврата из VirtualFree
    133.     jmp [_VirtualFree+ebx-_delta]
    134.     ;освобождаем память
    135. endp
    136.  
    137. proc    process_imports pTab,pImageBase
    138. ;pTab - RVA таблицы импортов (берем из массива DataDirectory)
    139. ;pImageBase - указатель на "память"
    140.     pusha
    141.     mov edx,[pTab]
    142.     add edx,[pImageBase]
    143.     ;VA таблицы импортов
    144.       .loop:
    145.     push    edx
    146.     mov edi,[edx+4*4]
    147.     ;import address table (её и будем заполнять)
    148.     mov esi,[edx]
    149.     ;lookup table (можно сделать просто = import address table, они идентичны)
    150.     test    edi,edi
    151.     jz  .ends
    152.     ;последний IMAGE_IMPORT_DESCRIPTOR нулевой
    153.     test    esi,esi
    154.     jnz .ok
    155.     mov esi,edi
    156.       .ok:
    157.     mov ecx,[pImageBase]
    158.     add esi,ecx
    159.     add edi,ecx
    160.     ;VA соответствующих таблиц
    161.     mov eax,[edx+4*3]
    162.     add eax,ecx
    163.     ;VA имени DLL
    164.       @@:
    165.     cmp byte[eax],0
    166.     jnz @f
    167.     inc eax
    168.     jmp @b
    169.     ;могут быть нули для выравнивания
    170.       @@:
    171.     xinvoke LoadLibrary,eax
    172.     mov edx,eax
    173.     ;загрузить DLL
    174.       .po_1_dll:
    175.     lodsd
    176.     ;RVA IMAGE_IMPORT_BY_NAME
    177.     test    eax,eax
    178.     jz  .exit_it
    179.     ;таблица заканчивается нулевым элементом
    180.     bt  eax,31
    181.     ;если установлен 31 бит, то импорт по ординалу.
    182.     jnc .no_ord
    183.     and eax,0ffffh
    184.     jmp .getproc
    185.       .no_ord:
    186.     add eax,[pImageBase]
    187.     ;VA IMAGE_IMPORT_BY_NAME
    188.     add eax,2
    189.     ;VA IMAGE_IMPORT_BY_NAME.Name
    190.       .getproc:
    191.     push    edx
    192.     xinvoke GetProcAddress,edx,eax
    193.     ;получить адрес АПИ
    194.     pop edx
    195.     stosd
    196.     ;поместить его на свое место
    197.     jmp .po_1_dll
    198.       .exit_it:
    199.     pop edx
    200.     add edx,5*4
    201.     ;перейти к следующему IMAGE_IMPORT_DESCRIPTOR
    202.     jmp .loop
    203.       .ends:
    204.     pop edx
    205.     popa
    206.     ret
    207. endp
    208.  
    209. proc    process_sections num, pStable,pImageBase,pImage
    210. ;num - кол-во секций, берем Number Of Sections из IMAGE_FILE_HEADER
    211. ;pStable - указатель на таблицу секций (сразу за массивом DataDirectory)
    212. ;pImageBase - указатель на выделенную "память"
    213. ;pImage - указатель на образ Б
    214.     pusha
    215.     mov ecx,[num]
    216.     mov edx,[pStable]
    217.      @@:
    218.     push    ecx
    219.     mov edi,[edx+0ch]
    220.     ;Section RVA
    221.     add edi,[pImageBase]
    222.     ;Section VA
    223.     mov ecx,[edx+10h]
    224.     ;Physical Size
    225.     mov esi,[pImage]
    226.     add esi,[edx+14h]
    227.     ;Physical Offset
    228.     rep movsb
    229.     ;копируем секцию на её законное место
    230.     pop ecx
    231.     add edx,28h
    232.     ;следующая
    233.     dec ecx
    234.     jnz @b
    235.  
    236.     popa
    237.     ret
    238. endp
    239.  
    240. proc    Allock_Region pRegion,Size
    241.     pusha
    242.     mov edi,[pRegion]
    243.     mov esi,[Size]
    244.     add esi,edi
    245.     ;esi - указатель на конец выделяемой области
    246.     ;edi - указатель на начало
    247.      @@:
    248.     xinvoke UnmapViewOfFile,edi
    249.     xinvoke VirtualFree,edi,0,MEM_RELEASE
    250.     ;освободить память
    251.     xinvoke VirtualAlloc,edi,10000h,MEM_RESERVE+MEM_COMMIT,PAGE_EXECUTE_READWRITE
    252.     ;зарезервировать
    253.     test    eax,eax
    254.     jz  @f
    255.     ;без этой проверки функция работает, если параметры в "разумных" пределах
    256.     add edi,10000h
    257.     ;память резервируется по 10000h за шаг
    258.     cmp edi,esi
    259.     jl  @b
    260.      @@:
    261.     popa
    262.     ret
    263. endp
    264.  
    265. api_table:
    266. _UnmapViewOfFile dd UnmapViewOfFile
    267. _VirtualAlloc    dd VirtualAlloc
    268. _LoadLibrary     dd LoadLibrary
    269. _GetProcAddress  dd GetProcAddress
    270. _VirtualFree     dd VirtualFree
    271. dd 0
    272. ;таблица АПИ, необходимых для работы загрузчика
    273.  
    274. some_file:
    275. _bin    file FILE_NAME
    276. ;файлик, который будем загружать
    277.     _bin_size     = $ - _bin
    278. alloced_size=$-alloced_area_start
    Это не тоже самое что и у меня ?
    Код (Text):
    1. some_file:
    2. _bin    file FILE_NAME
    3. ;файлик, который будем загружать
    4.     _bin_size     = $ - _bin
    5. alloced_size=$-alloced_area_start
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Flasher
    > Это не тоже самое что и у меня ?
    Твое db DB 77,90 ни как не похоже на "MZ"

    Я проверял так:
    1.1) написал подопытного
    Код (Text):
    1. ;; foo1.asm
    2. .386
    3. .model flat,stdcall
    4. option casemap:none
    5. .nolist
    6. include windows.inc
    7. include kernel32.inc
    8. includelib kernel32.lib
    9. include user32.inc
    10. includelib user32.lib
    11. .list
    12. .code
    13. start:
    14.     invoke  MessageBoxA, 0, 0, 0, 0
    15.     invoke  ExitProcess, 0
    16. end start
    1.2) собрал exe'шник foo1.exe c базой /base:0x10000;
    1.3) запустил его - MessageBox есть.

    2.1) открыл foo1.exe в HexEdit v1.2 by Catch22;
    2.2) выделил все - Edit \ Select All;
    2.3) скопировал в буфер обмена для вставки а asm-файл - Edit \ Copy As \ Assembler source;
    2.4) закрыл HexEdit.

    3.1) открыл текстовый редактор;
    3.2) вставил содержимое буфера обмена;
    3.3) кое-где добавил нулей, т.е. было ffh сделал 0ffh;
    3.4) сохранил файл как foo1.inc.

    4.1) взял твой код из #1 и сохранил в foo0.asm;
    4.2) внес изменение, было
    Код (Text):
    1. ...
    2. some_file:
    3. DB 77,90,0,0,80,69,0,0,76,1,1,0,0,0,0,0
    4. ...
    5. DB 65,0
    6. size_some_file = 274
    7. ...
    стало
    Код (Text):
    1. ...
    2. some_file:
    3. include foo.inc
    4. size_some_file = $ - offset some_file
    5. ...
    4.3) собрал exe'шник foo0.exe;
    4.4.) запустил его - - MessageBox есть.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Обрати внимание в fasm варианте код помещён в секцию данных, а в масме у тебя он в секции кода, куда запись по умолчению запрещена.
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    удалён дубликат
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Y_Mur
    Обрати внимание, что код переносится в специально зарезервированный блок, имеющий атрибуты PAGE_EXECUTE_READWRITE
     
  8. n1kt0

    n1kt0 Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    160
    а какие проблемы-то собственно ?
    ну отличается синтаксис на уровне
    1)fasm->mov eax,some_variable
    masm->mov eax,offset some_variable
    2)fasm->mov eax,dword [ebx]
    masm->mov eax,dword ptr ebx

    есть конечно еще много отличий, но на вскидку в коде отличий мало
     
  9. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Не получается :)
    Вставляю
    Код (Text):
    1. some_file:
    2. db  04Dh, 05Ah, 000h, 000h, 050h, 045h, 000h, 000h, 04Ch, 001h, 001h, 000h, 000h, 000h, 000h, 000h
    3. db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 078h, 000h, 00Fh, 001h, 00Bh, 001h, 000h, 000h
    4. db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0BCh, 000h, 000h, 000h
    5. db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 014h, 013h, 004h, 000h, 000h, 000h
    6. db  004h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 004h, 000h, 000h, 000h
    7. db  000h, 000h, 000h, 000h, 012h, 001h, 000h, 000h, 0BCh, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    8. db  002h, 000h, 000h, 000h, 000h, 010h, 000h, 000h, 000h, 010h, 000h, 000h, 000h, 010h, 000h, 000h
    9. db  000h, 010h, 000h, 000h, 000h, 000h, 000h, 000h, 002h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    10. db  000h, 000h, 000h, 000h, 0E1h, 000h, 000h, 000h, 031h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    11. db  000h, 000h, 000h, 000h, 02Eh, 069h, 06Dh, 070h, 06Fh, 072h, 074h, 000h, 031h, 000h, 000h, 000h
    12. db  0BCh, 000h, 000h, 000h, 031h, 000h, 000h, 000h, 0BCh, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    13. db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 020h, 000h, 000h, 0E0h, 06Ah, 000h, 068h, 0DBh
    14. db  000h, 014h, 013h, 06Ah, 000h, 06Ah, 000h, 0FFh, 015h, 0FCh, 000h, 014h, 013h, 0E8h, 000h, 000h
    15. db  000h, 000h, 06Ah, 000h, 064h, 089h, 020h, 0FFh, 064h, 024h, 004h, 048h, 065h, 06Ch, 06Ch, 06Fh
    16. db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0F5h, 000h, 000h
    17. db  000h, 0FCh, 000h, 000h, 000h, 055h, 053h, 045h, 052h, 033h, 032h, 000h, 004h, 001h, 000h, 000h
    18. db  000h, 000h, 000h, 000h, 000h, 000h, 04Dh, 065h, 073h, 073h, 061h, 067h, 065h, 042h, 06Fh, 078h
    19. db  041h, 000
    20. size_some_file = $ - offset some_file
    q_q, попробуй у себя вставить, плиз
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Flasher
    У тебя хитрая вставка. Надо разбирать ее заголовок и править загрузчик.
     
  11. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Хахах, господа ассемблерщики настолько узко-специализированны, что могут собрать код на xASM'лере и не могут собрать на yASM'лере? :) а если с x86 пересесть на x64, arm, mips или еще что-нибудь более экзотическое, то вообще труба? =)
     
  12. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Да, скомпилил с /base:0x10000 - заработало.

    censored, помоему путаешь интуитивное мышление с знаниями статистических данных (про синтаксис языка имею ввиду) :)
     
  13. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Flasher
    Хз что там путать, использовал 4 диалекта х86-оссемблера -- никаких проблем перенести с одного на другой не возникало.
     
  14. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Flasher
    > скомпилил с /base:0x10000 - заработало
    Это ответ мне? Образ #9 без правки загрузчика #1 не должен заработать. Поясняю
    Код (Text):
    1. ...
    2. ;; тут EDX указывает на IMAGE_NT_HEADERS32 (за ним первый IMAGE_SECTION_HEADER),
    3. ;; если образ "правильный", то размер IMAGE_NT_HEADERS32 равен 0F8h,
    4.  
    5. lea eax, [edx+0F8h]
    6.  
    7. ;; образ #9 хитрый, у него не шестнадцать IMAGE_DATA_DIRECTORY, а всего три,
    8. ;; следовательно, тут EAX не указывает на первый IMAGE_SECTION_HEADER
    9. ;; как этого ожидает process_sections
    10.  
    11. movzx   ecx, word ptr [edx+6]
    12.  
    13. push    pVA
    14. push    eax
    15. push    ecx
    16. call    process_sections
    17. ...
    n1kt0 & censored
    Imho для того чтобы отвечать по теме не достаточно прочитать ее заголовок.
     
  15. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    q_q, понял.
    Благодарствую Уважаемый :)
     
  16. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    надёжнее использовать SizeOfOptionalHeader

    Код (Text):
    1. movzx   ecx,[eax].IMAGE_NT_HEADERS.FileHeader.SizeOfOptionalHeader
    2. lea eax,[ecx][eax].IMAGE_NT_HEADERS.OptionalHeader.Magic