Фасм не компилит исполняемый код!

Тема в разделе "WASM.BEGINNERS", создана пользователем ukrlanser, 17 май 2010.

  1. ukrlanser

    ukrlanser New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2008
    Сообщения:
    22
    Всем привет.
    Пишу небольшую програмку, и столкнулся с такой проблемой:

    исходник проги:

    Код (Text):
    1. format PE GUI 4.0
    2. include 'win32a.inc'
    3. include 'Win32Structures.inc'
    4. include 'Win32Import.inc'
    5. section '.code' code readable executable
    6. start:
    7.          push sr
    8.          push FileName
    9.          call [FindFirstFileA]
    10.          push 0 ; тип сообщения (MB_OK)
    11.          push 0 ; заголовок
    12.          push sr.cFileName ; сообщение
    13.          push 0 ; дескриптор окна - владельца
    14.          call [MessageBoxA]
    15. exit:
    16.         invoke  ExitProcess,0
    17.  
    18. data import
    19.  
    20.  library kernel32,'KERNEL32.DLL',\
    21.          user32,'USER32.DLL',\
    22.          winmm,'WINMM.DLL'
    23.  
    24.  import kernel32,\
    25.         ExitProcess,'ExitProcess'
    26.  
    27.  ;import user32,\
    28.  ;       MessageBoxA,'MessageBoxA'
    29.  
    30.  import winmm,\
    31.         mciSendString,'mciSendStringA'
    32.  
    33. FileName db '*.*',0
    34. sr WIN32_FIND_DATA
    35.  
    36. end data
    компилируется без ошибок. Загружаю в ollydbg и вижу такую картину начиная со стартового кода:

    Код (Text):
    1. ADD BYTE PTR DS:[EAX],AL
    2. ADD BYTE PTR DS:[EAX],AL
    3. ADD BYTE PTR DS:[EAX],AL
    4. ADD BYTE PTR DS:[EAX],AL
    5. ADD BYTE PTR DS:[EAX],AL
    Сердцем понимаю :) что что-то с памятью намудрил, но сам ни хрена понять не могу. Сверяю с другими исходниками - все нормально. Остальное тоже компилится без проблем. Где я накосячил?
     
  2. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    248
    мой кодес :)
    думаю что дважды импорты прописываются - include 'Win32Import.inc' - вот здесь у меня все прописано
    Так что зря это :
    data import

    library kernel32,'KERNEL32.DLL',\
    user32,'USER32.DLL',\
    winmm,'WINMM.DLL'

    import kernel32,\
    ExitProcess,'ExitProcess'

    ;import user32,\
    ; MessageBoxA,'MessageBoxA'

    import winmm,\
    mciSendString,'mciSendStringA'
     
  3. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    format PE GUI 4.0
    entry start
     
  4. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Код (Text):
    1. format PE GUI 4.0
    2. entry start          ; <--
    3.  
    4. include 'win32a.inc'
    5. include 'Win32Structures.inc'
    6. include 'Win32Import.inc'
     
  5. ukrlanser

    ukrlanser New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2008
    Сообщения:
    22
    При [entry start] Olly вообще сообщила, что мол entry point outside the code. После этого все-таки вывела дизасм. листинг, но в нем ф-ция findfirstfile не определена! Хотя exitprocess висит на своем месте...

    Если удаляю весь импорт, то компилятор не опознает вызовы процедур, и компилить не хочет.
     
  6. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    248
    вот это в секцию .code надо
     
  7. ukrlanser

    ukrlanser New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2008
    Сообщения:
    22
    Перенес. Пишу так:

    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. section '.code' code readable executable
    5.  
    6. include 'win32a.inc'
    7. include 'Win32Structures.inc'
    8. include 'Win32Import.inc'
    9.  
    10. start:
    11.          push sr
    12.          push FileName
    13.          call FindFirstFileA
    14.          push 0
    15.          push 0
    16.          push sr.cFileName
    17.          push 0
    18.          call MessageBoxA
    19.  
    20. exit:
    21.         invoke  ExitProcess,0
    22. data import
    23.  
    24. library kernel32,'KERNEL32.DLL',\
    25.          user32,'USER32.DLL'
    26.  
    27. import kernel32,\
    28.         ExitProcess,'ExitProcess'
    29.  
    30. FileName db '*.*',0
    31. sr WIN32_FIND_DATA
    32.  
    33. end data
    Олька выдает листинг:

    Код (Text):
    1. 0040111C > $ 68 9A114000    PUSH BEER.0040119A
    2. 00401121   . 68 96114000      PUSH BEER.00401196                       ;  ASCII "*.*"
    3. 00401126   . E8 11FFFFFF      CALL BEER.0040103C
    4. 0040112B   . 6A 00               PUSH 0
    5. 0040112D   . 6A 00               PUSH 0
    6. 0040112F   . 68 C6114000      PUSH BEER.004011C6
    7. 00401134   . 6A 00               PUSH 0
    8. 00401136   . E8 25FFFFFF     CALL BEER.00401060
    9. 0040113B   . 6A 00               PUSH 0                                   ; /ExitCode = 0
    10. 0040113D   . FF15 80114000  CALL DWORD PTR DS:[<&KERNEL32.ExitProces>; \ExitProcess
    11. 00401143   . 78110000       DD 00001178                              ;  Struct 'IMAGE_IMPORT_DESCRIPTOR'
    12. 00401147   . 00000000       DD 00000000
    13. 0040114B     00             DB 00
    14. 0040114C   > 0000           ADD BYTE PTR DS:[EAX],AL
    15. 0040114E     00             DB 00
    16. 0040114F   . 6B110000       DD 0000116B
    17. 00401153     80             DB 80
    18. 00401154   > 1100           ADC DWORD PTR DS:[EAX],EAX
    19. 00401156     00             DB 00
    20. 00401157     00             DB 00                                    ;  Struct 'IMAGE_IMPORT_DESCRIPTOR'
    21. 00401158     00             DB 00
    22. 00401159   > 0000           ADD BYTE PTR DS:[EAX],AL
    23. 0040115B     00             DB 00
    24. 0040115C   > 0000           ADD BYTE PTR DS:[EAX],AL
    25. 0040115E     00             DB 00
    26. 0040115F   . 00000000       DD 00000000
    27. 00401163   . 00000000       DD 00000000
    28. 00401167   . 00000000       DD 00000000
    29. 0040116B   > 4B             DEC EBX
    30. 0040116C     45             DB 45                                    ;  CHAR 'E'
    31. 0040116D     52             DB 52                                    ;  CHAR 'R'
    32. 0040116E   > 4E             DEC ESI
    33. 0040116F     45             DB 45                                    ;  CHAR 'E'
    34. 00401170     4C             DB 4C                                    ;  CHAR 'L'
    35. 00401171     33             DB 33                                    ;  CHAR '3'
    36. 00401172     32             DB 32                                    ;  CHAR '2'
    37. 00401173     2E             DB 2E                                    ;  CHAR '.'
    38. 00401174     44             DB 44                                    ;  CHAR 'D'
    39. 00401175     4C             DB 4C                                    ;  CHAR 'L'
    40. 00401176   > 4C             DEC ESP
    41. 00401177     00             DB 00
    42. 00401178   . 88110000       DD 00001188                              ;  Import lookup table for 'KERNEL32.DLL'
    43. 0040117C     00             DB 00
    44. 0040117D   > 0000           ADD BYTE PTR DS:[EAX],AL
    45. 0040117F     00             DB 00
    46. 00401180 > . 372A5D77       DD kernel32.ExitProcess
    47. 00401184     00             DB 00
    48. 00401185     00             DB 00
    49. 00401186     00             DB 00
    50. 00401187   > 0000           ADD BYTE PTR DS:[EAX],AL
    51. 00401189     00             DB 00
    52. 0040118A   . 45 78 69 74 50>ASCII "ExitProcess",0
    53. 00401196   . 2A 2E 2A 00    ASCII "*.*",0
    Упорно не хочет видеть вызов FindFirstFile и MessageBox. Самое интересное, что эта хрень после запуска висит в памяти, не прекращая процесс!
     
  8. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    248
    вообще лучше забейте тогда на
    include 'Win32Structures.inc'
    include 'Win32Import.inc'
    и юзайте фасмовские макросы и пр.
     
  9. ukrlanser

    ukrlanser New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2008
    Сообщения:
    22
    пишу так:

    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. section '.code' code readable executable
    5.  
    6. include 'win32a.inc'
    7. include 'struc.h'
    8. ;include 'Win32Structures.inc'
    9. ;include 'Win32Import.inc'
    10. FileName db '*.*',0
    11. sr WIN32_FIND_DATA
    12.  
    13. start:
    14.          push sr
    15.          push FileName
    16.          call FindFirstFileA
    17.          push 0 ; òèï ñîîáùåíèÿ (MB_OK)
    18.          push 0 ; çàãîëîâîê
    19.          push sr.cFileName ; ñîîáùåíèå
    20.          push 0 ; äåñêðèïòîð îêíà - âëàäåëüöà
    21.          call MessageBoxA
    22.  
    23.  
    24.  
    25. exit:
    26.         invoke  ExitProcess,0
    27.  
    28. data import
    29.  
    30. library kernel32,'KERNEL32.DLL',\
    31.          user32,'USER32.DLL'
    32.  
    33.  
    34. import kernel32,\
    35.         ExitProcess,'ExitProcess',\
    36.         FindFirstFileA,'FindFirstFileA'
    37.  
    38.  
    39. import user32,\
    40.         MessageBoxA,'MessageBoxA'
    41.  
    42.  
    43. end data
    В struc.h ->

    Код (Text):
    1. struc FILETIME
    2. {
    3.   .dwLowDateTime  dd 0
    4.   .dwHighDateTime dd 0
    5. }
    6.  
    7. struc WIN32_FIND_DATA
    8. {
    9.   .dwFileAttributes   dd 0
    10.   .ftCreationTime     FILETIME
    11.   .ftLastAccessTime   FILETIME
    12.   .ftLastWriteTime    FILETIME
    13.   .nFileSizeHigh      dd 0
    14.   .nFileSizeLow       dd 0
    15.   .dwReserved0        dd 0
    16.   .dwReserved1        dd 0
    17.   .cFileName          rb 100h
    18.   .cAlternateFileName rb 14
    19. }
    Компилируется без ошибок. Запускаю Ольку:

    Код (Text):
    1. 0040113E >/$ 68 04104000    PUSH BEER.00401004
    2. 00401143  |. 68 00104000    PUSH BEER.00401000                       ;  ASCII "*.*"
    3. 00401148  |. E8 7D000000    CALL <&KERNEL32.FindFirstFileA>
    4. 0040114D  |. 6A 00          PUSH 0
    5. 0040114F  |. 6A 00          PUSH 0
    6. 00401151  |. 68 30104000    PUSH BEER.00401030
    7. 00401156  |. 6A 00          PUSH 0
    8. 00401158  |. E8 9D000000    CALL <&USER32.MessageBoxA>
    9. 0040115D  |. 6A 00          PUSH 0                                   ; /ExitCode = 0
    10. 0040115F  \. FF15 C6114000  CALL DWORD PTR DS:[<&KERNEL32.ExitProces>; \ExitProcess
    11. 00401165   . BA110000       DD 000011BA                              ;  Struct 'IMAGE_IMPORT_DESCRIPTOR'
    12. 00401169   . 00000000       DD 00000000
    13. 0040116D   . 00000000       DD 00000000
    14. 00401171   . A1110000       DD 000011A1
    15. 00401175   . C6110000       DD 000011C6
    16. 00401179   . F2110000       DD 000011F2                              ;  Struct 'IMAGE_IMPORT_DESCRIPTOR'
    17. 0040117D   . 00000000       DD 00000000
    18. 00401181   . 00000000       DD 00000000
    19. 00401185   . AE110000       DD 000011AE
    20. 00401189   . FA110000       DD 000011FA
    21. 0040118D   . 00000000       DD 00000000                              ;  Struct 'IMAGE_IMPORT_DESCRIPTOR'
    22. 00401191   . 00000000       DD 00000000
    23. 00401195   . 00000000       DD 00000000
    24. 00401199   . 00000000       DD 00000000
    25. 0040119D   . 00000000       DD 00000000
    26. 004011A1   . 4B 45 52 4E 45>ASCII "KERNEL32.DLL",0
    27. 004011AE   . 55 53 45 52 33>ASCII "USER32.DLL",0
    28. 004011B9     00             DB 00
    29. 004011BA   . D2110000       DD 000011D2                              ;  Import lookup table for 'KERNEL32.DLL'
    30. 004011BE   . E0110000       DD 000011E0
    31. 004011C2   . 00000000       DD 00000000
    32. 004011C6 > . 372A5D77       DD kernel32.ExitProcess
    33. 004011CA > $ 96             XCHG EAX,ESI
    34. 004011CB   . F2:            PREFIX REPNE:                            ;  Superfluous prefix
    35. 004011CC   . 5D             POP EBP
    36. 004011CD   . 77 00          JA SHORT BEER.004011CF
    37. 004011CF   > 0000           ADD BYTE PTR DS:[EAX],AL
    38. 004011D1   . 0000           ADD BYTE PTR DS:[EAX],AL
    39. 004011D3     00             DB 00
    40. 004011D4   . 45 78 69 74 50>ASCII "ExitProcess",0
    41. 004011E0   . 0000           DW 0000
    42. 004011E2   . 46 69 6E 64 46>ASCII "FindFirstFileA",0
    При отладке FindFirstFileA прыгает на адрес 004011CF, и срабатывает исключение. Вот это да! Я уже охренел ошибки искать. Что это за хрень? Может, я неправильно объявил вызов ф-ции?
     
  10. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    мда, подозреваю, что и MessageBoxA не определена. Короче, не знаю чей там кодес, но... судя по всему за основу взят один из примеров к фасму.

    1. Закомментировать надо все-таки mciSendString, поскольку не используется.
    2. Инклуды с макросами до секции кода, все так. Инклуды с импортом(если там есть такие) - в строго отведенное место.
    3. В импорте необходимо иметь MessageBoxA, как и другие используемые функции.
    4. Прежде чем использовать неведомо кем сделанные инклуды (если они не входят в пакет), неплохо заглянуть внутрь, на предмет "какая криворукая обезьяна их писала?". Если вроде правильно - обезьяну умалчиваешь. Если не понимаешь чего там - лучше не использовать.

    Ну и про последнее: есть разница между

    Call [MessageBoxA]
    и
    Call MessageBoxA

    Теоретически оба варианта валидны, и могут быть использованы в зависимости от способа оформления импорта. Практически - пока не въехал, пробуй со скобками и без :lol: что-то одно должно сработать.
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    ukrlanser
    используйте тег CODE
     
  12. ukrlanser

    ukrlanser New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2008
    Сообщения:
    22
    Спасибо. Скомпилировал так:

    Код (Text):
    1. format PE console
    2. entry start
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.code' code import writeable readable executable
    7.  
    8. include 'Win32Structures.inc'
    9. include 'Win32Import.inc'
    10.  
    11. FileName db '*.*',0
    12. sr WIN32_FIND_DATA
    13.  
    14. start:
    15.          push sr
    16.          push FileName
    17.          call [FindFirstFileA]
    18.          push 0 ; òèï ñîîáùåíèÿ (MB_OK)
    19.          push 0 ; çàãîëîâîê
    20.          push sr.cFileName ; ñîîáùåíèå
    21.          push 0 ; äåñêðèïòîð îêíà - âëàäåëüöà
    22.          call [MessageBoxA]
    23.  
    24. exit:
    25.         invoke ExitProcess,0
    mciSendString удалил, в импорт добавил MessageBoxA. Наконец-то компиляция! Но... при запуске показывает точку вместо имени файла. Что это такое?
    Секцию text заменил на code.
     
  13. ukrlanser

    ukrlanser New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2008
    Сообщения:
    22
    Дико извиняюсь, все работает!
    Просто заменил *.* на *.exe. Спасибо!
     
  14. ukrlanser

    ukrlanser New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2008
    Сообщения:
    22
    Я дико извиняюсь, но есть еще один вопрос. Новую тему создавать не хочу, спрошу в старой.

    Код (Text):
    1. format PE console
    2. entry start
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.code' code import writeable readable executable
    7.  
    8.  
    9. include 'Win32Structures.inc'
    10. include 'Win32Import.inc'
    11.  
    12. FileName db '*.exe',0
    13. sr WIN32_FIND_DATA
    14.  
    15. start:
    16.          push sr
    17.          push FileName
    18.          call [FindFirstFileA]
    19.          push 0 ; òèï ñîîáùåíèÿ (MB_OK)
    20.          push 0 ; çàãîëîâîê
    21.          push sr.cFileName ; ñîîáùåíèå
    22.          push 0 ; äåñêðèïòîð îêíà - âëàäåëüöà
    23.          call [MessageBoxA]
    24.        
    25.          invoke  CreateFile, sr.cFileName, GENERIC_WRITE or GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0
    26.          cmp     eax, INVALID_HANDLE_VALUE
    27.          je     exit
    28.  
    29. exit:
    30.         invoke ExitProcess,0
    В инклудах CreateFile определен:
    ...
    CreateFile dd RVA _CreateFileA
    ...
    _CreateFileA dw 0
    db 'CreateFile',0

    При запуске пишет The procedure entry point CreateFile could not be located in the dll kernel32.dll

    Определил ф-цию вроде бы правильно. Остальные функции определены так же, и все работает. Почему не видит ф-цию в kernel32.dll??
     
  15. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Потому что в kernel32.dll есть две ф-ии: CreateFileA (ASCII версия) и CreateFileW (Unicode версия). В высокоуровневых языках проект управляется define'ами UNICODE и _UNICODE, которые заменяют макрос CreateFile на CreateFileA или на CreateFileW.
     
  16. ukrlanser

    ukrlanser New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2008
    Сообщения:
    22
    Спасибо!
     
  17. make

    make New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2009
    Сообщения:
    59
    CreateFileA/W
     
  18. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Asterix
    Ему пофигу на теги