Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6305
Последний выпуск: 19.06.2015

Проблема с DLL injection & запуском thread

82K
27 августа 2012 года
Starkmen
6 / / 20.08.2012
Привет! Ребята, доскажите, в чем может быть проблема: инжектю к нужной программе dll, в dllmain хочу запустить поток, но нечего не получается. Целевая программа то вылетает, то зависает.
Виснет если использую:

 
Код:
boost::thread::join()
std::thread::join()
Вылетает, если использую

 
Код:
CreateThread(...), _beginthread(...)
Подскажите, как правильно запустить параллельный поток после инжекта?
  • у меня 64 битная 7 винда. Может для многопоточности нужны дополнительные параметры компилирования? от Starkmen, 28 августа 2012 года
  • проверил с другими приложениями - тоже зависают. Скажите, как приинжектив dll можно запустить параллельный поток? от Starkmen, 27 августа 2012 года
  • Уже написал два разных инжектора, но не с одним толком не работает. то есть доходит до джойна потока и все от Starkmen, 27 августа 2012 года
  • Сообщено об удачном подключении появляется, но после этого прога зависает от Starkmen, 27 августа 2012 года
  • С ошибкой ещё не разобрался, хочу прикрутить обработку ошибок... Я слез с C# и еще совсем новичок в VC++. Там проще от Starkmen, 27 августа 2012 года
  • смотрите в комменты ниже от Starkmen, 27 августа 2012 года
277
27 августа 2012 года
arrjj
1.7K / / 26.01.2011
У нас всё работает.

Как поток создаешь для join??
С какой ошибкой вылетает??
Покажи больше кода.
465
27 августа 2012 года
QWERYTY
595 / / 25.03.2012
Ничё не понятно.

Вы в длл пытаетесь создать поток?

Код:
// ФУНКЦИЯ ЗАГРУЖАЕТ ДЛЛ В УКАЗАННЫЙ ПРОЦЕСС
function InjectDLL(PId: CARDINAL; DllPath: WideString): BOOL; stdcall;
var
RemotePMem, StartAddress: POINTER;
LibPathLen, HProcess, RealWrite: CARDINAL;
WriteProcess: BOOL;
begin
  LibPathLen := Length(DllPath)*2;
  HProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, PId);
  RemotePMem := VirtualAllocEx(HProcess, NIL, LibPathLen, MEM_COMMIT, PAGE_READWRITE);
  StartAddress := GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryW');
  WriteProcess := WriteProcessMemory(HProcess, RemotePMem, PWideChar(DllPath), LibPathLen, RealWrite);
  HThread := CreateRemoteThread(HProcess, NIL, 0, StartAddress, RemotePMem, 0, MyTId);
  CloseHandle(HProcess);
  Result := TRUE;
end;
А уже в длл выполняете всё что вам нужно.
Или вам так категорически не подходит?
465
27 августа 2012 года
QWERYTY
595 / / 25.03.2012
У меня были проблемы когда ставил хук, и библиотека инжектилась системой.

Но когда сам инжектишь никаких проблем не видал. Так что скорее всего это какието ваши баги.


Побольше кода действительно увидеть нужно.
82K
27 августа 2012 года
Starkmen
6 / / 20.08.2012
Собственно код:

Код:
#include "Windows.h"
#include <thread>

void hello()
{
    MessageBoxA(NULL,"HELLO","HELLO",64);
}

BOOL WINAPI DllMain(HINSTANCE DLL,DWORD fdwReason,LPVOID lpvReserved)
{
    if(fdwReason == DLL_PROCESS_ATTACH)
    {
        MessageBoxA(NULL,"Connected","DLL",MB_OK);
        HMODULE hmodule;
        if((hmodule=GetModuleHandle(NULL))!=NULL)
        {
            std::thread t(hello);
            t.join();  
        }
    }
}
вот с таким кодом тупо зависает.
82K
27 августа 2012 года
Starkmen
6 / / 20.08.2012
Инжектю вот таким кодом:

Код:
int PID=0;
    scanf_s("%d",&procid);
           HANDLE proc= OpenProcess(CREATE_THREAD_ACCESS, FALSE, PID);
               char dll[]="inject.dll";
               LPVOID LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

               LPVOID RemoteString = (LPVOID)VirtualAllocEx(proc, NULL, strlen(dll), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
               WriteProcessMemory(proc, (LPVOID)RemoteString, DLL_NAME,strlen(dll), NULL);
               CreateRemoteThread(proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL);  
   
               CloseHandle(proc);
к стати взял этот пример с этого сайта.. Автор arrjj

проблема видно не в инжекторе, а в самой процедуре запуска процесса
277
28 августа 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: Starkmen
Собственно код:

Код:
#include "Windows.h"
#include <thread>

void hello()
{
    MessageBoxA(NULL,"HELLO","HELLO",64);
}

BOOL WINAPI DllMain(HINSTANCE DLL,DWORD fdwReason,LPVOID lpvReserved)
{
    if(fdwReason == DLL_PROCESS_ATTACH)
    {
        MessageBoxA(NULL,"Connected","DLL",MB_OK);
        HMODULE hmodule;
        if((hmodule=GetModuleHandle(NULL))!=NULL)
        {
            std::thread t(hello);
            t.join();  
        }
    }
}
вот с таким кодом тупо зависает.


MessageBoxA(NULL,"Connected","DLL",MB_OK);
Этот мсж выдает?
Без t.join(); зависает?

И еще попробуй свернуть все окна и развернуть зависшее - мб месжбокс тупо под окном приложения прячется. (было такое на c# в паре проектов)

Ну и в догонку: чем компилировал? зависимости собрал в одну dll или динамические?

82K
28 августа 2012 года
Starkmen
6 / / 20.08.2012
Цитата: arrjj
Цитата: Starkmen
Собственно код:

Код:
#include "Windows.h"
#include <thread>

void hello()
{
    MessageBoxA(NULL,"HELLO","HELLO",64);
}

BOOL WINAPI DllMain(HINSTANCE DLL,DWORD fdwReason,LPVOID lpvReserved)
{
    if(fdwReason == DLL_PROCESS_ATTACH)
    {
        MessageBoxA(NULL,"Connected","DLL",MB_OK);
        HMODULE hmodule;
        if((hmodule=GetModuleHandle(NULL))!=NULL)
        {
            std::thread t(hello);
            t.join();  
        }
    }
}
вот с таким кодом тупо зависает.


MessageBoxA(NULL,"Connected","DLL",MB_OK);
Этот мсж выдает?
Без t.join(); зависает?

И еще попробуй свернуть все окна и развернуть зависшее - мб месжбокс тупо под окном приложения прячется. (было такое на c# в паре проектов)

Ну и в догонку: чем компилировал? зависимости собрал в одну dll или динамические?



MessageBoxA(NULL,"Connected","DLL",MB_OK); выдает сообщение об успешном Injection, собственно void hello нужно запустить в параллельном потоке. Да, виснет даже без джойна. И я это пробовал не только на одной целевой программе, но и на других. Все равно виснет.
Компилировал в VC++, зависимости в моей dll, которую инжектю

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог