Вопрос тупой, ламерский) Мне нужен загрузчик DLL, тоже DLL, практически то же самое что хардлинк, но только реальный файл. Проблема в том что надо загружать файл который где-то находится... он должен быть во вложенных папках итд, поэтому нельзя просто его взять и положить куда надо) Вобщем надо его зацепить удалённо. Наверное всё зависит от содержания DLL или есть универсальный способ? И, кстати, я не очень понимаю что такое линк, это тоже файл? Его можно скажем в архиве передать другому? Я именно поэтому не хочу с линками связываться... причём линк всегда жёстко куда-то указывает, а в файле можно чтонибудь относительно указать через переменную. Хотя линк можно програмно тоже создавать используя переменную)
https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryexa https://learn.microsoft.com/en-us/w...rapi/nf-libloaderapi-setdefaultdlldirectories
Перепиши lwe(loader wrapper engine) двиг на свой манер, была трабла с защитой w10. Эмуляция образа для нтлдр.
Nexus.dll (который хардлинк) Код (Text): format PE64 DLL include '%fasm%/win64ax.inc' section '.code' executable start: sub rsp,8 invoke LoadLibraryEx,'C:\Nexus.dll',NULL,0x00000008+0x00000020 exit: invoke ExitProcess,NULL section '.idata' import readable library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL',shlwapi,'SHLWAPI.DLL',user32,'USER32.DLL' include '%fasm%/api/kernel32.inc' include '%fasm%/api/shell32.inc' include '%fasm%/api/shlwapi.inc' include '%fasm%/api/user32.inc' Наверное у меня не получится) Может там stub проверяется програмой хост) Я как обычно гружу скажем в Cubase модуль VST2 DLL. Изучать VST - это тогда легче свой модуль написать. Мне бы просто его залинковать, в этом суть вопроса. Хотя я вроде встречал такие dll которые загружают залинковывают настоящий vst/dll модуль. И у хакеров и у производителей редко, но встречалось. Всмысле я не в своё приложение загружаю ДЛЛ мне только shorcut надо сделать. Хе-хе, а ExitProcess вообще нужен в библиотеке? Или чёнить там хендл закрывать)
> ExitProcess вообще нужен Нужен был, EP вызывается как процедура, при возврате нэйтив сам все завершит. Но в младших версиях системы без импорта этой апи вроде загрузка не проходила.
Не помню версию, всегда вставлялся вызов ExitProcess. Может это и с аверами связано. Что мешает выяснить ? --- Сообщение объединено, 18 июл 2025 --- Надстройку(lwe) я разбирал помню на кл, но там поиск безуспешен. Может у вас получится.
xor sp, sp int Можно так завершиться, ядро если не может прокинуть фаулт в юзер(невалид стек), скипнет процесс.
Эта апи завершает работу процесса, я хз даже, если и нужен то чтобы предоставить пользователю этой длл незабываемые минуты в отладчике, в поисках почему же процесс внезапно сдох.
M0rg0t Синхронное завершение, как положено с нотифи, зачистки всякие это сомнительной надобности. При завершении удерживать загрузчик, что бы из него послать ipc сообщение и не попасть на деадлок, так можно в нэйтив сделать. Это грубейший кривой метод, разве годится для отладки, какой стектрейс сдампить, обозначив место крэша. Отменить завершение, реинит нельзя легально выполнить, подобно как и выгружать ядерные образы.
Вот я и вернулся к этой теме, даже забыл про неё. Мне нужен template, шаблон. Но теперь я хочу чтобы DLL просто насквозь через себя вызывал, например USER32.dll. Редирект экспорта вобщем. Сколько раз ИИ подбивал на это всёвремя глюки. Один раз он сказал что надо описывать все апи. Потом сказал что это тупо и можно было проще сделать. Но каждый раз что-то криво)
Это вполне легальная техника "Dll-Forwarding" - задай правильный вопрос своему ИИ, и он ответит тебе с примерами:
Вот уже два раза ошибка 0xc0000018 Код (Text): format PE64 GUI 4.0 DLL entry DllMain include '%fasm%/win64a.inc' ; ============================================================================= ; 1. СЕКЦИЯ КОДА (Здесь живет сам патчер) ; ============================================================================= section '.text' code readable executable proc DllMain hinstDLL, fdwReason, lpvReserved cmp [fdwReason], DLL_PROCESS_ATTACH jne .exit ; Запускаем патч в отдельном потоке, чтобы не тормозить загрузку PowerISO ; Используем прямое перенаправление на оригинальную функцию из ntdll, ; так как наш собственный импорт kernel32 сейчас недоступен invoke CreateThread, 0, 0, ApplyPatch, 0, 0, 0 .exit: mov eax, TRUE ret endp proc ApplyPatch local baseAddress:QWORD local oldProtect:DWORD ; 1. Получаем базовый адрес загруженного PowerISO.exe в памяти invoke GetModuleHandleA, 0 mov [baseAddress], rax test rax, rax jz .done ; --- ПРИМЕР ПРИМЕНЕНИЯ ВАШЕГО ПАТЧА --- ; Допустим, мы правим адрес по смещению 0x3239B2 (из вашего первого лога) mov rbx, [baseAddress] add rbx, 0x3239B2 ; Разрешаем запись в этот участок памяти (6 байт) invoke VirtualProtect, rbx, 6, PAGE_EXECUTE_READWRITE, addr oldProtect ; Записываем исправленные безопасные байты (E9 8C 01 00 00 90) mov dword [rbx], 0x018CE9 ; Первые 4 байта (Intel reversed: E9 8C 01 00) mov word [rbx+4], 0x9000 ; Последние 2 байта (00 90) ; Восстанавливаем оригинальные права памяти invoke VirtualProtect, rbx, 6, [oldProtect], addr oldProtect .done: ret endp ; ============================================================================= ; 2. СЕКЦИЯ ТРАНЗИТА (Forwarding) ; Здесь мы говорим Windows: "Если ищут функцию у нас — бери её из настоящей kernel32" ; ============================================================================= section '.edata' export data readable ; Для примера пропишем базовые функции, которые PowerISO дергает в первую очередь. ; Чтобы программа запустилась со 100% гарантией, этот список расширяется ; под конкретные импорты приложения. export 'KERNEL33.dll',\ _GetModuleHandleA, 'GetModuleHandleA',\ _VirtualProtect, 'VirtualProtect',\ _CreateThread, 'CreateThread',\ _ExitProcess, 'ExitProcess' ; Прозрачный проброс в оригинальную системную библиотеку _GetModuleHandleA db 'kernel32.GetModuleHandleA', 0 _VirtualProtect db 'kernel32.VirtualProtect', 0 _CreateThread db 'kernel32.CreateThread', 0 _ExitProcess db 'kernel32.ExitProcess', 0 ; ============================================================================= ; 3. СЕКЦИЯ ИМПОРТА (Нужна самой DLL для вызова функций патчера) ; Обратите внимание: сама наша DLL импортирует функции из оригинальной ntdll/kernel32! ; ============================================================================= section '.idata' import data readable library kernel32, 'kernel32.dll' import kernel32,\ GetModuleHandleA, 'GetModuleHandleA',\ VirtualProtect, 'VirtualProtect',\ CreateThread, 'CreateThread' Эта упорная ошибка 0xC0000018 возникает из-за того, что мы продолжаем наступать на одну и ту же мину защитных механизмов Windows. Она называется ASLR (Address Space Layout Randomization) и Safe DLL Search Order.