Загрузчик DLL

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 18 июл 2025.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    851
    Вопрос тупой, ламерский) Мне нужен загрузчик DLL, тоже DLL, практически то же самое что хардлинк, но только реальный файл.
    Проблема в том что надо загружать файл который где-то
    находится... он должен быть во вложенных папках итд, поэтому нельзя просто его взять и положить куда надо) Вобщем надо его зацепить удалённо. Наверное всё зависит от содержания DLL или есть универсальный способ?
    И, кстати, я не очень понимаю что такое линк, это тоже файл? Его можно скажем в архиве передать другому? Я именно поэтому не хочу с линками связываться... причём линк всегда жёстко куда-то указывает, а в файле можно чтонибудь относительно указать через переменную.

    Хотя линк можно програмно тоже создавать используя переменную)
     
  2. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    223
  3. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.261
  4. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    683
    Перепиши lwe(loader wrapper engine) двиг на свой манер, была трабла с защитой w10. Эмуляция образа для нтлдр.
     
    Semiono нравится это.
  5. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    851
    Nexus.dll (который хардлинк)
    Код (Text):
    1. format PE64 DLL
    2. include '%fasm%/win64ax.inc'
    3. section '.code' executable
    4. start:
    5.         sub rsp,8
    6.  
    7.         invoke LoadLibraryEx,'C:\Nexus.dll',NULL,0x00000008+0x00000020
    8. exit:
    9.         invoke ExitProcess,NULL
    10.  
    11. section '.idata' import readable
    12.  
    13.         library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL',shlwapi,'SHLWAPI.DLL',user32,'USER32.DLL'
    14.         include '%fasm%/api/kernel32.inc'
    15.         include '%fasm%/api/shell32.inc'
    16.         include '%fasm%/api/shlwapi.inc'
    17.         include '%fasm%/api/user32.inc'
    Наверное у меня не получится) Может там stub проверяется програмой хост)
    Я как обычно гружу скажем в Cubase модуль VST2 DLL. Изучать VST - это тогда легче свой модуль написать. Мне бы просто его залинковать, в этом суть вопроса.
    Хотя я вроде встречал такие dll которые загружают залинковывают настоящий vst/dll модуль. И у хакеров и у производителей редко, но встречалось.

    Всмысле я не в своё приложение загружаю ДЛЛ :russian: мне только shorcut надо сделать.

    Хе-хе, а ExitProcess вообще нужен в библиотеке? Или чёнить там хендл закрывать)
     
    Последнее редактирование: 18 июл 2025
  6. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    683
    > ExitProcess вообще нужен

    Нужен был, EP вызывается как процедура, при возврате нэйтив сам все завершит. Но в младших версиях системы без импорта этой апи вроде загрузка не проходила.
     
    Semiono нравится это.
  7. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    610
    win95?
     
  8. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    683
    Не помню версию, всегда вставлялся вызов ExitProcess. Может это и с аверами связано. Что мешает выяснить ?
    --- Сообщение объединено, 18 июл 2025 ---
    Надстройку(lwe) я разбирал помню на кл, но там поиск безуспешен. Может у вас получится.
     
    Последнее редактирование: 18 июл 2025
  9. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.261
    Ahimov,
    ExitProcess --> kernel.dll обертка над RtlExitUserProcess --> ntdll.dll
     
    Semiono нравится это.
  10. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    683
    xor sp, sp
    int

    Можно так завершиться, ядро если не может прокинуть фаулт в юзер(невалид стек), скипнет процесс.
     
  11. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.654
    Эта апи завершает работу процесса, я хз даже, если и нужен то чтобы предоставить пользователю этой длл незабываемые минуты в отладчике, в поисках почему же процесс внезапно сдох.
     
  12. Ahimov

    Ahimov Active Member

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

    Синхронное завершение, как положено с нотифи, зачистки всякие это сомнительной надобности. При завершении удерживать загрузчик, что бы из него послать ipc сообщение и не попасть на деадлок, так можно в нэйтив сделать. Это грубейший кривой метод, разве годится для отладки, какой стектрейс сдампить, обозначив место крэша. Отменить завершение, реинит нельзя легально выполнить, подобно как и выгружать ядерные образы.
     
  13. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    851
    Вот я и вернулся к этой теме, даже забыл про неё.
    Мне нужен template, шаблон.
    Но теперь я хочу чтобы DLL
    просто насквозь через себя
    вызывал, например USER32.dll.
    Редирект экспорта вобщем.
    Сколько раз ИИ подбивал на это
    всёвремя глюки. Один раз он сказал что надо описывать
    все апи. Потом сказал что это
    тупо и можно было проще сделать.
    Но каждый раз что-то криво)
     
  14. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    363
    Это вполне легальная техника "Dll-Forwarding" - задай правильный вопрос своему ИИ, и он ответит тебе с примерами:

    fwr.png
     
  15. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    851
    Вот уже два раза ошибка 0xc0000018

    Код (Text):
    1. format PE64 GUI 4.0 DLL
    2. entry DllMain
    3.  
    4. include '%fasm%/win64a.inc'
    5.  
    6. ; =============================================================================
    7. ; 1. СЕКЦИЯ КОДА (Здесь живет сам патчер)
    8. ; =============================================================================
    9. section '.text' code readable executable
    10.  
    11. proc DllMain hinstDLL, fdwReason, lpvReserved
    12.     cmp [fdwReason], DLL_PROCESS_ATTACH
    13.     jne .exit
    14.    
    15.     ; Запускаем патч в отдельном потоке, чтобы не тормозить загрузку PowerISO
    16.     ; Используем прямое перенаправление на оригинальную функцию из ntdll,
    17.     ; так как наш собственный импорт kernel32 сейчас недоступен
    18.     invoke CreateThread, 0, 0, ApplyPatch, 0, 0, 0
    19.    
    20. .exit:
    21.     mov eax, TRUE
    22.     ret
    23. endp
    24.  
    25. proc ApplyPatch
    26.     local baseAddress:QWORD
    27.     local oldProtect:DWORD
    28.    
    29.     ; 1. Получаем базовый адрес загруженного PowerISO.exe в памяти
    30.     invoke GetModuleHandleA, 0
    31.     mov [baseAddress], rax
    32.     test rax, rax
    33.     jz .done
    34.    
    35.     ; --- ПРИМЕР ПРИМЕНЕНИЯ ВАШЕГО ПАТЧА ---
    36.     ; Допустим, мы правим адрес по смещению 0x3239B2 (из вашего первого лога)
    37.     mov rbx, [baseAddress]
    38.     add rbx, 0x3239B2
    39.    
    40.     ; Разрешаем запись в этот участок памяти (6 байт)
    41.     invoke VirtualProtect, rbx, 6, PAGE_EXECUTE_READWRITE, addr oldProtect
    42.    
    43.     ; Записываем исправленные безопасные байты (E9 8C 01 00 00 90)
    44.     mov dword [rbx], 0x018CE9    ; Первые 4 байта (Intel reversed: E9 8C 01 00)
    45.     mov word [rbx+4], 0x9000     ; Последние 2 байта (00 90)
    46.    
    47.     ; Восстанавливаем оригинальные права памяти
    48.     invoke VirtualProtect, rbx, 6, [oldProtect], addr oldProtect
    49.  
    50. .done:
    51.     ret
    52. endp
    53.  
    54.  
    55. ; =============================================================================
    56. ; 2. СЕКЦИЯ ТРАНЗИТА (Forwarding)
    57. ; Здесь мы говорим Windows: "Если ищут функцию у нас — бери её из настоящей kernel32"
    58. ; =============================================================================
    59. section '.edata' export data readable
    60.  
    61.   ; Для примера пропишем базовые функции, которые PowerISO дергает в первую очередь.
    62.   ; Чтобы программа запустилась со 100% гарантией, этот список расширяется
    63.   ; под конкретные импорты приложения.
    64.   export 'KERNEL33.dll',\
    65.          _GetModuleHandleA, 'GetModuleHandleA',\
    66.          _VirtualProtect,   'VirtualProtect',\
    67.          _CreateThread,     'CreateThread',\
    68.          _ExitProcess,      'ExitProcess'
    69.  
    70.   ; Прозрачный проброс в оригинальную системную библиотеку
    71.   _GetModuleHandleA db 'kernel32.GetModuleHandleA', 0
    72.   _VirtualProtect   db 'kernel32.VirtualProtect', 0
    73.   _CreateThread     db 'kernel32.CreateThread', 0
    74.   _ExitProcess      db 'kernel32.ExitProcess', 0
    75.  
    76.  
    77. ; =============================================================================
    78. ; 3. СЕКЦИЯ ИМПОРТА (Нужна самой DLL для вызова функций патчера)
    79. ; Обратите внимание: сама наша DLL импортирует функции из оригинальной ntdll/kernel32!
    80. ; =============================================================================
    81. section '.idata' import data readable
    82.     library kernel32, 'kernel32.dll'
    83.     import kernel32,\
    84.            GetModuleHandleA, 'GetModuleHandleA',\
    85.            VirtualProtect,   'VirtualProtect',\
    86.            CreateThread,     'CreateThread'
    87.  
    Эта упорная ошибка 0xC0000018 возникает из-за того, что мы продолжаем наступать на одну и ту же мину защитных механизмов Windows. Она называется ASLR (Address Space Layout Randomization) и Safe DLL Search Order.