У меня есть стороннее консольное приложение. Мне нужно запустить его из моего приложения, но я не могу запустить его как отдельный процесс (потому что мне нужно работать с его зависимостями: вручную заполнять таблицы импорта, настраивать хуки и т. д.). Так что, вероятно, мне следует вручную вызвать функцию main
этого исполняемого файла. Вот как я пытаюсь это сделать:
- Загрузите этот EXE-файл, используя
auto hMod = LoadLibrary("console_app.exe")
- Заполните таблицу импорта этого exe вручную
- Получите точку входа этого EXE и вызовите его
И я застрял с последним шагом.
Вот как я пытаюсь вызвать точку входа:
void runMain(HINSTANCE hInst)
{
typedef BOOL(WINAPI *PfnMain)(int, char*[]);
auto imageNtHeaders = ImageNtHeader(hInst);
auto pfnMain = (PfnMain)(DWORD_PTR)(imageNtHeaders->OptionalHeader.AddressOfEntryPoint + (DWORD_PTR)hInst);
char* args[] = { R"(<console_app_path>)", R"(arg1)", R"(arg2)" };
pfnMain(3, args);
}
Оно работает. Но это работает так, как будто аргументов нет.
Где я не прав? Как я могу запустить исполняемый файл внутри моего процесса с аргументами? Спасибо.
ОБНОВИТЬ:
Я исследовал, как мой конкретный сторонний exe получает аргументы cmd, и обнаружил, что:
- Он вообще не импортирует
GetCommandLine
и не вызывает его - После вызова
call _initterm
аргументыargc
иargv
доступны черезcs:argc
иcs:argv
(см. рисунки ниже) - Аргументы CMD, которые я передаю своему основному консольному приложению, также передаются дочернему EXE.
Не могли бы вы объяснить, что на самом деле делает _initterm
и где на самом деле хранятся аргументы CMD?
main
, а оболочкой вокругmain
. В этом случае параметры сильно зависят от реализации. - person StoryTeller - Unslander Monica   schedule 05.01.2017EXE
есть релокации. что не всегда верно дляEXE
- person RbMm   schedule 05.01.2017EXE
в отдельном процессе и ввести в него собственныйDLL
в начальной точке с помощьюQueueUserAPC
, который устанавливает крючки - person RbMm   schedule 05.01.2017__getmainargs
или__wgetmainargs
изmsvcrt.dll
- msdn.microsoft.com/en- us/library/ff770599.aspx также можно использовать_acmdln
или_wcmdln
- msdn.microsoft.com/en-us/library/ff770586.aspx - person RbMm   schedule 06.01.2017_initterm
вызов конструкторов глобальных объектов и инициализация глобальных переменных - person RbMm   schedule 06.01.2017