NASM WIN64 HELLO WORLD

Тема в разделе "NASM", создана пользователем Hacker, 9 янв 2021.

  1. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    CSIDL FOLDERID_ProgramFilesX86 equ 0x002a насколько я понял
    https://docs.microsoft.com/en-us/windows/win32/shell/csidl
    --- Сообщение объединено, 14 янв 2021 ---
    я не понял это что такое?
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Набери в гугле CLSID FOLDERID Program Files X86
    GUID {7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}
     
  3. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    не получается, то же самое ExceptionCode: C0000005 (EXCEPTION_ACCESS_VIOLATION)
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Hacker,
    я не собираюсь искать ошибки в твоей программе
     
  5. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    ага нашел вижу
    https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid
    --- Сообщение объединено, 14 янв 2021 ---
    Спасибо что помогаете мне! Со Старым Новым Годом Вас!
    --- Сообщение объединено, 14 янв 2021 ---
    Спасибо! С праздником!
     
  6. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Hacker, очевидно же, что константа эта неправильная. Надо , как у меня в примере, это раз. Почему передаю адрес - так хочет функция, как и буфер. Не просто буфер, а указатель на него.

    Почему бы не написать на языке Си, зачем именно Асм, еще и 64 битный, если так туго идет?
    --- Сообщение объединено, 14 янв 2021 ---
    Hacker, вот спецом для вас, х64 версия без макросов. Собирается без проблем масмом от Хатча.

    Код (ASM):
    1. include \masm32\include64\masm64rt.inc
    2.  
    3. .data
    4. FOLDERID_ProgramFilesX86 dd 07C5A40EFh
    5.                          dw 0A0FBh
    6.                          dw 04BFCh
    7.                          db 087h, 04Ah, 0C0h, 0F2h, 0E0h, 0B9h, 0FAh, 08Eh
    8.                        
    9. dll_name db "Shell32.dll",0
    10. api_name db "SHGetKnownFolderPath",0
    11.  
    12. .data?
    13. pfunc dq ?
    14. pbuf dq ?
    15.  
    16. .code
    17. main proc     ; масм автоматически тут создает пролог, sup rsp не надо (в насм мб и надо)
    18. lea rcx,dll_name ;первый параметр - имя дллки
    19. call LoadLibraryA ;вызов функции
    20. cmp eax,0 ;если нет такой длл
    21. jz @end ;выходим с программы
    22.  
    23. lea rdx,api_name ;второй параметр - имя апи функции
    24. mov rcx,rax ;первый параметр - модуль в памяти, он у нас был в rax (вернулся с LdrLib)
    25. call GetProcAddress ;вызов функции
    26. cmp eax,0 ;не нашли
    27. jz @end ;так выходим, надо бы еще закрыть хендл длл, но кому оно надо
    28. mov pfunc,rax ;адрес функции будет здесь
    29.  
    30.  
    31. xor rax,rax ;получаем 0, для оптимизации
    32. lea r9,pbuf ;ссылка на буфер
    33. mov r8,rax ;параметр - 0
    34. mov rdx,rax ;параметр - 0
    35. lea rcx,offset FOLDERID_ProgramFilesX86 ;ссылка на GUID
    36. call pfunc ;вызов функции
    37. ... в pbuf  будет ссылка на строку
    38. @end: ;тут очистка , обработка ошибок.
    39. ret
    40.  
     
    Mikl___ нравится это.
  7. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    561
    Господи какая хрень.
    Не ужели нельзя просто вот так.
    func_name(param1, &param2, ^param3, "С днём рождения тебя!")
    Что такое &, получить адрес.
    Что такое ^, преобразовать real4 в real8.
    Так же строка помещается в .const, и даётся на неё указатель.
    Вот как так. Всё это возможно в UASM, и FASM тоже можно наверное сделать. ассемблер всё сам сделает, как надо, согласно прототипу функции.
     
    Последнее редактирование: 14 янв 2021
  8. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Intro, UASM да, крутой асм.
    ну видимо человек хочет научится писать на чистом коде, хз.. Так то понятно, что можно упростить хотя бы до invoke
     
  9. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Intro,

    > Господи какая хрень.

    Дело не в символах и скрипте. Они кодят в своём мире, когда апп отваливается это приводит к реальности, системным вопросам. Если кодер не способен отладить свой же код, то какой это кодер. Это задроты которые изучили синтаксис примитивных скриптовых яп, зачем такое я не понимаю. ТС решил использовать архитектурный язык, без знания архитектуры и системы. И что же он так напишет.. будут вопросы по msgbox и всё равно оно отвалится на фаулте. Просто иначе не может быть.
     
  10. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    Всё работает спасибо. Вопрос такой почему не получается строки в буфере сложить? Вот код:

    Код (ASM):
    1.  
    2. global start
    3.  
    4. NULL equ 0
    5. KEY_ALL_ACCESS equ 0x0000F003F
    6. HKEY_CURRENT_USER equ 0x80000001
    7.  
    8.  extern SHGetKnownFolderPath
    9.  extern lstrcatA
    10.  extern DeleteFileA
    11.  extern RegOpenKeyExA
    12.  extern RegDeleteKeyA
    13.  extern RegCloseKey
    14.  extern MessageBoxA
    15.  extern ExitProcess
    16.  
    17. section .data
    18. BUFFER db 260 dup (?)
    19. pBuf resq 1
    20. hKey resq 1
    21. FOLDERID_ProgramFilesX86 dd 0x7C5A40EF
    22.      dw 0xA0FB
    23.      dw 0x4BFC
    24.      db 0x87,0x4A,0xC0,0xF2,0xE0,0xB9,0xFA,0x8E
    25.      
    26. xchat db '\xchat\inst.conf',0
    27. RegistryKey db '\Software\XChat\',0
    28. installed db 'installed',0
    29. MessBox db 'XChat Trial Reset',0
    30.  
    31. section .code
    32. start:
    33.  
    34.     sub rsp,40
    35.  
    36.     mov r9 , pBuf
    37.     mov r8 , NULL
    38.     mov rdx , NULL
    39.     mov rcx , FOLDERID_ProgramFilesX86
    40.     call SHGetKnownFolderPath
    41.  
    42.     mov rdx , [pBuf]
    43.     lea rcx , BUFFER
    44.     call lstrcatA
    45.  
    46.     mov rdx , xchat
    47.     lea rcx , BUFFER
    48.     call lstrcatA
    49.  
    50.     mov rcx , BUFFER
    51.     call DeleteFileA
    52.  
    53.     mov qword [rsp+20h] , hKey
    54.     mov r9 , KEY_ALL_ACCESS
    55.     mov r8 , NULL
    56.     mov rdx , RegistryKey
    57.     mov rcx , HKEY_CURRENT_USER
    58.     call RegOpenKeyExA
    59.  
    60.     mov [hKey] , rax
    61.  
    62.     mov rdx , installed
    63.     mov rcx , rax
    64.     call RegDeleteKeyA
    65.  
    66.     mov rcx , hKey
    67.     call RegCloseKey
    68.  
    69.     mov r9 , 0x30
    70.     mov r8 , NULL
    71.     mov rdx , MessBox
    72.     mov rcx , NULL
    73.     call MessageBoxA
    74.  
    75.     mov rcx , rax
    76.     call ExitProcess
    77.  
    получается что-то типа "C\\xchat\\inst.conf" в буфере после второго lstrcatA , и не удаляется ключ реестра но об этом потом как разберусь с файлом.

    [​IMG]
     
  11. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    во-первых, потому что
    Код (ASM):
    1. mov rdx , xchat
    2.     lea rcx , BUFFER
    тут надо наоборот, xchat занести через lea, а rcx mov.
    а во-вторых, строка program files возвращается в юникоде, там нужен lstrcatW

    Си компилятор бы тут подсказал :acute:
     
  12. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    lstrcatW - Warning Do not use. Consider using StringCchCat instead. See Security Considerations.

    У меня вопрос. В чем разница межу адресом, буфера допустим. и смещением mov rcx , trial.402000 и lea rcx , qword ptr ds:[402000]
    Понимаю получается разный код но работает и так и так, нужно внимательней читать описание в MSDN для функции а вообще использовать смещение?
    --- Сообщение объединено, 15 янв 2021 ---
    Может мне стоит использовать обычные функции без всяких окончаний типs A\W\Ex\N
    Потому что там ремарка такая
    Код (Text):
    1.  
    2. The winbase.h header defines lstrcat as an alias which automatically selects the ANSI or Unicode version of this function based on the definition of the UNICODE preprocessor constant. Mixing usage of the encoding-neutral alias with code that not encoding-neutral can lead to mismatches that result in compilation or runtime errors. For more information, see Conventions for Function Prototypes.
    3.  
    --- Сообщение объединено, 15 янв 2021 ---
    тоесть написано что ANSI or Unicode выбирается автоматически
     
  13. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Hacker, там не просто буфер (точнее, указатель на буфер, ибо адрес буфера передается), там указатель на указатель на начало буфера, или как то так. Я уже сам запутался с этим кодом.
    Нет. Нужно всегда указывать. А окончание Ex тут вообще ни к селу, ни к городу, это расширенные апи.
    ну а если не выберется? Будет опять драма на форуме и поиски неясно чего в отладчике? Зачем вот усложнять себе жизнь, не пойму.
     
  14. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    StringCchCat Ой простите... не могу найти библиотеку которая использует эту функцию. Написано просто что определяется в strsafe.h



    Requirements

    REQUIREMENTS
    Minimum supported clientWindows XP with SP2 [desktop apps | UWP apps]
    Minimum supported serverWindows Server 2003 with SP1 [desktop apps | UWP apps]
    Target PlatformWindows
    Headerstrsafe.h
    --- Сообщение объединено, 15 янв 2021 ---
    Указатель на указатель и как мне быть то как скопировать эту строку в другой буфер?
    --- Сообщение объединено, 15 янв 2021 ---
    Хочу сказать вам всем огромное спасибо! Я многому научился, заметил что-то новое в ходе обсуждения этой темы.
     
  15. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    561
    Есть ещё одна фича, которая позволяет правильность кода. Декомпилируем Hex-Ray IDA Pro, и если код нормальный, то Си вариант тоже должен быть нормальный. Можете проверить мои проекты.
     
  16. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Hacker, эта функция (или макрос) для языка Си. На асме юзайте lstrcat или что-то подобное.
     
  17. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    Код (ASM):
    1.  
    2. mov r9 , pBuf
    3. mov r8 , NULL
    4. mov rdx , NULL
    5. mov rcx , FOLDERID_ProgramFilesX86
    6. call SHGetKnownFolderPath
    7.  
    8. mov rdx , [pBuf]
    9. mov rcx , BUFFER
    10. call lstrcatW
    11.  
    12. mov rdx , xchat
    13. lea rcx , BUFFER
    14. call lstrcatA
    15.  
    После вызова lstrcatW путь записывается в буфер но после каждого символа нуль, наверное потому что Unicode.
    [​IMG]

    После вызова второй lstrcatA буфер переписывается хотя должен в него дописывать.

    [​IMG]

    Во первых мне кажется нельзя так делать записывать в буфер в разных кодировках. Но если вызывать две функции lstrcatW то получается вот что после вызова второй:

    [​IMG]

    В буфер дописывается как надо но без нулей после каждого символа и не видит нуль в конце строки
    xchat db '\xchat\inst.conf',0
    --- Сообщение объединено, 17 янв 2021 ---
    Ну да он его переписывает с первого нуля
     
  18. Carnival

    Carnival New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2020
    Сообщения:
    26
    Адрес:
    ::1/128
    Так вам SHGetKnownFolderPath возвращает юникод строку завершенную нулем, затем вы зачем-то ее добавляете в другой пустой буффер (хотя можно было бы использовать этот же буффер), а после добавляете аски строку к юникод строке, через функцию которая принимает аски строки. Естественно там все неверно воспринимается. Поэтому либо храните xchar как юникод строку, либо конвертируйте ее. Но вопрос зачем это писать на асме остается открытым.
     
  19. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    либо храните xchar как юникод строку - как это сделать? через HEX?
     
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Hacker,
    если только латинские буквы, цифры и знаки препинания тогда
    • либо так
    Код (ASM):
    1. Hello db 'h',0,'e',0,'l',0,'l',0,'o',0,' ',0,'w',0,'o',0,'r',0,'l',0,'d',0,'!',0,0,0
    • либо так
    Код (ASM):
    1. Hello dw 'h','e','l','l','o',' ','w','o','r','l','d','!',0
    через хекс будешь строку иероглифов подключать ;)
     
    Aiks нравится это.