@xuvohocan

Проблема с выполнением заинжекченого DLL?

Есть код в нем используются MinHook бибилиотеки. После инжекта возникает такая ситуация когда dll выполняется и сразу закрывается т.е. выводится сообщение (в даном случае) Return true и до хука функции и записи даных дело не доходит. Кто-то знает в чем дело? Вот листинг
// dllmain.cpp: определяет точку входа для приложения DLL.
#include "stdafx.h"
#include <Windows.h>
#include "MinHook.h"
#include "WinInet.h"
#include <fstream>

using namespace std;

typedef int (WINAPI *HttpOpeRequest)(HINTERNET hConnect, LPCWSTR lpszVerb, LPCWSTR lpszObjectName,
	LPCWSTR lpszVersion, LPCWSTR lpszReferrer, LPCWSTR FAR * lplpszAcceptTypes, DWORD dwFlags, DWORD_PTR dwContext);

HttpOpeRequest tHttpOpenRequest = NULL;

void wrightFunck(HINTERNET, LPCWSTR, LPCWSTR ,
	LPCWSTR, LPCWSTR, LPCWSTR FAR *, DWORD, DWORD_PTR);

int WINAPI fHttpOpenRequestW(HINTERNET hConnect, LPCWSTR lpszVerb, LPCWSTR lpszObjectName,
	LPCWSTR lpszVersion, LPCWSTR lpszReferrer, LPCWSTR FAR * lplpszAcceptTypes, DWORD dwFlags, DWORD_PTR dwContext)
{
	wrightFunck(hConnect, lpszVerb, lpszObjectName, lpszVersion,
		lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext);
	return tHttpOpenRequest(hConnect, lpszVerb, lpszObjectName,
		lpszVersion, lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext);
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{

	switch (ul_reason_for_call)
	{
		while (DLL_PROCESS_ATTACH)
		{
		
	case DLL_PROCESS_ATTACH:
		if (MH_Initialize() != MH_OK)
		{
			return 1;
		}
		if (MH_CreateHook(&HttpOpenRequest, &fHttpOpenRequestW,
			reinterpret_cast<void**>(&tHttpOpenRequest)) != MH_OK)
		{
			return 1;
		}
		if (MH_EnableHook(&HttpOpenRequest) != MH_OK)
		{
			return 1;
		}
	}
	}
	MessageBox(NULL, (const wchar_t*)L"return TRUE", (const wchar_t*)L"All right", MB_OK);
	return TRUE;
}

void wrightFunck(HINTERNET hConnect, LPCWSTR lpszVerb, LPCWSTR lpszObjectName,
	LPCWSTR lpszVersion, LPCWSTR lpszReferrer, LPCWSTR FAR * lplpszAcceptTypes, DWORD dwFlags, DWORD_PTR dwContext)
{
	MessageBox(NULL, (const wchar_t*)L"Wright fuck fucking go!!!", (const wchar_t*)L"All right", MB_OK);
	ofstream output("C:\\Data.txt", ios::out || ios::app);
	if (lpszVerb == (LPCWSTR) "POST")
	{
	
	output << hConnect << "\t" << lpszVerb << "\t" << lpszObjectName << "\t"
		<< lpszVersion << "\t" << lpszReferrer << "\t"
		<< lplpszAcceptTypes << "\t" << dwContext
		<< "\n";
	}
	output.close();
}
  • Вопрос задан
  • 2658 просмотров
Решения вопроса 1
@Einherjar
Что значит dll "сразу закрывается"? Dll не может "сразу закрыться", она выгружается только тогда когда процесс ее сам выгрузит. Вы сразу же получаете DllMain с параметром DLL_PROCESS_DETACH или что? Если вы уже убрали этот корявый цикл то сообщение "return TRUE" вы должны получить сразу, все верно. А до хука с записью данных дело дойдет только когда ваш процесс вызовет HttpOpenRequestW, если конечно все указанные функции по установке хука отработали нормально. DllMain не должна работать в каких либо циклах как WinMain, она вызывается при загрузке - все что надо проинициализировали там, и завершается, и при выгрузке - там освободили все ресурсы, и тоже завершается. Dll со всеми данными и кодом между этими двумя событиями продолжает висеть в памяти процесса.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
У вас что-то странное (бесконечный цикл) задесь написано:
while (DLL_PROCESS_ATTACH)
что вы имели в виду?
Ответ написан
TrueBers
@TrueBers
Гуглю за еду
Не знаю, что за бредовый код вы привели, но типичной ошибкой немедленной выгрузки DLL после загрузки является забывчивость брякнуть case-условие после выборки DLL_PROCESS_ATTACH или DLL_THREAD_ATTACH::
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
	break;
case DLL_THREAD_ATTACH:
	break;
case DLL_THREAD_DETACH:
	break;
case DLL_PROCESS_DETACH:
	break;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы