NASM WIN64 HELLO WORLD

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

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    На то он и хакер, чему вы удивляетесь?
     
    Mikl___ нравится это.
  2. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    А на мой ответ никто внимания не обратил. Инфа про исключение:

    Код (Text):
    1. ExceptionAddress: 0000000000D86B81 shell32.0000000000D86B81
    2. NumberParameters: 2
    3. ExceptionInformation[00]: 0000000000000000 Read
    - адрес инструкции равен адресу выборки(IP = CR2). Тоесть она читает сама себя Ip: mov r,[Ip] и это приводит к ловушке, что может быть лишь при сегментации(86). На самом деле не так, это когда то разбирали, но я подзабыл нужно поискать. Как бы там небыло, семпл не простой:

     
  4. M0rg0t

    M0rg0t Well-Known Member

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

    Indy_ Well-Known Member

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

    Смысл в том, что нужно узнать в какой ситуации при исключении два параметра равны, это знакомая ситуация но я не могу вспомнить. Сейчас поищем.
     
  6. M0rg0t

    M0rg0t Well-Known Member

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

    Indy_ Well-Known Member

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

    Я по суркам свои поискал, вот нашло что нужно:

    - древний сурец по подмене выборки.

    Это значит если передача управления в NX область приведёт к двум одинаковым параметрам, тк попытка выполнить NX и соотвественно CR2 = IP.

    В данном случае значит что управление передаётся в неисполняемую память, по какой причине врядле можно сказать. Может быть в аргументах апи есть колбек, аргумент ошибочен и само собой будет такая ошибка. Странно что я это забыл.
     
  8. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    Функция просто старая и не работает так написано в MSDN.
    [SHGetSpecialFolderPath is not supported. Instead, use SHGetFolderPath.]

    а там написано:
    Note As of Windows Vista, this function is merely a wrapper for SHGetKnownFolderPath. The CSIDL value is translated to its associated KNOWNFOLDERID and then SHGetKnownFolderPath is called. New applications should use the known folder system rather than the older CSIDL system, which is supported only for backward compatibility.

    Нужно использовать что бы получить путь к какой либо папке функцию: SHGetKnownFolderPath
    я не понял какие там аргументы и прошу с этой функцией помощи
     
  9. Indy_

    Indy_ Well-Known Member

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

    В прототипе нет обратного вызова, тогда как управление передаётся на какой то не исполняемый буфер ?

    Бери старый добрый gmer и смотри.
    По мойму наиболее вероятно что это глюки отладочных плагинов, которые ты используешь. Проскань систему на патчи и сразу всё станет ясно.
     
  10. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    Ну если ыункция не поддерживается больше что в ней копаться? :)
    --- Сообщение объединено, 13 янв 2021 ---
    Хотя как такое вообще может быть?
     
  11. Indy_

    Indy_ Well-Known Member

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

    Никакая апи не является устаревшей, по причине обратной совместимости.

    Покажи лог сканера.
     
    M0rg0t нравится это.
  12. M0rg0t

    M0rg0t Well-Known Member

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

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    Прости не видел примера, попробую отпишусь
    --- Сообщение объединено, 13 янв 2021 ---
    Ну если не сложно напиши на асм что бы значение аргументов видеть
    --- Сообщение объединено, 14 янв 2021 ---
    Подскажи пожалуйста чему равна FOLDERID_ProgramFilesX86 ?
    --- Сообщение объединено, 14 янв 2021 ---
    Код (ASM):
    1.  
    2.     mov r9 , PROGRAM_FILESX86
    3.     mov r8 , 0
    4.     mov rdx , 0
    5.     mov rcx , 0x002a
    6.     call SHGetKnownFolderPath
    7.  
    Вот так не получается, то же исключение :dntknw:
    --- Сообщение объединено, 14 янв 2021 ---
    PROGRAM_FILESX86 у меня ссылка на буфер

    PROGRAM_FILESX86 db 260 dup (?)
     
  14. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Hacker,
    меня терзают смутные сомнения, в каких регистрах какие по нумерации аргументы вы передаете? Первый и четвертый параметр ― это должны быть адреса, а что за адрес такой 2Ah? Старайтесь константы передавать через идентификаторы и использовать EQU
    имя EQU число или выражение
    тогда становится понятным ЧТО же хотел сказать автор программы, да и комментарии мешать не будут ;)
     
  15. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    Вас понял, буду всё делать с equ.
    0x002a - это я вообще попробовал CSIDL от SHGetSpecialFolderPath() CSIDL_PROGRAM_FILESX86 (FOLDERID_ProgramFilesX86) сейчас вижу что они ровны, но почему тогда путь не записывается в буфер? Все делал как в примере у человека.
     
  16. M0rg0t

    M0rg0t Well-Known Member

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

    FOLDERID_ProgramFilesX86 это GUID, какое-то константное значение , ссылку на которое мы передаем. Смотри, на масме будет примерно так:
    1. берем прогу от ManHunter https://www.manhunter.ru/releases/1571_guid_helper_1_1.html , туда вводим это значение, получаем его в формате Асма. Заносим в секцию .data
    Код (ASM):
    1. FOLDERID_ProgramFilesX86 dd 07C5A40EFh
    2.                          dw 0A0FBh
    3.                          dw 04BFCh
    4.                          db 087h, 04Ah, 0C0h, 0F2h, 0E0h, 0B9h, 0FAh, 08Eh
    2. объявляем указатель для функции и для буфера, который она вернет.
    Код (ASM):
    1. .data?
    2. pfunc dd ?
    3. pbuf dd ?
    3. Динамически получаем функцию (инклуды и либы масма рассчитаны на ось всех времен и народов - виндоуз ХР , а эта функа доступна только с висты).
    Код (ASM):
    1. invoke LoadLibraryW,uni$("Shell32.dll")
    2. .if eax
    3. mov edx,eax
    4. invoke GetProcAddress,edx,chr$("SHGetKnownFolderPath")
    5.     .if eax
    6.         mov pfunc,eax
    7.     .endif
    8. .endif
    4. Собственно, вызов функции
    Код (ASM):
    1. push offset pbuf ;PWSTR *ppszPath
    2. push 0
    3. push 0
    4. push offset FOLDERID_ProgramFilesX86
    5. call pfunc
    6.  
    Если все верно, то в pbuf будет указатель на строку. На х64 переводи сам.
     
  17. Hacker

    Hacker Member

    Публикаций:
    0
    Регистрация:
    9 авг 2018
    Сообщения:
    170
    Адрес:
    Москва
    Вот программа сама:
    Код (ASM):
    1.  
    2. global start
    3.  
    4. NULL equ 0
    5. FOLDERID_ProgramFilesX86 equ 0x002a
    6. KEY_ALL_ACCESS equ 0x0000F003F
    7. HKEY_CURRENT_USER equ 0x80000001
    8.  
    9.  extern SHGetKnownFolderPath
    10.  extern lstrcatA
    11.  extern DeleteFileA
    12.  extern RegOpenKeyExA
    13.  extern RegDeleteKeyA
    14.  extern RegCloseKey
    15.  extern MessageBoxA
    16.  extern ExitProcess
    17.  
    18. section .data
    19. PROGRAM_FILESX86 db 260 dup (?)
    20. hKey resq 1
    21.  
    22. xchat db "\xchat\inst.conf",0
    23. RegistryKey db "\Software\XChat\",0
    24. installed db "installed",0
    25. MessBox db "XChat Trial Reset",0
    26.  
    27. section .code
    28. start:
    29.  
    30.     sub esp,48
    31.  
    32.     mov r9 , PROGRAM_FILESX86
    33.     mov r8 , NULL
    34.     mov rdx , NULL
    35.     mov rcx , FOLDERID_ProgramFilesX86
    36.     call SHGetKnownFolderPath
    37.  
    38.     mov rdx , xchat
    39.     mov rcx , PROGRAM_FILESX86
    40.     call lstrcatA
    41.  
    42.     mov rcx , PROGRAM_FILESX86
    43.     call DeleteFileA  
    44.  
    45.     mov qword [rsp+20h] , hKey
    46.     mov r9 , KEY_ALL_ACCESS
    47.     mov r8 , NULL
    48.     mov rdx , RegistryKey
    49.     mov rcx , HKEY_CURRENT_USER
    50.     call RegOpenKeyExA
    51.  
    52.     mov [hKey] , rax
    53.  
    54.     mov rdx , installed
    55.     mov rcx , [hKey]
    56.     call RegDeleteKeyA
    57.  
    58.     mov rcx , [hKey]
    59.     call RegCloseKey
    60.  
    61.     mov r9 , 0x30
    62.     mov r8 , NULL
    63.     mov rdx , MessBox
    64.     mov rcx , NULL
    65.     call MessageBoxA
    66.  
    67.     mov rcx , rax
    68.     call ExitProcess
    69.  
     
  18. M0rg0t

    M0rg0t Well-Known Member

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

    Hacker Member

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

    FOLDERID_ProgramFilesX86 dw 0x002a

    и передать её адрес? а не через equ я не совсем понял
    --- Сообщение объединено, 14 янв 2021 ---
    сейчас будем думать в pbuf будет указатель на строку, я думал её выведут мне в буфер, будем думать и переделывать всё
    --- Сообщение объединено, 14 янв 2021 ---
    Тоесть нужно что-то типа:
    Код (ASM):
    1.  
    2.  
    3. Buffer db 260 dup (?)
    4. PROGRAM_FILESX86 resq 1
    5. FOLDERID_ProgramFilesX86 dw 0x002a
    6.  
    7. mov r9 , PROGRAM_FILESX86
    8. mov r8 , NULL
    9. mov rdx , NULL
    10. mov rcx , FOLDERID_ProgramFilesX86
    11. call SHGetKnownFolderPath
    12.  
    13. mov rdx , PROGRAM_FILESX86
    14. mov rcx , Buffer
    15. call lstrcatA
    16.  
    17. mov rdx , xchat
    18. mov rcx , Buffer
    19. call lstrcatA
    20.  
    21.  
    --- Сообщение объединено, 14 янв 2021 ---
    Вообще как-то странно выглядит, ну ладно попробую, может быть функция такая :dntknw:
    --- Сообщение объединено, 14 янв 2021 ---
    не получается :dntknw:
     
  20. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Наверное потому, что функции требуется адрес
    Код (C++):
    1. PWSTR path;
    2. SHGetKnownFolderPath(&FOLDERID_ProgramFilesX86, 0, NULL, &path);
    и откуда взялась 2Ah?
    Код (ASM):
    1. FOLDERID_ProgramFilesX86 dd 7C5A40EFh
    2.                          dw 0A0FBh
    3.                          dw 4BFCh
    4.                          db 87h, 4Ah, 0C0h, 0F2h, 0E0h, 0B9h, 0FAh, 8Eh