C++ Code Injection приводит к сбою внедренного приложения

Я пытаюсь внедрить простой исполняемый файл в другой исполняемый файл, который я сделал, к сожалению, всякий раз, когда я ввожу код в исполняемый файл, он говорит, что «simpleinjected.exe перестал работать», а затем закрывается. Я использую CreateRemoteThread для ввода кода. Это то, что я сделал до сих пор.

Injector.exe // файл, который внедряет код

#include <stdio.h>
#include <windows.h>

#define procId 2844
#define executable "executable.exe"    // located in same directory

int main()
{
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, procId);
    LPVOID allocated = (LPVOID)VirtualAllocEx(hProc, NULL, strlen(executable), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hProc, (LPVOID)allocated, executable, strlen(executable), NULL);
    LPVOID libaddr = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
    CreateRemoteThread(hProc, NULL, NULL, (LPTHREAD_START_ROUTINE)libaddr, NULL, NULL);
    CloseHandle(hProc);
    return 0;
}

Simpleinjected.exe // внедряемый файл

#include <stdio.h>

int main()
{
    printf("Hello");
    return 0;
}

executable.exe // исполняемый файл внедряется в simpleinjected

#include <windows.h>

int main()
{
    MessageBox(NULL, "Injected successfully", "Code Injection", MB_OK);
    return 0;
}

Сообщение не отображается и simpleinjected.exe аварийно завершает работу. Сбой показывает, что код был вставлен, но я не понимаю, почему он падает.

При использовании DLL и той же методики, описанной выше, dll выполняется в «simpleinjected.exe», но не работает при внедрении в Firefox. Код dll ниже. Он выполняется в пользовательском приложении, но не в Firefox, даже если он успешно внедрен.

dllinject.dll

#include <windows.h>

int message(const char *msg)
{
    MessageBox(NULL, msg, "Message from Dll", MB_OK);
    return 0;
}

BOOL WINAPI DLLMain(HINSTANCE hInstDll, DWORD ulReason, LPVOID lpReserved)
{
    switch(ulReason)
    {
        case DLL_PROCESS_ATTACH:
            message("process attach");
            break;
        case DLL_THREAD_ATTACH:
            message("thread attach");
            break;
        case DLL_PROCESS_DETACH:
            message("process detach");
            break;
        case DLL_THREAD_DETACH:
            message("thread detach");
            break;
    }
    return true;
}

person David    schedule 30.09.2014    source источник
comment
Разве не достаточно сложно внедрить DLL в чужой процесс, не говоря уже о другом исполняемом файле?   -  person WhozCraig    schedule 30.09.2014
comment
так нельзя?   -  person David    schedule 30.09.2014
comment
Если вы спрашиваете, соответствует ли CreateRemoteThread/LoadLibrary будет работать с EXE, а не с DLL, Сомневаюсь, но никогда не пробовал. Я могу сказать вам, что ваш регион VirtualAlloc недостаточно велик, так как strlen(executable) не включает места для вашего символа терминатора (который, кстати, также необходимо записать). удачи в этом, кстати.   -  person WhozCraig    schedule 30.09.2014
comment
так как же тогда мне ввести код в другой процесс?   -  person David    schedule 30.09.2014
comment
Напишите DLL и следуйте любым инструкциям, доступным в Интернете, чтобы сделать именно это.   -  person WhozCraig    schedule 30.09.2014
comment
используя dll, я могу это сделать, но это не работает для инъекции в Firefox.. позвольте мне отредактировать вопрос, чтобы показать, когда это сделано с dll..   -  person David    schedule 30.09.2014
comment
Это может быть глупый вопрос, но почему вы пытаетесь внедрить код в другой процесс (который, по-видимому, не хочет код, поскольку он не ищет его в динамической библиотеке)? Какую проблему вы на самом деле пытаетесь решить?   -  person Richard Hodges    schedule 30.09.2014
comment
Меня интересует внедрение dll, я не пытаюсь решить какую-либо проблему, просто удовлетворяю свое любопытство.   -  person David    schedule 30.09.2014
comment
Задумывались ли вы, что Firefox, по-видимому, имеет какую-то защиту от того, что вы пытаетесь сделать? Потому что выполнение вредоносного кода — это то, от чего защищено большинство приложений. Веб-браузеры особенно.   -  person HighPredator    schedule 30.09.2014
comment
Здесь есть полезная информация о том, что вы хотите сделать: codeproject.com/Articles/4610/ Я подозреваю, что вы обнаружите, что последние версии Windows требуют вмешательства пользователя для завершения вызовов (процесс пытается... вы хотите разрешить это?).   -  person Richard Hodges    schedule 30.09.2014
comment
@HighPredator, я этого не знал, потому что он просто вставлялся в приложение, которое я сделал.   -  person David    schedule 30.09.2014
comment
@RichardHodges, я читал эту статью, и, к сожалению, в ней используется встроенная сборка, в которой я не так хорош.   -  person David    schedule 30.09.2014
comment
Я не уверен, что еще предложить. Внедрение кода в другой процесс — это, вероятно, самая сложная вещь, которую вы можете попробовать с операционной системой. Это требует понимания архитектуры процессора и ОС.   -  person Richard Hodges    schedule 30.09.2014
comment
Я также использовал инжектор из Интернета, и dll успешно внедряется и выполняется.   -  person David    schedule 30.09.2014


Ответы (1)


модифицированный код Simpleinjected.exe, как показано ниже. а затем снова попробуйте внедрить dllinject.dll в Simpleinjected.exe.

#include <stdio.h>

int main()
{
   while(true)
   {
      printf("Hello");
   }
   return 0;
}

вы должны изменить определения ниже так же, как Simpleinjected.exe.

#define procId 2844 //process id of Simpleinjected.exe
#define executable "dllinject.dll"    // located in same directory
person Allen Hong    schedule 30.09.2014
comment
можно инжектить в simpleinjected.exe, работает, а в firefox не инжектится. - person David; 30.09.2014
comment
тег инъекции зависимости вопроса неверен. Вопрос про закачку в EXE. - person CoffeDeveloper; 30.09.2014