native api fasm - работает в win7,не работает в ХР

Тема в разделе "WASM.BEGINNERS", создана пользователем M0rg0t, 9 янв 2012.

  1. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Такая вот проблема:
    есть код на фасм, который на одних ОС работает нормально, а на других почему-то нет (ошибка доступа). В основном, нормально он на 7 (но не на всех), а не работает на ХР. Аналогичный код на Масм работает везде без проблем.
    В чем может быть сложность с фасм-кодом, может у кого-то есть мысли?

    Код (Text):
    1. format PE GUI
    2. entry _start
    3. include 'include\win32ax.inc'
    4. include 'include\encoding\win1251.inc'
    5.  
    6. section '.code' code readable executable import writeable
    7. library ntdll,'ntdll.dll'
    8. import  ntdll, \
    9.         NtCreateFile, 'NtCreateFile',\
    10.         NtWriteFile, 'NtWriteFile'
    11.  
    12.  
    13. struct UNICODE_STRING
    14.         Length          dw ?
    15.         MaximumLength   dw ?
    16.         Buffer          dd ?
    17. ends
    18.  
    19. struct OBJECT_ATTRIBUTES
    20.         Length          dd ?
    21.         RootDirectory   dd ?
    22.         ObjectName      dd ?
    23.         Attributes      dd ?
    24.         SD              dd ?
    25.         SQOS            dd ?
    26. ends
    27.  
    28. iosb    dd 2 dup (0)
    29. hFile   dd ?
    30. fn      UNICODE_STRING    ?
    31. attr    OBJECT_ATTRIBUTES ?
    32.  
    33. FileName dw '\','?','?','\','d',':','\','f','a','s','m','i', 't','.','t','x','t', 0
    34. FileNameEnd:
    35.  
    36. Buffer db "some text",13,10,"QQ:",13,10,"Email:fasm at 126 fasm su",13,10,\
    37. "Homepage:http://fasm.it",13,10,0
    38. BufferEnd:
    39.  
    40. _start:
    41.  
    42. mov [attr.Length],              sizeof.OBJECT_ATTRIBUTES
    43. mov [attr.RootDirectory],       0
    44. mov [attr.Attributes],          40h
    45. mov [attr.ObjectName],          fn
    46. mov [attr.SD],                  0
    47. mov [attr.SQOS],                0
    48.  
    49. mov [fn.Length], FileNameEnd - FileName - 2
    50. mov [fn.MaximumLength], FileNameEnd - FileName
    51. mov [fn.Buffer], FileName
    52.  
    53. invoke NtCreateFile, hFile, 1F01ffh, attr, iosb,0,1,0,2,060h,0,0
    54. invoke NtWriteFile, [hFile] ,0, 0, 0, iosb, Buffer, BufferEnd - Buffer - 1,0,0
    55. ret
     
  2. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Код (Text):
    1. format PE GUI
    2. entry _start
    3. include 'win32ax.inc'
    4. include '\encoding\win1251.inc'
    5.  
    6. section '.data' data readable writeable
    7. struct UNICODE_STRING
    8.     Length      dw ?
    9.     MaximumLength   dw ?
    10.     Buffer      dd ?
    11. ends
    12.  
    13. struct OBJECT_ATTRIBUTES
    14.     Length      dd ?
    15.     RootDirectory   dd ?
    16.     ObjectName  dd ?
    17.     Attributes  dd ?
    18.     SD      dd ?
    19.     SQOS        dd ?
    20. ends
    21.  
    22. iosb    dd 2 dup (0)
    23. hFile   dd ?
    24. fn  UNICODE_STRING    ?
    25. attr    OBJECT_ATTRIBUTES ?
    26.  
    27. FileName dw '\','?','?','\','d',':','\','f','a','s','m','i', 't','.','t','x','t', 0
    28. FileNameEnd:
    29.  
    30. Buffer db "some text",13,10,"QQ:",13,10,"Email:fasm at 126 fasm su",13,10,\
    31. "Homepage:http://fasm.it",13,10,0
    32. BufferEnd:
    33.  
    34. section '.code' code readable executable
    35. _start:
    36.  
    37. mov [attr.Length],      sizeof.OBJECT_ATTRIBUTES
    38. mov [attr.RootDirectory],   0
    39. mov [attr.Attributes],      40h
    40. mov [attr.ObjectName],      fn
    41. mov [attr.SD],          0
    42. mov [attr.SQOS],        0
    43.  
    44. mov [fn.Length], FileNameEnd - FileName - 2
    45. mov [fn.MaximumLength], FileNameEnd - FileName
    46. mov [fn.Buffer], FileName
    47.  
    48. invoke NtCreateFile, hFile, 1F01ffh, attr, iosb,0,1,0,2,060h,0,0
    49. invoke NtWriteFile, [hFile] ,0, 0, 0, iosb, Buffer, BufferEnd - Buffer - 1,0,0
    50. ret
    51.  
    52. section '.idata' import data readable
    53.  
    54. library ntdll,'ntdll.dll'
    55. import  ntdll, \
    56.     NtCreateFile, 'NtCreateFile',\
    57.     NtWriteFile, 'NtWriteFile'
    Либо делай выравнивание, если не хочешь другие секции создавать.
     
  3. f2065

    f2065 Eugene

    Публикаций:
    0
    Регистрация:
    18 авг 2010
    Сообщения:
    24
    Адрес:
    Russia,Moscow
    M0rg0t
    Ну в частности, секции executable+writeable сильно не нравятся DEP… Надо или разносить в разные секции, или на конкретном компе вноситься в исключения DEP.
     
  4. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Спасибо, так все работает.
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    f2065
    Если явно указано, что executable, то DEP здесь не причём. Не нравиться секции со смешанным доступом могут разве что эвристике антивирусов.
    M0rg0t
    С одной стороны подключаете win1251.inc, а с другой занимаетесь такими же извращениями, что и в masm:
    Код (Text):
    1. FileName dw '\','?','?','\','d',':','\','f','a','s','m','i', 't','.','t','x','t', 0
    В fasm'е для объявления юникодных строк есть директива du:
    Код (Text):
    1. FileName du '\??\d:\fasmit.txt',0
     
  6. f2065

    f2065 Eugene

    Публикаций:
    0
    Регистрация:
    18 авг 2010
    Сообщения:
    24
    Адрес:
    Russia,Moscow
    Которая например глючит с русскими буквами, и ранее с align вроде был глюк. Я сделал макрос textW (и заодно - он выдаёт size.Metka) с полной таблицей utf8

    Код (Text):
    1. macro textW [value] {
    2. common
    3.     local .length,.position,.wide
    4.     virtual at 0
    5.         db value
    6.         .length = $
    7.     end virtual
    8.     .position = 0
    9.     while .position < .length
    10.         virtual at 0
    11.             db value
    12.             load .char byte from .position
    13.         end virtual
    14.         if .char <= 0x7F
    15.             .wide = .char
    16.         else if (.char >= 0xC0)
    17.             .wide = .char + 0x350
    18.         else if (.char = 0x80) ; Ђ
    19.             .wide = 0x0402
    20.         else if (.char = 0x81) ; Ѓ
    21.             .wide = 0x0403
    22.         else if (.char = 0x82) ; ‚
    23.             .wide = 0x201A
    24.         else if (.char = 0x83) ; ѓ
    25.             .wide = 0x0453
    26.         else if (.char = 0x84) ; „
    27.             .wide = 0x201E
    28.         else if (.char = 0x85) ; …
    29.             .wide = 0x2026
    30.         else if (.char = 0x86) ; †
    31.             .wide = 0x2020
    32.         else if (.char = 0x87) ; ‡
    33.             .wide = 0x2021
    34.         else if (.char = 0x88) ; ?
    35.             .wide = 0x20AC
    36.         else if (.char = 0x89) ; ‰
    37.             .wide = 0x2030
    38.         else if (.char = 0x8A) ; Љ
    39.             .wide = 0x0409
    40.         else if (.char = 0x8B) ; ‹
    41.             .wide = 0x2039
    42.         else if (.char = 0x8C) ; Њ
    43.             .wide = 0x040A
    44.         else if (.char = 0x8D) ; Ќ
    45.             .wide = 0x040C
    46.         else if (.char = 0x8E) ; Ћ
    47.             .wide = 0x040B
    48.         else if (.char = 0x8F) ; Џ
    49.             .wide = 0x040F
    50.         else if (.char = 0x90) ; ђ
    51.             .wide = 0x0452
    52.         else if (.char = 0x91) ; ‘
    53.             .wide = 0x2018
    54.         else if (.char = 0x92) ; ’
    55.             .wide = 0x2019
    56.         else if (.char = 0x93) ; “
    57.             .wide = 0x201C
    58.         else if (.char = 0x94) ; ”
    59.             .wide = 0x201D
    60.         else if (.char = 0x95) ; •
    61.             .wide = 0x2022
    62.         else if (.char = 0x96) ; –
    63.             .wide = 0x2013
    64.         else if (.char = 0x97) ; —
    65.             .wide = 0x2014
    66.         else if (.char = 0x98) ; ?
    67.             .wide = 0x3F
    68.         else if (.char = 0x99) ; ™
    69.             .wide = 0x2122
    70.         else if (.char = 0x9A) ; љ
    71.             .wide = 0x0459
    72.         else if (.char = 0x9B) ; ›
    73.             .wide = 0x203A
    74.         else if (.char = 0x9C) ; њ
    75.             .wide = 0x045A
    76.         else if (.char = 0x9D) ; ќ
    77.             .wide = 0x045C
    78.         else if (.char = 0x9E) ; ћ
    79.             .wide = 0x045B
    80.         else if (.char = 0x9F) ; џ
    81.             .wide = 0x045F
    82.         else if (.char = 0xA0) ; NBSP
    83.             .wide = 0x00A0
    84.         else if (.char = 0xA1) ; Ў
    85.             .wide = 0x040E
    86.         else if (.char = 0xA2) ; ў
    87.             .wide = 0x045E
    88.         else if (.char = 0xA3) ; Ј
    89.             .wide = 0x0408
    90.         else if (.char = 0xA4) ; ¤
    91.             .wide = 0x00A4
    92.         else if (.char = 0xA5) ; Ґ
    93.             .wide = 0x0490
    94.         else if (.char = 0xA6) ; ¦
    95.             .wide = 0x00A6
    96.         else if (.char = 0xA7) ; §
    97.             .wide = 0x00A7
    98.         else if (.char = 0xA8) ; Ё
    99.             .wide = 0x0401
    100.         else if (.char = 0xA9) ; ©
    101.             .wide = 0x00A9
    102.         else if (.char = 0xAA) ; Є
    103.             .wide = 0x0404
    104.         else if (.char = 0xAB) ; «
    105.             .wide = 0x00AB
    106.         else if (.char = 0xAC) ; ¬
    107.             .wide = 0x00AC
    108.         else if (.char = 0xAD) ; ?
    109.             .wide = 0x3F
    110.         else if (.char = 0xAE) ; ®
    111.             .wide = 0x00AE
    112.         else if (.char = 0xAF) ; Ї
    113.             .wide = 0x0407
    114.         else if (.char = 0xB0) ; °
    115.             .wide = 0x00B0
    116.         else if (.char = 0xB1) ; ±
    117.             .wide = 0x00B1
    118.         else if (.char = 0xB2) ; І
    119.             .wide = 0x0406
    120.         else if (.char = 0xB3) ; і
    121.             .wide = 0x0456
    122.         else if (.char = 0xB4) ; ґ
    123.             .wide = 0x0491
    124.         else if (.char = 0xB5) ; µ
    125.             .wide = 0x00B5
    126.         else if (.char = 0xB6) ; ¶
    127.             .wide = 0x00B6
    128.         else if (.char = 0xB7) ; ·
    129.             .wide = 0x00B7
    130.         else if (.char = 0xB8) ; ё
    131.             .wide = 0x0451
    132.         else if (.char = 0xB9) ; №
    133.             .wide = 0x2116
    134.         else if (.char = 0xBA) ; є
    135.             .wide = 0x0454
    136.         else if (.char = 0xBB) ; »
    137.             .wide = 0x00BB
    138.         else if (.char = 0xBC) ; ј
    139.             .wide = 0x0458
    140.         else if (.char = 0xBD) ; Ѕ
    141.             .wide = 0x0405
    142.         else if (.char = 0xBE) ; ѕ
    143.             .wide = 0x0455
    144.         else if (.char = 0xBF) ; ї
    145.             .wide = 0x0457
    146.         else
    147.             .wide = 0x3F
    148.         end if
    149.         dw .wide
    150.         .position = .position + 1
    151.     end while
    152. }
    153. struc textW [value] {
    154. common
    155. align 2
    156.     label . word
    157.     .temp_sz = $
    158.     textW value
    159.     .size = $ - .temp_sz
    160. }
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    f2065
    Глючащий пример использования в студию. Про align тоже с трудом верится.
     
  8. f2065

    f2065 Eugene

    Публикаций:
    0
    Регистрация:
    18 авг 2010
    Сообщения:
    24
    Адрес:
    Russia,Moscow
    l_inc
    С русскими буквами сейчас не удалось воспроизвести, может уже или исправили или я ранее что-то не так делал… Но по крайней мере у меня макрос сразу определяет .size (для работы с реестром очень полезно), а встроенный du - нет (или я не умею ?).

    Про align - в смысле du сам не делает align.
    И потом куча API-функций внезапно перестают работать (но не все).
    Например вот
    invoke RegCreateKeyExW, HKEY_CURRENT_USER, t_reg_test, 0, 0, 0, KEY_WRITE or KEY_WOW64_64KEY, 0, h_reg1, 0
    Если t_reg_test не выровнено по align 2 - то будет ошибка ERROR_NOACCESS.
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    f2065
    sizeof.stringname - более традиционный вариант. Я его придерживаюсь обычно.
    Со стандартными заголовками нет. Но для того, чтобы да, таких монстров, как в #6, создавать не обязательно. Достаточно так:
    Код (Text):
    1. struc du [args]
    2. {
    3.     common . du args
    4.     sizeof.#. = $-.
    5. }
    Ну это из серии "позволяет выстрелить в себе в ногу". Это не глюк. Для fasm вообще позволять выстрелить и себе, и другим в любую часть тела — обычное дело. Это плата за максимально возможную свободу. Сюда же и нулевой размер секции, и отсутствие проверок на число аргументов API, и никакого неявного выравнивания и прочее.