Gemini.

Тема в разделе "WASM.RESEARCH", создана пользователем Ahimov, 23 ноя 2025.

  1. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    418
    GRAFik

    Не удивительно, андроид же, там все кривое, пакеры значит не исключение)

    ориг архив

    Выбрал по системке что посложнее, тривиальную рутину оно без проблем разбирает.
     
  2. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    361
    Ну,ну. :)
    Вот вам тривиальный вопрос для школьника 2-го класса церковно-приходской школы:

    Напиши код на MASM64 прстого окна с двумя кнопками, при нажатии на которые вызываются сообщения MesaggeBox. Укажи команды для компиляции в Visual Studio 2022 (bat-файл).

    Уверяю вас, пол дня потратите, а то и день, на написание подробных и понятных промтов - ТОЛЬКО РАБОЧЕГО ВАРИАНТА ВЫ НЕ ПОЛУЧИТЕ!
     
  3. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    418
    GRAFik

    Он не знает всех подробностей для написания, нужно помогать. Вот пример сборки кода выше. По дефолту он не умеет компилировать(не может просчитать размеры смещений ветвлений, BDO), потому нужно подсказать как это делать:

    - ход сборки. Без помощи он ничего не собирает.
     
  4. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    361
    А, ну теперь я всё понял. Нужно все делать самому, но делать вид, что за тебя это делает Иван Иваныч (ИИ).
    Я прав или не совсем? :)
     
  5. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    418
    GRAFik

    Собрал на масм:
    В чем именно проблема, вероятно в хидерах ?
     
    Последнее редактирование: 1 дек 2025
  6. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    321
    Чето не может он нифига.
    Код (Text):
    1. Создание полноценной операционной системы с браузером и интернетом — это сложнейшая задача, которая требует многолетней работы команды разработчиков. Однако я могу показать вам концептуальный пример минимальной загрузочной системы на MASM с простым калькулятором.
    2.  
    3. Вот пример загрузочной системы с калькулятором (работает в реальном режиме x86):
    4.  
    5. ```assembly
    6. ; boot.asm - Минимальная загрузочная ОС с калькулятором
    7. ; Сборка: ml /c /coff boot.asm
    8. ; Линковка: link /SUBSYSTEM:NATIVE /ALIGN:16 /DRIVER boot.obj
    9.  
    10. .586p
    11. .MODEL TINY
    12. .CODE
    13. ORG 7C00h
    14.  
    15. start:
    16.     cli
    17.     xor ax, ax
    18.     mov ds, ax
    19.     mov es, ax
    20.     mov ss, ax
    21.     mov sp, 7C00h
    22.     sti
    23.  
    24.     ; Очистка экрана
    25.     mov ax, 0003h
    26.     int 10h
    27.  
    28.     ; Вывод приветствия
    29.     mov si, offset msg_welcome
    30.     call print_string
    31.  
    32. main_loop:
    33.     ; Вывод промпта
    34.     mov si, offset prompt
    35.     call print_string
    36.  
    37.     ; Чтение ввода
    38.     mov di, offset buffer
    39.     call read_string
    40.  
    41.     ; Обработка команды
    42.     call process_command
    43.     jmp main_loop
    44.  
    45. ; Процедура обработки команд
    46. process_command proc
    47.     mov si, offset buffer
    48.     cmp byte ptr [si], 0
    49.     je empty_cmd
    50.  
    51.     ; Проверка на команду выхода
    52.     mov cx, 4
    53.     mov di, offset cmd_exit
    54.     repe cmpsb
    55.     je exit_cmd
    56.  
    57.     ; Проверка на команду calc
    58.     mov si, offset buffer
    59.     mov cx, 4
    60.     mov di, offset cmd_calc
    61.     repe cmpsb
    62.     je calc_cmd
    63.  
    64.     ; Неизвестная команда
    65.     mov si, offset msg_unknown
    66.     call print_string
    67.     ret
    68.  
    69. empty_cmd:
    70.     ret
    71.  
    72. exit_cmd:
    73.     mov si, offset msg_reboot
    74.     call print_string
    75.     xor ax, ax
    76.     int 16h
    77.     int 19h
    78.  
    79. calc_cmd:
    80.     call calculator
    81.     ret
    82. process_command endp
    83.  
    84. ; Простой калькулятор
    85. calculator proc
    86.     mov si, offset msg_calc
    87.     call print_string
    88.  
    89.     ; Чтение первого числа
    90.     mov di, offset num1_str
    91.     call read_string
    92.     call string_to_int
    93.     mov [num1], ax
    94.  
    95.     ; Чтение оператора
    96.     mov si, offset msg_operator
    97.     call print_string
    98.     mov ah, 00h
    99.     int 16h
    100.     mov [operator], al
    101.     mov ah, 0Eh
    102.     int 10h
    103.  
    104.     ; Чтение второго числа
    105.     mov si, offset msg_newline
    106.     call print_string
    107.     mov di, offset num2_str
    108.     call read_string
    109.     call string_to_int
    110.     mov [num2], ax
    111.  
    112.     ; Выполнение операции
    113.     mov ax, [num1]
    114.     mov bx, [num2]
    115.     mov cl, [operator]
    116.  
    117.     cmp cl, '+'
    118.     je calc_add
    119.     cmp cl, '-'
    120.     je calc_sub
    121.     cmp cl, '*'
    122.     je calc_mul
    123.     cmp cl, '/'
    124.     je calc_div
    125.  
    126.     mov si, offset msg_invalid_op
    127.     call print_string
    128.     ret
    129.  
    130. calc_add:
    131.     add ax, bx
    132.     jmp show_result
    133.  
    134. calc_sub:
    135.     sub ax, bx
    136.     jmp show_result
    137.  
    138. calc_mul:
    139.     imul bx
    140.     jmp show_result
    141.  
    142. calc_div:
    143.     xor dx, dx
    144.     div bx
    145.     jmp show_result
    146.  
    147. show_result:
    148.     mov [result], ax
    149.     mov si, offset msg_result
    150.     call print_string
    151.  
    152.     ; Преобразование результата в строку
    153.     mov ax, [result]
    154.     mov di, offset result_str
    155.     call int_to_string
    156.     mov si, di
    157.     call print_string
    158.  
    159.     mov si, offset msg_newline
    160.     call print_string
    161.     ret
    162. calculator endp
    163.  
    164. ; Вспомогательные процедуры
    165. print_string proc
    166.     lodsb
    167.     test al, al
    168.     jz print_done
    169.     mov ah, 0Eh
    170.     int 10h
    171.     jmp print_string
    172. print_done:
    173.     ret
    174. print_string endp
    175.  
    176. read_string proc
    177.     xor cx, cx
    178. read_char:
    179.     mov ah, 00h
    180.     int 16h
    181.  
    182.     cmp al, 0Dh
    183.     je enter_pressed
    184.  
    185.     cmp al, 08h
    186.     je backspace
    187.  
    188.     mov [di], al
    189.     inc di
    190.     inc cx
    191.  
    192.     mov ah, 0Eh
    193.     int 10h
    194.  
    195.     jmp read_char
    196.  
    197. backspace:
    198.     cmp cx, 0
    199.     je read_char
    200.     dec di
    201.     dec cx
    202.  
    203.     mov al, 08h
    204.     mov ah, 0Eh
    205.     int 10h
    206.  
    207.     mov al, ' '
    208.     int 10h
    209.  
    210.     mov al, 08h
    211.     int 10h
    212.  
    213.     jmp read_char
    214.  
    215. enter_pressed:
    216.     mov byte ptr [di], 0
    217.     mov al, 0Dh
    218.     mov ah, 0Eh
    219.     int 10h
    220.     mov al, 0Ah
    221.     int 10h
    222.     ret
    223. read_string endp
    224.  
    225. string_to_int proc
    226.     xor ax, ax
    227.     xor bx, bx
    228. convert_loop:
    229.     mov bl, [si]
    230.     cmp bl, 0
    231.     je convert_done
    232.     sub bl, '0'
    233.     imul ax, 10
    234.     add ax, bx
    235.     inc si
    236.     jmp convert_loop
    237. convert_done:
    238.     ret
    239. string_to_int endp
    240.  
    241. int_to_string proc
    242.     pusha
    243.     mov cx, 10
    244.     xor bx, bx
    245. div_loop:
    246.     xor dx, dx
    247.     div cx
    248.     add dl, '0'
    249.     push dx
    250.     inc bx
    251.     test ax, ax
    252.     jnz div_loop
    253.  
    254.     mov cx, bx
    255. pop_loop:
    256.     pop ax
    257.     stosb
    258.     loop pop_loop
    259.     mov byte ptr [di], 0
    260.     popa
    261.     ret
    262. int_to_string endp
    263.  
    264. ; Данные
    265. msg_welcome db 'MiniOS v0.1', 0Dh, 0Ah
    266.             db 'Commands: calc, exit', 0Dh, 0Ah, 0
    267. prompt      db '> ', 0
    268. msg_unknown db 'Unknown command', 0Dh, 0Ah, 0
    269. msg_reboot  db 'Press any key to reboot...', 0Dh, 0Ah, 0
    270. msg_calc    db 'Calculator:', 0Dh, 0Ah, 'Enter first number: ', 0
    271. msg_operator db 0Dh, 0Ah, 'Enter operator (+, -, *, /): ', 0
    272. msg_newline db 0Dh, 0Ah, 0
    273. msg_result  db 0Dh, 0Ah, 'Result: ', 0
    274. msg_invalid_op db 'Invalid operator', 0Dh, 0Ah, 0
    275.  
    276. cmd_exit    db 'exit', 0
    277. cmd_calc    db 'calc', 0
    278.  
    279. buffer      db 64 dup(0)
    280. num1_str    db 16 dup(0)
    281. num2_str    db 16 dup(0)
    282. result_str  db 16 dup(0)
    283.  
    284. num1        dw 0
    285. num2        dw 0
    286. result      dw 0
    287. operator    db 0
    288.  
    289. ; Загрузочная сигнатура
    290. ORG 7DFEh
    291. dw 0AA55h
    292.  
    293. END start
    294. ```
    295.  
    296. Что делает этот код:
    297.  
    298. 1. Минимальная загрузочная ОС — запускается с флешки/диска
    299. 2. Простой калькулятор — поддерживает +, -, *, /
    300. 3. Интерфейс командной строки — базовый ввод/вывод
    301.  
    302. Для создания браузера и интернета потребуется:
    303.  
    304. 1. Защищённый режим — переход в 32/64-битный режим
    305. 2. Управление памятью — менеджер памяти, виртуальная память
    306. 3. Файловую систему — хотя бы FAT32
    307. 4. Сетевой стек — драйвер сетевой карты, TCP/IP стек
    308. 5. Графический интерфейс — VGA/SVGA драйвер
    309. 6. Парсинг HTML — минимум 50 000 строк кода
    310.  
    311. Практические шаги для развития:
    312.  
    313. 1. Изучите:
    314.    · "Operating Systems: Three Easy Pieces"
    315.    · "Intel® 64 and IA-32 Architectures Software Developer Manuals"
    316. 2. Начните с:
    317.    · Перехода в защищённый режим
    318.    · Реализации FAT32 драйвера
    319.    · Создания простого графического интерфейса
    320. 3. Используйте готовые компоненты:
    321.    · MenuetOS (написана на ассемблере)
    322.    · SerenityOS (C++, но открытая архитектура)
    323.  
    324. Хотите, покажу как:
    325.  
    326. 1. Добавить в эту систему простой текстовый редактор?
    327. 2. Реализовать базовую файловую систему?
    328. 3. Перейти в защищённый режим для доступа к 4 ГБ памяти?
     
    Ahimov нравится это.
  7. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    361
    Если это "камешек в мой огород" и намек на то, что я не умею составить какой-нибудь более-менее вменяемый промт для ИИ - ошибаетесь. :)
    --- Сообщение объединено, 1 дек 2025 ---
    Вы хотите сказать, что составили правильный и грамотный промт(запрос) для ИИ и он вам выдал код, который компилируется и работает? НЕ ВЕРЮ!!! :) ПРУФЫ В СТУДИЮ !!!

    Скинте копию вашего промта (запроса/вопроса) для ИИ. И копию рабочего кода, который вам выдал ИИ. Если мне потом, после вашего промта(запроса) - ИИ выдаст что-то похожее, тогда я может и поверю вам. А сейчас извините - нет доказательств. :)

    И потом - разговор ведь был про MASM64. Но можно и с MASM32 начать. А там видно будет.
    --- Сообщение объединено, 1 дек 2025 ---
    P.S. И пожалуйста без этих ваших штучек, то архив не открывается, то разместили вы его где-то на закрытом сайте Пентагона, к которому ни у кого нет доступа. :)
     
  8. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    418
    Код (Text):
    1. ; -----------------------------------------------------------------------------------------------------------------------
    2. ; Инклюды и библиотеки
    3. ; Этот код требует установки MASM32 SDK (или аналогичного) для инклуд-файлов и библиотек.
    4. ; -----------------------------------------------------------------------------------------------------------------------
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. include \masm32\include\user32.inc
    8. includelib \masm32\lib\kernel32.lib
    9. includelib \masm32\lib\user32.lib
    10.  
    11. ; -----------------------------------------------------------------------------------------------------------------------
    12. ; Константы и Идентификаторы
    13. ; -----------------------------------------------------------------------------------------------------------------------
    14. .const
    15. ID_BUTTON_1 equ 1000 ; Идентификатор для первой кнопки
    16. ID_BUTTON_2 equ 1001 ; Идентификатор для второй кнопки
    17. WIN_TITLE   db "MASM64 Пример с Кнопками", 0
    18. CLASS_NAME  db "MASM64WindowClass", 0
    19. BUTTON_TEXT_1 db "Нажми меня (1)", 0
    20. BUTTON_TEXT_2 db "Нажми меня (2)", 0
    21. MSG_CAPTION_1 db "Сообщение Кнопки 1", 0
    22. MSG_CAPTION_2 db "Сообщение Кнопки 2", 0
    23. MSG_TEXT_1  db "Вы нажали кнопку 1!", 0
    24. MSG_TEXT_2  db "Вы нажали кнопку 2!", 0
    25.  
    26. ; -----------------------------------------------------------------------------------------------------------------------
    27. ; Глобальные переменные
    28. ; -----------------------------------------------------------------------------------------------------------------------
    29. .data
    30. hInstance    dq ? ; Дескриптор экземпляра
    31. hWnd         dq ? ; Дескриптор главного окна
    32. wcex         WNDCLASSEX <> ; Структура класса окна
    33. msg          MSG <>       ; Структура сообщения
    34.  
    35. ; -----------------------------------------------------------------------------------------------------------------------
    36. ; Прототипы функций
    37. ; -----------------------------------------------------------------------------------------------------------------------
    38. WinMain proto :QWORD, :QWORD, :QWORD, :QWORD
    39. WindowProc proto :QWORD, :QWORD, :QWORD, :QWORD
    40.  
    41. ; -----------------------------------------------------------------------------------------------------------------------
    42. .code
    43.  
    44. ; -----------------------------------------------------------------------------------------------------------------------
    45. ; Точка входа в программу (аналог WinMain)
    46. ; -----------------------------------------------------------------------------------------------------------------------
    47. start:
    48.     ; Вызов WinMain (в MASM64 он вызывается напрямую)
    49.     invoke WinMain, 0, 0, 0, SW_SHOWNORMAL
    50.     invoke ExitProcess, rax ; Выход из программы
    51.  
    52. ; -----------------------------------------------------------------------------------------------------------------------
    53. ; Функция WinMain
    54. ; -----------------------------------------------------------------------------------------------------------------------
    55. WinMain proc hInst:QWORD, hPrevInst:QWORD, CmdLine:QWORD, CmdShow:QWORD
    56.  
    57.     ; 1. Получение дескриптора экземпляра (hInst)
    58.     invoke GetModuleHandle, NULL
    59.     mov [hInstance], rax
    60.  
    61.     ; 2. Регистрация класса окна
    62.     ; Заполнение структуры WNDCLASSEX
    63.     mov [wcex.cbSize], SizeOf WNDCLASSEX
    64.     mov [wcex.style], CS_HREDRAW | CS_VREDRAW
    65.     mov [wcex.lpfnWndProc], OFFSET WindowProc ; Указатель на обработчик
    66.     mov [wcex.cbClsExtra], 0
    67.  
    68. mov [wcex.cbWndExtra], 0
    69.     mov rax, [hInstance]
    70.     mov [wcex.hInstance], rax
    71.     invoke LoadIcon, NULL, IDI_APPLICATION
    72.     mov [wcex.hIcon], rax
    73.     mov [wcex.hIconSm], rax
    74.     invoke LoadCursor, NULL, IDC_ARROW
    75.     mov [wcex.hCursor], rax
    76.     mov [wcex.hbrBackground], COLOR_WINDOW + 1
    77.     mov [wcex.lpszMenuName], NULL
    78.     mov [wcex.lpszClassName], OFFSET CLASS_NAME
    79.    
    80.     ; Регистрация
    81.     invoke RegisterClassEx, ADDR wcex
    82.     cmp rax, 0
    83. jz Exit_Error ; Если регистрация не удалась
    84.  
    85.     ; 3. Создание главного окна
    86.     invoke CreateWindowEx, \
    87.            0, \
    88.            ADDR CLASS_NAME, \
    89.            ADDR WIN_TITLE, \
    90.            WS_OVERLAPPEDWINDOW, \
    91.            100, \
    92.            100, \
    93.            400, \
    94.            200, \
    95.            NULL, \
    96.            NULL, \
    97.            [hInstance], \
    98. NULL
    99.     mov [hWnd], rax
    100.     cmp rax, 0
    101.     jz Exit_Error ; Если создание не удалось
    102.  
    103.     ; 4. Создание кнопок
    104.     ; Кнопка 1
    105.     invoke CreateWindowEx, \
    106.            0, \
    107.            ADDR "Button", \
    108.            ADDR BUTTON_TEXT_1, \
    109.            WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, \
    110.            50, \
    111.            50, \
    112.            120, \
    113. 30, \
    114.            [hWnd], \
    115.            ID_BUTTON_1, \
    116.            [hInstance], \
    117.            NULL
    118.          
    119.     ; Кнопка 2
    120.     invoke CreateWindowEx, \
    121.            0, \
    122.            ADDR "Button", \
    123.            ADDR BUTTON_TEXT_2, \
    124.            WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, \
    125.            220, \
    126.            50, \
    127.            120, \
    128.            30, \
    129. [hWnd], \
    130.            ID_BUTTON_2, \
    131.            [hInstance], \
    132.            NULL
    133.    
    134.     ; 5. Отображение окна
    135.     invoke ShowWindow, [hWnd], CmdShow
    136.     invoke UpdateWindow, [hWnd]
    137.  
    138.     ; 6. Оконный цикл сообщений (Message Loop)
    139.     Message_Loop:
    140.         invoke GetMessage, ADDR msg, NULL, 0, 0
    141.         cmp rax, 0
    142.         je Quit_App
    143.         invoke TranslateMessage, ADDR msg
    144. invoke DispatchMessage, ADDR msg
    145.         jmp Message_Loop
    146.  
    147.     Quit_App:
    148.         ; Возвращение значения WM_QUIT
    149.         mov rax, [msg.wParam]
    150.         ret
    151.  
    152.     Exit_Error:
    153.         xor rax, rax ; Возврат 0 в случае ошибки
    154.         ret
    155.        
    156. WinMain endp
    157.  
    158. ; -----------------------------------------------------------------------------------------------------------------------
    159. ; Процедура окна (Обработчик сообщений)
    160. ; -----------------------------------------------------------------------------------------------------------------------
    161. WindowProc proc hWnd_p:QWORD, uMsg:QWORD, wParam:QWORD, lParam:QWORD
    162.  
    163.     ; Обработка сообщений
    164.     cmp uMsg, WM_COMMAND
    165.     je Handle_Command
    166.  
    167.     cmp uMsg, WM_DESTROY
    168.     je Handle_Destroy
    169.  
    170.     ; Сообщения по умолчанию
    171.     invoke DefWindowProc, hWnd_p, uMsg, wParam, lParam
    172. ret
    173.  
    174.     ; --- Обработка WM_COMMAND ---
    175.     Handle_Command:
    176.         mov rax, wParam
    177.         and rax, 0FFFFh ; Получаем идентификатор элемента управления (LOWORD(wParam))
    178.        
    179.         cmp rax, ID_BUTTON_1
    180.         je Button1_Click
    181.        
    182.         cmp rax, ID_BUTTON_2
    183.         je Button2_Click
    184. jmp Command_Default
    185.  
    186.     Button1_Click:
    187.         ; Вызов MessageBox для Кнопки 1
    188.         invoke MessageBox, hWnd_p, ADDR MSG_TEXT_1, ADDR MSG_CAPTION_1, MB_OK | MB_ICONINFORMATION
    189.         jmp Command_Default
    190.  
    191.     Button2_Click:
    192.         ; Вызов MessageBox для Кнопки 2
    193.         invoke MessageBox, hWnd_p, ADDR MSG_TEXT_2, ADDR MSG_CAPTION_2, MB_OK | MB_ICONWARNING
    194.         jmp Command_Default
    195.        
    196.     Command_Default:
    197.         xor rax, rax ; Возврат 0
    198.         ret
    199. ; --- Обработка WM_DESTROY ---
    200.     Handle_Destroy:
    201.         invoke PostQuitMessage, 0
    202.         xor rax, rax ; Возврат 0
    203.         ret
    204.  
    205. WindowProc endp
    206.  
    207. end start
    208.  
    --- Сообщение объединено, 1 дек 2025 ---
    - сборка шелла. Если повозиться в принципе можно и пе собрать..
     

    Вложения:

    • Sep.zip
      Размер файла:
      22 КБ
      Просмотров:
      83
  9. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    361
    @Ahimov, а в bat-файле в ключе /entry: что прописывать /entry: start или /entry:WinMain ?

    По-моему, нужно писать /entry:start

    Ну, думаю, спрошу на всякий случай. :)
     
  10. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    418
    Код (Text):
    1. ; proc FindProcAddress (BaseAddress: QWORD, FunctionName: QWORD)
    2. ; Вход: RBP = Базовый адрес модуля (BaseAddress)
    3. ;       RDI = Указатель на имя функции (FunctionName)
    4. ; Выход: RAX = Адрес функции (или 0 в случае ошибки)
    5.  
    6. FindProcAddress PROC
    7.     ; Сохраняем нелетучие регистры, используемые в процедуре
    8.     push rbx
    9.     push rsi
    10.     push rdi
    11. ; ------------------------------------------------------------------
    12.     ; 1. Находим IMAGE_EXPORT_DIRECTORY (Директорию Экспорта)
    13.     ; ------------------------------------------------------------------
    14.    
    15.     ; RAX = RBP (Базовый адрес модуля)
    16.     mov rax, rbp
    17.    
    18.     ; RAX = Базовый адрес + RVA NT Headers
    19.     ; NT Header находится по смещению [BaseAddress + [BaseAddress + 3Ch] ]
    20.     movsx ebx, word ptr [rax + 3Ch] ; EBX = RVA E_LFANEW (Указатель на NT Headers)
    21.     add rax, rbx                    ; RAX = Адрес NT Headers
    22.    
    23.     ; RAX = Адрес NT Headers + 8 (Пропуск Signature и FileHeader)
    24.     ; RAX = Указатель на IMAGE_OPTIONAL_HEADER
    25.     add rax, 18h
    26. ; RAX = Адрес начала Data Directories (постоянное смещение)
    27.     add rax, 70h                    ; RAX = Адрес Data Directory [0] (Export Table)
    28.    
    29.     ; RBX = RVA Export Directory
    30.     mov ebx, dword ptr [rax]        ; EBX = RVA Export Table (Export Directory)
    31.    
    32.     ; Если EBX = 0, нет экспорта - ошибка
    33.     test ebx, ebx
    34.     jz  .ExitError
    35.    
    36.     ; RAX = Адрес Export Directory
    37.     mov rax, rbp
    38.     add rax, rbx                    ; RAX = BaseAddress + RVA_ExportTable
    39.     mov rsi, rax                    ; RSI = Указатель на IMAGE_EXPORT_DIRECTORY
    40. ; ------------------------------------------------------------------
    41.     ; 2. Определяем смещения к массивам
    42.     ; ------------------------------------------------------------------
    43.    
    44.     ; RBX = AddressOfNames (RVA)
    45.     mov ebx, dword ptr [rsi + 20h]
    46.     mov rbx, rbp
    47.     add rbx, [rsi + 20h]            ; RBX = Указатель на массив RVA имен (AddressOfNames)
    48.    
    49.     ; R8 = AddressOfNameOrdinals (RVA)
    50.     mov r8, rbp
    51.     add r8, [rsi + 24h]             ; R8 = Указатель на массив Ordinals
    52. ; R9 = AddressOfFunctions (RVA)
    53.     mov r9, rbp
    54.     add r9, [rsi + 1Ch]             ; R9 = Указатель на массив RVA функций
    55.  
    56.     ; RCX = NumberOfNames
    57.     mov ecx, dword ptr [rsi + 18h]  ; RCX = Количество экспортируемых имен
    58.  
    59.     ; ------------------------------------------------------------------
    60.     ; 3. Цикл поиска по имени
    61.     ; ------------------------------------------------------------------
    62. .NameLoop:
    63. ; Проверка конца списка
    64.     test rcx, rcx
    65.     jz  .ExitError
    66.     dec rcx                         ; Уменьшаем счетчик
    67.  
    68.     ; RAX = Указатель на текущее имя функции
    69.     mov eax, dword ptr [rbx]        ; RAX = RVA текущего имени
    70.     add rax, rbp                    ; RAX = Указатель на строку имени
    71. ; Сравнение строк (RDI = искомое имя, RAX = текущее имя)
    72.     ; Note: Реальная функция сравнения (strcmp) здесь не показана,
    73.     ;       т.к. она требует сложного кода. Мы предполагаем, что
    74.     ;       она возвращает ZF=1 при совпадении.
    75.    
    76.     ; mov rsi, rax ; Имя модуля
    77.     ; call StrCmp   ; Вызов подпрограммы сравнения строк
    78.    
    79.     ; **Заглушка сравнения строк:** Предположим, что имя совпало
    80.     ; jne .NextName                  ; Если не совпало, идем к следующему
    81.  
    82.     ; ------------------------------------------------------------------
    83.     ; 4. Имя совпало: Получаем адрес функции
    84.     ; ------------------------------------------------------------------
    85.  
    86. ; RAX = RBP (Базовый адрес модуля)
    87.     ; RSI = Указатель на IMAGE_EXPORT_DIRECTORY
    88.     ; RCX = NumberOfNames (индекс совпавшей функции)
    89.     ; R8 = AddressOfNameOrdinals
    90.     ; R9 = AddressOfFunctions
    91.  
    92.     ; 4.1 Получаем RVA функции
    93.     movzx edx, word ptr [r8 + rcx * 2]  ; EDX = Ординал
    94.     mov eax, dword ptr [r9 + rdx * 4]   ; EAX = RVA функции
    95.    
    96.     ; Сохраняем RVA функции, т.к. будем его модифицировать
    97.     mov r10d, eax
    98. ; 4.2 Определяем границы Директории Экспорта
    99.     ; [rsi + 00h] содержит RVA Директории Экспорта (то же, что и RVA Export Table)
    100.     mov ebx, dword ptr [rsi]            ; EBX = Export RVA
    101.    
    102.     ; [rsi + 04h] содержит Размер Директории Экспорта (Size)
    103.     mov ecx, dword ptr [rsi + 04h]      ; ECX = Export Size
    104.     add ecx, ebx                        ; ECX = Export RVA + Export Size (Верхняя граница)
    105.  
    106.     ; 4.3 Проверка на Форвардер
    107.     cmp r10d, ebx                       ; Сравнить RVA функции с нижней границей
    108.     jl .FunctionAddressFound            ; Если RVA меньше, это не форвардер
    109.     cmp r10d, ecx                       ; Сравнить RVA функции с верхней границей
    110.     jge .FunctionAddressFound           ; Если RVA больше или равно, это не форвардер
    111. ; ------------------------------------------------------------------
    112.     ; ЭТО ФОРВАРДЕР! R10D содержит RVA строки-форвардера.
    113.     ; ------------------------------------------------------------------
    114.    
    115.     ; RAX = Указатель на строку-форвардер
    116.     add rax, rbp                        ; RBP + RVA функции (R10D) = Адрес строки
    117.    
    118.     ; Теперь RAX указывает на строку "DLL_NAME.Function_Name"
    119.    
    120.     ; ******************************************************************
    121.     ; РЕКУРСИВНЫЙ ВЫЗОВ (Здесь должна быть рекурсия)
    122.     ; ******************************************************************
    123. ; Этот код должен:
    124.     ; 1. Распарсить строку RAX на "DLL_NAME" и "Function_Name"
    125.     ; 2. Вызвать LoadLibraryA (которая уже должна быть найдена) для "DLL_NAME".
    126.     ; 3. Вызвать GetProcAddress (которая уже должна быть найдена) для "Function_Name".
    127.    
    128.     ; Поскольку рекурсия на ассемблере сложна, мы вернем 0 и
    129.     ; пометим этот случай как критическую ошибку в нашем простом загрузчике.
    130.    
    131.     jmp .ExitError ; В простом Shellcode, мы обрабатываем только не-форвардеры.
    132.  
    133.  
    134. .FunctionAddressFound:
    135. ; 4.4 RVA функции находится в R10D (не форвардер)
    136.     mov eax, r10d                       ; EAX = RVA функции
    137.     add rax, rbp                        ; RAX = BaseAddress + RVA функции = Финальный адрес
    138.    
    139.     jmp .ExitSuccess
    140.    
    141. ; ... (Код для .ExitSuccess и .ExitError) ...
    142.  
    143. При обнаружении форвардера, загрузчик должен рекурсивно или итеративно вызвать LoadLibraryA для указанной DLL и затем повторно вызвать GetProcAddress для указанной в форвардере функции/ординала.
    144.  
    145. Фрагмент кода
    146.  
    147. ; ------------------------------------------------------------------
    148. ; Подпрограмма StrCmp (сравнение строк, как часть Загрузчика)
    149. ; ------------------------------------------------------------------
    150.  
    151. StrCmp PROC
    152.     ; RDI и RSI уже установлены вызывающей процедурой (FindProcAddress)
    153.    
    154.     ; Мы будем использовать инструкции для сравнения строк
    155.     ; CLD (Clear Direction Flag) - устанавливает направление сканирования вперед (RSI/RDI++)
    156.     cld
    > entry: что прописывать /entry: start или /entry:WinMain ?

    Тоесть абсолютно отсутствует понимание, тогда врядле что поможет :preved:
     
  11. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    361
    Ahimov,


    вот хоть бы раз нормально и по-человечески ответили. То у вас техзадание составлено неверно, то ещё какая-нибудь фигня. Лишь бы до чего-нибудь докопаться и уйти от ответа. :) Не удивлюсь, если этот ваш код - не будет компилироваться или запускаться, из-за каких-нибудь мелких косяков.
     
    Последнее редактирование: 1 дек 2025
  12. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    418
    Может ветвления оптимизировать, тогда почему сразу отказывается собирать ?

     
  13. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    418
     
  14. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    96
    Не факт.
     
  15. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    418
     
  16. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    418
    Посмотрела кривой сервис NtGdiGetDIBitsInternal, результат:

    --- Сообщение объединено, 7 дек 2025 ---
    Создание эксплойтов заблокировано :sarcastic:
     
    Research нравится это.
  17. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    418
    Тема по cpu-rsb:

     
  18. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    418
    :umnik2:
     
  19. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    418
    Первый наугад ядерный сервис, посмотреть на анализ:

    Код (C):
    1. Этот тест проверяет, зануляет ли ядро буфер перед записью или оставляет «мусор» в полях выравнивания структуры USEROBJECTFLAGS.
    2.  
    3. #include <windows.h>
    4. #include <stdio.h>
    5. #include <vector>
    6.  
    7. // Структура, как она видится в User-Mode
    8. typedef struct tagUSEROBJECTFLAGS {
    9.     BOOL fInherit;
    10.     BOOL fReserved;
    11.     DWORD dwFlags;
    12. } USEROBJECTFLAGS, *PUSEROBJECTFLAGS;
    13.  
    14. void TestInfoleak() {
    15.     HWINSTA hWinSta = GetProcessWindowStation();
    16.     USEROBJECTFLAGS uof;
    17.  
    18. // Заполняем локальную структуру "маркером" перед вызовом
    19.     memset(&uof, 0xEE, sizeof(uof));
    20.  
    21.     printf("[*] Testing for Information Disclosure...\n");
    22.  
    23.     if (GetUserObjectInformationW(hWinSta, UOI_FLAGS, &uof, sizeof(uof), NULL)) {
    24.         BYTE* ptr = (BYTE*)&uof;
    25.         bool leaked = false;
    26.  
    27.         printf("[+] Buffer after kernel call:\n");
    28.         for (int i = 0; i < sizeof(uof); i++) {
    29.             printf("%02X ", ptr[i]);
    30.             // Если мы видим что-то, что не является 0xEE (наш маркер)
    31.             // и не является результатом работы (0 или 1), это может быть утечкой.
    32.         }
    33.  
    34. printf("\n");
    35.  
    36.         // Анализ fReserved (ядро пишет туда 0, но проверим соседние байты)
    37.         if (uof.fReserved != 0) {
    38.             printf("[!] Unexpected value in fReserved: 0x%X\n", uof.fReserved);
    39.         }
    40.     }
    41. }
    Код (Text):
    1. Этот PoC имитирует атаку, при которой один поток постоянно меняет права доступа к памяти, в которую ядро пытается записать данные. Цель — проверить, вызовет ли это Double Fault или BSOD.
    2.  
    3. #include <windows.h>
    4. #include <process.h>
    5. #include <stdio.h>
    6.  
    7. // Глобальные данные для потоков
    8. void* g_sharedMem = NULL;
    9. bool g_running = true;
    10.  
    11. // Поток Б: Постоянно меняет состояние страницы (Доступна <-> Недоступна)
    12. unsigned __stdcall MemoryFlippingThread(void* arg) {
    13.     while (g_running) {
    14.         DWORD oldProtect;
    15.         // Делаем страницу недоступной
    16.         VirtualProtect(g_sharedMem, 4096, PAGE_NOACCESS, &oldProtect);
    17. // Небольшая пауза для переключения контекста
    18.         for (volatile int i = 0; i < 100; i++);
    19.         // Возвращаем доступ
    20.         VirtualProtect(g_sharedMem, 4096, PAGE_READWRITE, &oldProtect);
    21.     }
    22.     return 0;
    23. }
    24.  
    25. void TestRaceCondition() {
    26.     g_sharedMem = VirtualAlloc(NULL, 4096, MEM_COMMIT, PAGE_READWRITE);
    27.     HWINSTA hWinSta = GetProcessWindowStation();
    28.     HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, MemoryFlippingThread, NULL, 0, NULL);
    29.  
    30.     printf("[*] Starting Race Condition test (press Ctrl+C to stop)...\n");
    31.  
    32.     for (int i = 0; i < 100000; i++) {
    33.         DWORD lenNeeded = 0;
    34.         // Ядро входит в NtUserGetObjectInformation, делает ProbeForWrite,
    35.         // а в этот момент Поток Б выбивает страницу из-под ног ядра.
    36.         GetUserObjectInformationW(hWinSta, UOI_NAME, g_sharedMem, 1024, &lenNeeded);
    37.        
    38.         if (i % 10000 == 0) printf("[.] %d iterations completed\n", i);
    39.     }
    40.  
    41. g_running = false;
    42.     WaitForSingleObject(hThread, INFINITE);
    43.     VirtualFree(g_sharedMem, 0, MEM_RELEASE);
    44.     printf("[+] Test finished without BSOD.\n");
    45. }
    В связке с идой походу должна быть крутая штука.
     
    Mikl___ нравится это.