Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2012, 11:00   #31
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Да прочитай ты уже про эти функции

Ну вроде как ТС надежды подает, я так честно не верил, что он справится с моей подачи ...

Вот накропал, в пианиста не стрелять...
Код:
#include <windows.h>
#include <psapi.h>

#pragma comment (lib, "psapi")

int _stdcall WinMain(HINSTANCE, HINSTANCE, TCHAR*, int)
{
	// инжектировать длл в процесс, которому принадлежит окно класса NOTEPAD
	TCHAR dllname[] ="D:\\DE\\COMHOOK\\Debug\\COMHOOK.dll";
	HWND hwnd = FindWindow(TEXT("NOTEPAD"),NULL);
	// ---
	if (!hwnd)
		return 0;
	
	// ---
	DWORD pid = 0;
	GetWindowThreadProcessId(hwnd, &pid);
	if (!pid)
		return 0;
	
	// ---
	DWORD stl = PROCESS_VM_READ|PROCESS_QUERY_INFORMATION|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE;
	HANDLE hProcess = OpenProcess(stl, FALSE, pid);
	if (!hProcess) 
		return 0;

	// ---
	size_t sz = lstrlen(dllname) + 1;
	LPVOID path = VirtualAllocEx(hProcess, NULL, sz, MEM_COMMIT, PAGE_READWRITE);
	if (FALSE == WriteProcessMemory(hProcess, path, dllname, sz,(SIZE_T*) &sz))
		return CloseHandle(hProcess);
	
	// ---
	TCHAR* LLWA = (sizeof(TCHAR)== 1) ? TEXT("LoadLibraryA") : TEXT("LoadLibraryW");
	FARPROC pLL = GetProcAddress(GetModuleHandle(TEXT("Kernel32")),LLWA);
	HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,(LPTHREAD_START_ROUTINE)pLL, path, 0, NULL);
	if (!hThread)
	{
		 VirtualFreeEx(hProcess,path, sz, MEM_RELEASE);
		return CloseHandle(hProcess);
	}
	// ---
	WaitForSingleObject(hThread,INFINITE);


	// FREE ------------------------------------------------------------------------
	VirtualFreeEx(hProcess, path, sz, MEM_RELEASE);
	FARPROC pFL = GetProcAddress(GetModuleHandle(TEXT("Kernel32")),TEXT("FreeLibrary"));
	// --- 
	const int ar = 1024;
	HMODULE hndls[ar] = {}; 
	TCHAR modname[MAX_PATH];

	DWORD dwneed;
	if (EnumProcessModules(hProcess, hndls, ar * sizeof(HMODULE), &dwneed))
	{
		for (int i = 0 ; i < dwneed/sizeof(HMODULE) ; i++)
		{
			GetModuleFileNameEx(hProcess, hndls[i], modname, MAX_PATH);
			if (0 == lstrcmp(modname, dllname))
			{
				HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,(LPTHREAD_START_ROUTINE)pFL, hndls[i], 0, NULL);
				WaitForSingleObject(hThread, INFINITE);
				CloseHandle(hThread);
				break;
			}
		}
	}
	CloseHandle(hProcess);
	return 0;
}

Последний раз редактировалось EUGY; 06.05.2012 в 11:07.
EUGY вне форума Ответить с цитированием
Старый 06.05.2012, 11:37   #32
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

HMODULE dll'ки возвращает LoadLibrary. После CreateRemoteThread надо WaitForSingleObject'ом подождать завершения потока, тогда через GetExitCodeThread можно получить этот хэндл.
Somebody вне форума Ответить с цитированием
Старый 06.05.2012, 11:42   #33
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Конечно можно и даже легче.
Но, вот например, если инжектируется в одном процессе, а снимать нужно в другом...
EUGY вне форума Ответить с цитированием
Старый 06.05.2012, 12:13   #34
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от yuran666666 Посмотреть сообщение
Да прочитай ты уже про эти функции они помимо хендлов много информации возвращают. То что ты делаешь не самообучением называется, а наглым попрошайничеством.
вам-то, видать, весело понтоваться, если вы уже всё знаете такие как вы считают себя хозяевами мира.
это прямо как в анекдоте
[SPOILER=Анекдот]
Возле забора стоит Жираф и с умным лицом смотрит куда-то вдаль.
Подходит Жирафёнок и смотрит на Жирафа, пытаясь тоже заглянуть за забор.
После нескольких неудачных попыток, он спрашивает у Жирафа: - "Жираф, Жираф! А куда ты смотришь?".
Жираф без эмоций ему отвечает: - "Куда-то.".
Жирафёнок пошевелил ушами, и, не поняв логики, обходит Жирафа и снова спрашивает: - "Жираф, Жираф! А что там?".
Жираф ему отвечает: - "Много чего...".
Жирафёнок пошевелил ушами, пытаясь найти логику. Обошел Жирафа и спрашивает: - "Жираф, Жираф! А что ты видишь?".
Жираф в ответ: "Вырастишь, сам увидишь.".
Жирафёнок, обрадовался, запрыгал и спрашивает: - "Жираф, Жираф! А когда я выра...".
Жираф поворачивает голову к Жирафёнку и обрывает его: - "Тссссс! А то самое интересное просмотрим!".
[/SPOILER]
Цитата:
Сообщение от EUGY Посмотреть сообщение

Ну вроде как ТС надежды подает, я так честно не верил, что он справится с моей подачи ...
да принцип работы я почти сразу понял
я только не могу понять, как в переменную типа HMODULE может вернуться массив хэндлов и как потом их перебрать.
из вашего исходника, я вижу, что вы указываете размер массива ar * sizeof(HMODULE). А я указывал просто sizeof(HMODULE). Ошибка? Если да, то почему? Где про это читать?
У меня в массиве возвращалась куча нулей. А почему?
пишу в яндексе "enumprocessmodules возвращает кучу нулей". Сейчас кто-то словил "ха-ха".
чтобы не гадать, решил спросить у МАСТЕРОВ. А в ответ снова "ищи, читай, учись лучше". WTF?
P.S. Сейчас временно решил проблему с помощью функций из модуля TlHelp32. DLL вроде стала выгружаться. Заодно, узнал, как можно смотреть, какие DLL загружены в процессе. Опять же - не спросил бы одно, не узнал бы это.
EUGY, спасибо. Изучу ваш исходник и сравню, что именно я не так делал с EnumProcessModules. Хоть не на Delphi, но всё-же нагляднее, чем никак.

Последний раз редактировалось BLACK_RAIN; 06.05.2012 в 12:19.
BLACK_RAIN вне форума Ответить с цитированием
Старый 06.05.2012, 12:33   #35
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Somebody предложил для Вашего случая способ на порядок проще.
Цитата:
А я указывал просто sizeof(HMODULE). Ошибка? Если да, то почему? Где про это читать?
Ну что, в мсдн прямо английским-по-белому написано:
Цитата:
BOOL EnumProcessModules(
HANDLE hProcess, // handle to process
HMODULE *lphModule, // array of module handles
DWORD cb, // Specifies the size, in bytes, of the lphModule array.
LPDWORD lpcbNeeded // number of bytes required
);
EUGY вне форума Ответить с цитированием
Старый 06.05.2012, 13:18   #36
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

А SizeOf это разве не в байтах?
http://www.delphibasics.ru/SizeOf.php
я так и указывал.
const int ar = 1024;
HMODULE hndls[ar] = {};
а в Делфи это:
Код:
var
hm : array [0..1024] of hmodule;
правильно же???

Последний раз редактировалось BLACK_RAIN; 06.05.2012 в 13:26.
BLACK_RAIN вне форума Ответить с цитированием
Старый 06.05.2012, 13:28   #37
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
А SizeOf это разве не в байтах?
Наверно в байтах, но только размер одного элемента.
По сути надо задать массив HMODULE из 1024 (вообщем заведомо больше, чем может быть загруженных модулей в жертве)
И передать адрес первого (нулевого) элемента массива и размер всего массива в байтах.
Функция заполнит весь массив, точнее ту его часть, которую будет способна заполнить, и в последнем параметре вернет количество заполненных байт.
EUGY вне форума Ответить с цитированием
Старый 06.05.2012, 13:34   #38
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
И передать адрес первого (нулевого) элемента массива и размер всего массива в байтах.
ну вот. Теперь, кажется, всё понятно.
BLACK_RAIN вне форума Ответить с цитированием
Старый 06.05.2012, 14:40   #39
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
ну вот. Теперь, кажется, всё понятно.
Ну и слава богу. Вот сделать еще мысленное усилие и загрузить вместо длл собственный экзешник.
В нем прописать
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
// SetTimer(....)
return 0;
}
И вызвать как удаленный поток.
Конечно ретрограды будут кричать, мол невозможно, релоки, секции и все такое...
Возможно. Правильно к делу подойти.
EUGY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Таймер SetTimer и глюки с ним Jugger Win Api 2 09.03.2012 20:21
Settimer в winx64 не работает, рушит Excel?! budda999 Microsoft Office Excel 9 07.01.2012 13:43
Отследить изменение курсора в чужих окнах Lime Общие вопросы Delphi 2 02.07.2009 19:17
SetTimer, KillTimer NeiL Win Api 5 05.03.2008 07:37