Тема: AHK: ComObjCreate WScript
https://www.script-coding.com/WSH/WScript.html
WScript := ComObjCreate("WScript")
Так не работает.
Win10x64 AhkSpy, Hotkey, ClockGui
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
https://www.script-coding.com/WSH/WScript.html
WScript := ComObjCreate("WScript")
Так не работает.
Я в Гугле в один клик нашёл.
Хорошо тебе, а я не нашёл.
Попробуй запрос объект WScript.
Попробовал.
Успешно?
Нет.
Неужели не выпало ни одного сайта, где используется конструкция CreateObject("WScript ...)?
ComObjCreate("WScript") такого нигде.
...)?
Что значат точки?
такого нигде
А какое есть?
Что значат точки?
Что там есть что-то ещё.
serzh82saratov, читай тут:
https://ericlippert.com/2003/10/08/why- … pt-object/
Да, WScript это внутренний объект WSH, но есть системный COM-класс, реализующий сходный функционал.
Хотя нет, я с WshShell перепутал.
serzh82saratov, читай тут:
https://ericlippert.com/2003/10/08/why- … pt-object/
Я из того понял что никак, или я ошибаюсь?
Да, никак.
serzh82saratov, а какой функционал тебе нужен?
AHK тут просто для примера, а нужен GetObject в JS и VBS для создания COM из DLL файла.
создания COM
Может и не COM, ну в общем для использования DLL в этих языках.
для использования DLL в этих языках.
Если без сторонних средств, то есть https://ru.wikipedia.org/wiki/Rundll32.exe. Но функция должна быть для этого предназначена.
Не знал, но я так понял что это только про запуск функций, хотелось бы нормальное взаимодействие.
События получать например. Да и просто запуск функции путём запуска ехе не самый быстрый способ, да и как получать результат выполнения.
Тогда остаются сторонние средства, вроде того, что у меня в подписи. Правда, конкретно его банят многие антивирусы, но можно написать аналог на другом языке.
Но он требует регистрации в системе, а я имею ввиду без регистрации. Как LoаdLibrary в анк.
Можно без регистрации, через манифесты. Ещё есть в системе какой-то предустановленный класс, который тоже позволяет другие без регистрации использовать. Только я забыл как он называется. Но пример видел именно с использованием DWX без регистрации.
Ещё есть в системе какой-то предустановленный класс
Не факт что его можно использовать во всех языках, ну и пример конечно интересно было бы посмотреть.
пример конечно интересно было бы посмотреть.
RegistrationFree DynamicWrapperX
Один манифест там всё-таки нужен. Ну и clsid в примере старый, сейчас {89565276-A714-4a43-912E-978B935EDCCC}.
Интересно, но выдаёт.
Требуемый класс отсутствует в ClassFactory
actCtx := ComObjCreate("Microsoft.Windows.ActCtx")
actCtx.Manifest := "D:\FFFFFFFFFFFF\AutoHotKey\dynwrapx\dynwrap.test.manifest"
DX := actCtx.CreateObject("DynamicWrapperX")
DX.Register("user32.dll", "MessageBoxW", "i=hwwu", "r=l")
res := DX.MessageBoxW(0, "Hello, world!", "Test", 4)
MsgBox % res
Пробовал обе битности, после того как подружил с антивирусом.
Я правильно понял что путь к DLL задан тут как относительный?
<file name="dynwrapx.dll">
DynamicWrapperX версии 2.2.0.0, может в примере манифест под другую версию?
Пример для версии 1, но там только clsid отличается. Не помню уже подробностей про эти манифесты, надо разбираться заново.
Пример для версии 1, но там только clsid отличается
А у новой версии какой clsid?
Не помню уже подробностей про эти манифесты, надо разбираться заново.
То есть для каждой DLL могут понадобится некие данные, и не факт что это только clsid и progid?
Проверил пример с первой версией, похоже Microsoft.Windows.ActCtx то что надо!
А у новой версии какой clsid?
Ну и clsid в примере старый, сейчас {89565276-A714-4a43-912E-978B935EDCCC}.
То есть для каждой DLL могут понадобится некие данные, и не факт что это только clsid и progid?
Это для COM-DLL. Через мою потом можно вызывать функции обычных DLL.
Ну и clsid в примере старый, сейчас {89565276-A714-4a43-912E-978B935EDCCC}.
Не заметил.) Да всё работает. Я бы такое в описание добавил, не всегда удобна регистрация.
Заметил что путь к Manifest в JS должен быть абсолютным, а в AUTOHOTKEY может быть относительным.
Это для COM-DLL. Через мою потом можно вызывать функции обычных DLL.
Прям библиотека библиотек, спасибо, вопрос снят.
Заметил что путь к Manifest в JS должен быть абсолютным, а в AUTOHOTKEY может быть относительным.
Так это, по идее, смотря где он лежит. Из любого языка этот путь передаётся всё равно в объект ActCtx. Либо абсолютный указывать, либо относительно текущего каталога процесса. Должно быть так.
относительно текущего каталога процесса
В JS процесс это C:\Windows\SysWOW64\wscript.exe, так что если DLL рядом со скриптом, то не работает. Но и у анк до процесса путь свой, но с ним относительный прокатывает. В JS неясное понятие рабочей папки, и как её изменить.
Так это, по идее, смотря где он лежит.
В той же папке что и скрипт.
В JS неясное понятие рабочей папки, и как её изменить.
Вроде там же, где скрипт. Проверил таким кодом:
dwx = new ActiveXObject("DynamicWrapperX");
dwx.Register("kernel32", "GetCurrentDirectoryW", "i=up");
bufsize = 500;
buf = dwx.MemAlloc(bufsize);
dwx.GetCurrentDirectoryW(bufsize / 2, buf);
WSH.Echo(dwx.StrGet(buf));
Изменить можно через SetCurrentDirectory.
В JS процесс это C:\Windows\SysWOW64\wscript.exe, так что если DLL рядом со скриптом, то не работает.
Она должна быть рядом с манифестом, насколько я понял. Т.е. отдельно к ней путь не надо указывать. По крайней мере, у меня так сработало.
GetCurrentDirectoryW может получать то что касается DynamicWrapperX, а не самого JS, или Microsoft.Windows.ActCtx в JS. Так у меня не работает.
var actCtx = new ActiveXObject("Microsoft.Windows.ActCtx");
actCtx.Manifest = "dynwrap.test.manifest";
Не удается найти указанный файл.
GetCurrentDirectoryW может получать то что касается DynamicWrapperX, а не самого JS, или Microsoft.Windows.ActCtx в JS.
GetCurrentDirectory Function
Retrieves the current directory for the current process
DWX и ActCtx работают в процессе, который их создал. У процесса один текущий каталог.
Так у меня не работает.
Как именно? Где что в этот момент лежало?
Как именно? Где что в этот момент лежало?
Скрипт, манифест и DLL в одной папке. На строке actCtx.Manifest ошибка.
Скрипт, манифест и DLL в одной папке.
У меня при таком же раскладе работает.
И что интересно JS скрипт, не работает кликом из проводника.
Ошибка: 0x800700C1
Код: 800700C1
Источник: (null)
Запускается только командой Run.
serzh82saratov пишет:Скрипт, манифест и DLL в одной папке.
У меня при таком же раскладе работает.
Не знай как так. Кодировка файлов и переносы строк какие? У меня UTF-8 и Unix (LF).
Не знай как так.
Если через Run, то текущий каталог получается тот, где лежит wscript.exe. Поэтому у вас и не находит. А если двойным щелчком по файлу JS, то текущий — эта папка, поэтому находит. В Run же можно указать текущий каталог.
сли через Run, то текущий каталог получается тот, где лежит wscript.exe.
В Run wscript.exe не указан, только JS файл.
А если двойным щелчком по файлу JS, то текущий — эта папка, поэтому находит.
Так не работало.
Я понял, на JS я тестил первую версию. Она 32 бит, а из проводника запускалась 64 битным wscript, а Run я из под 32 анк запускал. Но в первой версии ошибка с путём всё же есть. Со второй версией норм, относительный путь работает.
В Run wscript.exe не указан, только JS файл.
Я так и делал. Просто проверил каталог через GetCurrentDirectory и получил C:\Windows\system32.
Но в первой версии ошибка с путём всё же есть.
Она есть при использовании Run. Версия ни при чём.
Она есть при использовании Run. Версия ни при чём.
С Run была ошибка с битностью, к пути Manifest она не имеет отношения.
проверил каталог через GetCurrentDirectory и получил C:\Windows\system32
Значит как я и предполагал к относительности пути до Manifest она не имеет отношения.
С Run была ошибка с битностью, к пути Manifest она не имеет отношения.
У меня не было ошибки с битностью при использовании Run. Проблема как раз с тем, что путь относительный, а каталог не тот.
Значит как я и предполагал к относительности пути до Manifest она не имеет отношения.
Относительный путь — относительно текущего каталога. Если каталог не тот, файл не будет найден.
Интересно, что если встроить манифест в библиотеку в виде ресурса, то в скрипте всё равно нужно указывать путь до dynwrapx.manifest, даже если такого файла нет. Если указать саму библиотеку, то вылезает ошибка
Строка: 2
Символ: 1
Ошибка: Указанный тип ресурса в файле образа отсутствует.
Если каталог не тот, файл не будет найден.
Текущий каталог, это папка скрипта, в ней и манифест и dll.
Интересно, что если встроить манифест в библиотеку в виде ресурса, то в скрипте всё равно нужно указывать путь до dynwrapx.manifest, даже если такого файла нет
То есть можно указать несуществующий файл, и это будет работать?
Я так сделал, не получается без файла манифеста.
Текущий каталог, это папка скрипта, в ней и манифест и dll.
При использовании Run это не так. Если только в самом Run не указать явно.
То есть можно указать несуществующий файл, и это будет работать?
Такой странный алгоритм поиска манифеста.
Я так сделал, не получается без файла манифеста.
Не видно картинку, и по адресу не находится.
При использовании Run это не так. Если только в самом Run не указать явно.
Со второй версией работает, с первой проблема была.
Не видно картинку, и по адресу не находится.
https://imgur.com/6j7xG2w а так?
Такой странный алгоритм поиска манифеста.
У меня так выдаёт ошибку о несуществующем файле.
https://imgur.com/6j7xG2w
У меня так выдаёт ошибку о несуществующем файле.
Если actCtx.Manifest обернуть в try catch, то "Невозможно создание объекта сервером программирования объектов".
Со второй версией работает, с первой проблема была.
Первую я даже не пробовал. Версия DWX тут вообще ни при чём. Суть в том, что когда скрипт JS запускается через Run без явного указания рабочего каталога, то используется каталог, где лежит wscript.exe. Не имеет значения, что делает скрипт JS, а уж тем более какую версию чего-то там он использует.
https://imgur.com/6j7xG2w а так?
Там надо выбрать именно код для форума, это ниже расположено.
У меня так выдаёт ошибку о несуществующем файле.
Не пойму, как это работает. Лежит библиотека в одном месте — работает, а если в другом — нет, хотя в обоих случаях указан полный путь. Белиберда какая-то. Отдельного файла манифеста нет в обоих случаях.
Там надо выбрать именно код для форума, это ниже расположено.
В 57 ом приложил.
Не пойму, как это работает. Лежит библиотека в одном месте — работает, а если в другом — нет, хотя в обоих случаях указан полный путь. Белиберда какая-то. Отдельного файла манифеста нет в обоих случаях.
Библиотека всегда в папке скрипта.
Интересно, что если встроить манифест в библиотеку в виде ресурса, то в скрипте всё равно нужно указывать путь до dynwrapx.manifest, даже если такого файла нет. Если указать саму библиотеку, то вылезает ошибка
Можете приложить файл dll, и что написано в actCtx.Manifest?
У меня такой.
Не пойму, как это работает. Лежит библиотека в одном месте — работает, а если в другом — нет, хотя в обоих случаях указан полный путь. Белиберда какая-то. Отдельного файла манифеста нет в обоих случаях.
Или вы про своё?
Может типа закешировалось, и просто используется последний, хотя у меня такого не наблюдалось.
Если контекст активации не может быть создан из манифеста, для контекста активации остается текущий активный контекст активации.
Или вы про своё?
Может типа закешировалось, и просто используется последний:
Про своё, конечно. Но я ошибся: там, где работало, всё-таки валялся манифест. Совершенно не помню, когда я его туда положил и зачем. Вот и думал, что там его нет.
Но странно, что не находит в DLL. Как это он отсутствует в файле образа, если он там есть? Т.е. получается, что всё-таки ищет. Но почему не видит его? Что-то они не докрутили с этим ActCtx.
Про своё, конечно. Но я ошибся:
А, значит не работает без файла?
Но странно, что не находит в DLL. Как это он отсутствует в файле образа, если он там есть?
Может после имени dll как то пишется нужный файл в ресурсах.
Указанный тип ресурса в файле образа отсутствует.
Или вместо файла указывается некий тип.
А, значит не работает без файла?
Не работает. Хотя по описанию сначала должно искать в DLL, и только если там нет, то искать отдельный файл. Но, видимо, конкретно объект ActCtx работает по-другому.
Может после имени dll как то пишется нужный файл в ресурсах.
В ошибке говорится, что отсутствует указанный тип ресурса. А тип — это, по идее, манифест. Что-то другое ему искать нет смысла. Видимо, встроенный манифест работает только если есть манифест и для приложения, которое использует эту DLL. А если активировать через ActCtx, то нужен отдельный. Ну, я не думаю, что это большая проблема.
DLL
Sxsoa.dll
IID
IID_IActCtx определяется как 8FA7728F-B69B-4EE5-99F2-E2AA021BEF28
Не могу найти ни одним диспетчером COM.
Ну, я не думаю, что это большая проблема.
Так то да, но конечно было бы интереснее без файла.
Не могу найти ни одним диспетчером COM.
Оно откуда-то не из реестра берётся.
https://www.autohotkey.com/boards/viewtopic.php?t=67768
https://www.autohotkey.com/boards/viewt … 68#p291631
Тут интересно про ManifestText.
Оно откуда-то не из реестра берётся.
Хотел глянуть dll на предмет методов, то есть никак не понять что за файл этой библиотеки?
Тут интересно про ManifestText.
Не особо, если он просто переданный текст манифеста в файл пишет. Интереснее, откуда автор темы о нём узнал.
Хотел глянуть dll на предмет методов, то есть никак не понять что за файл этой библиотеки?
Она должна быть загружена в процесс, когда создан объект ActCtx. Если все загруженные просмотреть, то, может, и можно как-то её опознать.
Интереснее, откуда автор темы о нём узнал.
Может так.
Хотел глянуть dll на предмет методов
Что то не выходит.
var multiline = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + '\r\n'
+ '<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">' + '\r\n'
+ '' + '\r\n'
+ ' <file name="dynwrapx.dll">' + '\r\n'
+ ' <comClass' + '\r\n'
+ ' description="DynamicWrapperX Class"' + '\r\n'
+ ' clsid="{89565276-A714-4a43-912E-978B935EDCCC}"' + '\r\n'
+ ' threadingModel="Both"' + '\r\n'
+ ' progid="DynamicWrapperX"/>' + '\r\n'
+ ' </file>' + '\r\n'
+ '' + '\r\n'
+ '</assembly>'
actCtx.ManifestText = multiline
Ошибка: Не удалось запустить приложение, поскольку его параллельная конфигурация неправильна.
Дополнительные сведения содержатся в журнале событий приложений или используйте
программу командной строки sxstrace.exe для получения дополнительных сведений.
Не особо, если он просто переданный текст манифеста в файл пишет
Всё равно любопытно, файл всё таки временный.
Может так.
IActCtx::Manifest 1 (0x1) sxsoa.dll C:\Windows\WinSxS\amd64_microsoft.windows.isolationautomation_6595b64144ccf1df_1.0.19041.3636_none_12424fbda04174fd\sxsoa.dll COM Property
IActCtx::ManifestText 2 (0x2) sxsoa.dll C:\Windows\WinSxS\amd64_microsoft.windows.isolationautomation_6595b64144ccf1df_1.0.19041.3636_none_12424fbda04174fd\sxsoa.dll COM Property
IActCtx::ManifestURL 3 (0x3) sxsoa.dll C:\Windows\WinSxS\amd64_microsoft.windows.isolationautomation_6595b64144ccf1df_1.0.19041.3636_none_12424fbda04174fd\sxsoa.dll COM Property
IActCtx::CreateObject 4 (0x4) sxsoa.dll C:\Windows\WinSxS\amd64_microsoft.windows.isolationautomation_6595b64144ccf1df_1.0.19041.3636_none_12424fbda04174fd\sxsoa.dll COM Method
IActCtx::GetObject 5 (0x5) sxsoa.dll C:\Windows\WinSxS\amd64_microsoft.windows.isolationautomation_6595b64144ccf1df_1.0.19041.3636_none_12424fbda04174fd\sxsoa.dll COM Method
DllCanUnloadNow 0x0000000180004e90 0x00004e90 1 (0x1) sxsoa.dll C:\Windows\WinSxS\amd64_microsoft.windows.isolationautomation_6595b64144ccf1df_1.0.19041.3636_none_12424fbda04174fd\sxsoa.dll Exported Function
DllGetClassObject 0x0000000180004eb0 0x00004eb0 2 (0x2) sxsoa.dll C:\Windows\WinSxS\amd64_microsoft.windows.isolationautomation_6595b64144ccf1df_1.0.19041.3636_none_12424fbda04174fd\sxsoa.dll Exported Function
DllRegisterServer 0x0000000180004ed0 0x00004ed0 3 (0x3) sxsoa.dll C:\Windows\WinSxS\amd64_microsoft.windows.isolationautomation_6595b64144ccf1df_1.0.19041.3636_none_12424fbda04174fd\sxsoa.dll Exported Function
DllUnregisterServer 0x0000000180004fa0 0x00004fa0 4 (0x4) sxsoa.dll C:\Windows\WinSxS\amd64_microsoft.windows.isolationautomation_6595b64144ccf1df_1.0.19041.3636_none_12424fbda04174fd\sxsoa.dll Exported Function
Есть ещё некий ManifestURL.
Не знаю имеет отношение, у CreateObject есть 2ой параметр.
у CreateObject есть 2ой параметр.
Если без манифеста туда что-нибудь прописать и убрать try, то:
Строка: 6
Символ: 2
Ошибка: Сервер RPC недоступен.
У меня такой вариант работает:
https://gist.github.com/benheise/d5eb0c … 3aa3346b81
Оч сложно. У меня на fso.GetSpecialFolder(2) этом ошибка "Путь не найден".
Это потому что, наверное, нету папки C:\Tools.
https://gist.github.com/benheise/d5eb0c … e-sc-js-L6
По сути он просто создаёт файл.
И dll из текста. Прикольно конечно, но наличие файла манифеста оно не отменяет.
наличие файла манифеста оно не отменяет
Точнее требует чтобы в TMP папке была dll, и создает при каждом запуске новый файл манифеста, которые копятся в папке.
А так вариант, переделать в создание файлов если их нет, и не использовать ManifestText.
А чем тебя в папке манифест не устраивает?
ax.Manifest := "C:\TEMP\manifest.file"
Не понял вопрос, в любой папке устраивает кроме скрипта.
Я имею в виду, зачем каждый раз создавать файл с манифестом и использовать недокументированный метод ManifestText, когда можно один раз создать файл с манифестом и ссылаться на него с помощью метода Manifest.
Я к тому и пришёл. До этого была надежда что он может быть не нужен.
А так как dll тоже по хорошему надо держать в общей для всех папке, то и файл манифеста там не мешает, так что вопрос исчерпан.
У меня такой вариант работает:
https://gist.github.com/benheise/d5eb0c … 3aa3346b81
С shellcode пример загадочный.
И под х32 не заводится, так понял из за того что в коде dynwrapX только х64.
Не только из-за dynwrap, payload тоже должен быть под x64.
Создать можно, например, с помощью msfvenom.
https://habr.com/ru/companies/ruvds/articles/343612/
В общем, хакерские приёмчики:
https://www.youtube.com/watch?v=aEZKGW_VTd4
И под х32 не заводится, так понял из за того что в коде dynwrapX только х64.
Машинный код разный для разных битностей. Поэтому, если нужна работа в обеих, то нужны два его варианта, и в скрипте определять битность процесса. Ну и DWX, конечно, иметь два.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться