Перейти к содержанию

Поток DLL не "поточится"


RockHammer

Рекомендуемые сообщения

Собираю конструктор из кусков кода. 
В принципе, сам код я понимаю (его смысл, структуру и цель прибытия на эту планету) - но не студию.

Написал код. И почему-то главный поток не хочет запускатся! (главный поток DLL)

 

Код:

Первые симптомы появились, когда я написал появление консольки... Но она не запустилась.

Решил хакнуть блокнот (мама ама криминал) и вызвал memcpy чтобы просто изменить значение через байты. (защиты на памяти - нет)

Ничего не произошло. Инжектил кодеровским инжектором. Плюс - сторонним (малоли).

Кодировка - мультик.

Зы: незнаю, могло ли это повлять на студию (на нее все может повлиять... и погода, и твое настроение) - но я сменил тему оформления студии на темную.

#include <Windows.h>#include <fcntl.h>#include <stdio.h>#include <io.h>#include <conio.h>#include <Psapi.h>#pragma comment (lib, "psapi.lib")DWORD WINAPI GameHacking_thread(LPVOID);void CreateConsole();DWORD APIENTRY DllMain(HMODULE hModule, DWORD ul_reason, LPVOID lpReserved){	if (ul_reason = DLL_PROCESS_ATTACH)	{		CreateThread(NULL, NULL, GameHacking_thread, NULL, NULL, NULL);		CreateConsole();	}}MODULEINFO GetModuleData(char* module_name){	MODULEINFO moduleInf = { 0 };	HMODULE hModule = GetModuleHandle(module_name);	if (hModule == NULL)		return moduleInf;	GetModuleInformation(GetCurrentProcess(), hModule, &moduleInf, sizeof(MODULEINFO));	return moduleInf;}bool DataCompare(const BYTE* pData, const BYTE* patern, const char* mask){	for (; *mask; ++mask, ++pData, ++patern)		if (*mask == 'x' && *pData != *patern)			return false;	return (*mask) == NULL;}DWORD FindPattern(DWORD start_address, DWORD length, BYTE* pattern, char *mask){	for (DWORD i = 0; i < length; i++)		if (DataCompare((BYTE*)(start_address + i), pattern, mask))			return (DWORD)(start_address + i);	return NULL;}void CreateConsole(){	int hConHandle = 0;	HANDLE lStdHandle = 0;	FILE *fp = 0;	AllocConsole();	SetConsoleTitle("Loader");	lStdHandle = GetStdHandle(STD_OUTPUT_HANDLE);	hConHandle = _open_osfhandle(PtrToUlong(lStdHandle), _O_TEXT);	fp = _fdopen(hConHandle, "w");	*stdout = *fp;	setvbuf(stdout, NULL, _IONBF, 0);}int* ReadPointer(DWORD base, int offsets[], int level){	int* pointer = (int*)base;	for (int i = 0; i < level; i++)	{		pointer = (int*)(*pointer + offsets[i]);		//printf you poiner	}	return pointer;}DWORD WINAPI GameHacking_thread(LPVOID){	CreateConsole();	printf("sdfhduiy89ydfg");	DWORD oldProtect = 0;	memcpy((void*)0x002A1520, (PBYTE)"\x32\x00\x00\x00", 4);	/*int addr = 0x0F67C226;	int size = 3;	char ByteForEquip[] = "\x90\x90\x90";	VirtualProtect((void*)addr, (size_t)size, PAGE_EXECUTE_READWRITE, &oldProtect);	memcpy((void*)addr, (PBYTE)ByteForEquip, size);	VirtualProtect((void*)addr, (size_t)size, oldProtect, &oldProtect);*/	return true;} 
Ссылка на комментарий
Поделиться на другие сайты

DllMain должна вернуть 1, в противном случае - Dll выгружается.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583.aspx (внимательно прочитай про Return Value).

Ссылка на комментарий
Поделиться на другие сайты

DllMain должна вернуть 1, в противном случае - Dll выгружается.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583.aspx (внимательно прочитай про Return Value).

Казалось бы - 10 символов кода... А могут решить продуктивность остальных 1000-1500.

Ссылка на комментарий
Поделиться на другие сайты

Мне интересно, как оно у тебя вообще скомпилировалось, если DllMain ничего не возвращает. Для чего, кстати, тебе потоки понадобились? CreateThread, насколько я помню, в последний свой аргумент при вызове возвращает идентификатор потока, а сама фунция - хэндл. Во-первых, с этими данными можно управлять потоком(-ами), а во-вторых - проверить, корректно ли он(и) запустились.

Ссылка на комментарий
Поделиться на другие сайты

Мне интересно, как оно у тебя вообще скомпилировалось, если DllMain ничего не возвращает. Для чего, кстати, тебе потоки понадобились? CreateThread, насколько я помню, в последний свой аргумент при вызове возвращает идентификатор потока, а сама фунция - хэндл. Во-первых, с этими данными можно управлять потоком(-ами), а во-вторых - проверить, корректно ли он(и) запустились.

Нуу... По сути, эта шляпа сейчас и не работает. Через раз работает. Память не изменяет, хоть и DllMain возвращает ноль.

С потоками я и не работаю, я создаю главный поток при инжекте либа в процесс, и туда все запихиваю, что нужно.

А нужен мне один поток - изменение памяти. Который уже раписан. 

Что нужно сделать, чтобы дллка работала?

Ссылка на комментарий
Поделиться на другие сайты

DllMain должна возвращать 1

Возвращает. Но дллка тем не менее работает через раз (адреса не всегда изменяет и консолька не открывается)

Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.