· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› InMemory patcher для X-treme-protected программ

<< . 1 . 2 .

Посл.отвђт Сообщенiе


Дата: Фев 27, 2004 12:18:16 · Поправил: Безпощадный даос

Эх, ребята !
Так вы и не понимаете.
Мы "буксуем" из-за того, что каждый тянет одеяло на себя. Поэтому мы так и будем прозябать...Каждый хочеть здесь найти ответы и знания ничего не давая взамен. Или я не прав.

dragon, ты крут. Спасибо. Я уже понял это. ты прав - прога перехватывает все API вызовы и корректирует их.... Только как - я не понял.

Предлагаю следующий механизм. Только я в C++ не волоку - помогите:
//--------------------------------------------------------------------   -------
/*	Project:	ModuleInjection
/*	Date:		20.12.2003
//--------------------------------------------------------------------   -----*/
#include <windows.h>
#include <direct.h>
#include <stdio.h>
//--------------------------------------------------------------------   -------
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	// - грузим DLL с хуком
	HINSTANCE hDLL = LoadLibrary((LPCTSTR)"hookdll.dll");
	if(hDLL == NULL) return -1;

	// - получаем функцию инсталляции хука
	void (*InstallHook)() = (void (*)())GetProcAddress(hDLL, "InstallHook");
	if(!InstallHook) return -1;

	// - получаем функцию деинсталляции хука
	void (*UninstallHook)() = (void (*)())GetProcAddress(hDLL, "UninstallHook");
	if(!UninstallHook) return -1;

	// - инсталлируем хук
	InstallHook();
	
	// - ждем некоторое время для успешного внедрения
	Sleep(1000);

	// - деинсталлируем хук
	UninstallHook();

	return 0;
}
//--------------------------------------------------------------------   -------



//--------------------------------------------------------------------   -------
/*	Project:	ModuleInjection
/*	Date:		20.12.2003
//--------------------------------------------------------------------   -----*/
#include <windows.h>
#include <direct.h>
#include <stdio.h>
#include <tlhelp32.h>
//--------------------------------------------------------------------   ----------------------------------
// - имя главного модуля целевого процесса (без расширения)
const char* TargetProgramName = "Explorer";
char InjectedModuleName[_MAX_PATH+1];
//--------------------------------------------------------------------   ----------------------------------
HHOOK MyHook = NULL; 
HANDLE hMod = NULL;
//--------------------------------------------------------------------   ----------------------------------
// - функция, в которой будет происходить вся работа во внедренном модуле
//--------------------------------------------------------------------   ----------------------------------
DWORD WINAPI InjectedProc(LPVOID lpParameter)
{
	while(1)
	{
		Sleep(100);
		#define ISKEYDOWN(k) (GetKeyState(k) & 0x8000)
		if(ISKEYDOWN(VK_LSHIFT) && ISKEYDOWN(VK_RSHIFT))
		{
			// - покажем наличие своего присутствия
			char buf[128];
			sprintf(buf, "c:\\%u.!!!", GetTickCount());
			FILE* out = fopen(buf, "w+b");
			fprintf(out, "Hello!\n");
			fclose(out);
		}
	}
	return 0;
}
//--------------------------------------------------------------------   ----------------------------------
bool TryToInject(void)
{
	// - получаем имя главного модуля текущего процесса (например, explorer.exe с путем)
	char SelfName[_MAX_PATH+1];
	GetModuleFileName(GetModuleHandle(NULL), SelfName, _MAX_PATH);
	
	char drive[_MAX_DRIVE];
	char dir[_MAX_DIR];
	char fname[_MAX_FNAME];
	char ext[_MAX_EXT];

	// - вычленим имя файла и расширение
	_splitpath(SelfName, drive, dir, fname, ext);

	// - сравниваем имя ехешника текущего процесса с искомым
	if(stricmp(fname, TargetProgramName) == 0 && stricmp(ext, ".exe") == 0)
	{
		// - выставим флаг наличия повторной загрузки модуля
		HANDLE hMutex = CreateMutex(NULL, FALSE, "_vjqrhenjqventrclkzdytlhtybz_");

		// - грузим свой модуль с новым именем для внедрения в адресное пространство процесса
		HINSTANCE hInstDLL = LoadLibrary((LPCTSTR)InjectedModuleName);
		if(hInstDLL == NULL) return false;

		ReleaseMutex(hMutex);
		CloseHandle(hMutex);

		// - получаем функцию для выполнения в загруженном модуле
		typedef DWORD (WINAPI *MYPROC)(LPVOID);
		MYPROC fptr = (MYPROC)GetProcAddress(hInstDLL, "InjectedProc");
		if(!fptr) return false;

		// - создаем новый поток в текущем процессе-носителе
		DWORD dwThreadId;
		HANDLE hThread = CreateThread(NULL, 0, fptr, NULL, 0, &dwThreadId);
		if(hThread == NULL) return false;
		return true;
	}
	return false;
}
//--------------------------------------------------------------------   ----------------------------------
BOOL APIENTRY DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
{
	// Perform actions based on the reason for calling.
   switch(fdwReason)	{ 
		case DLL_PROCESS_ATTACH:
		{
			// - получим имя внедряемого модуля
			GetModuleFileName((HMODULE)hModule, InjectedModuleName, _MAX_PATH);
			// - проверка наличия флага повторной загрузки
			HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "_vjqrhenjqventrclkzdytlhtybz_");
			if(hMutex == NULL)
			{
				// - пробуем внедриться
				TryToInject();
			}
			else
			{
				// - закроем хендл
				CloseHandle(hMutex);
				hMutex = NULL;
			}
			hMod = hModule;
			break;
		}
      case DLL_THREAD_ATTACH:
			// Do thread-specific initialization.
         break;
      case DLL_THREAD_DETACH:
			// Do thread-specific cleanup.
         break;
		case DLL_PROCESS_DETACH:
			// Perform any necessary cleanup.
         break;
	}
   return TRUE;
}
//--------------------------------------------------------------------   ----------------------------------
LRESULT CALLBACK MyHookHandler(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
	return CallNextHookEx(MyHook, nCode, wParam, lParam); 
} 
//--------------------------------------------------------------------   ----------------------------------
void __stdcall InstallHook(void)
{
	// - инсталлируем хук
	MyHook = SetWindowsHookEx(WH_GETMESSAGE, MyHookHandler, (HINSTANCE)hMod, 0); 
}
//--------------------------------------------------------------------   ----------------------------------
void __stdcall UninstallHook(void)
{
	// - деинсталлируем хук
	UnhookWindowsHookEx(MyHook);
}
//--------------------------------------------------------------------   ----------------------------------

предлагаю патчер разместить отдельным потоком, который мы вливаем в основной процесс.
Только помощь нужна - накодить это дело кто смогёт.

Объединяться надо и долбить эти защиты. И не жмотничать.

А PID я определяю, юзая системное расширение оснастки в Task Manager в W2003 Standart Ed.


Дата: Фев 29, 2004 08:09:27

Кстати хэндл не обязательно через OpenProcess получать, можно
ведь и через CreateProcess, в связи с чем вопрос, кто-нибудь пробовал
загрузить шпрот через лоадер?


Дата: Мар 3, 2004 18:47:32 · Поправил: Baron Gede

мне трейнер нужно написать а не лоадер.
Я люблю ломать всеми способами, а тут я стеснён вроде как.
Ладно. Забейте. Считайте тему закрытой...

PS Надеюсь ваш форум больше не будут DDOS-ить...


Дата: Мар 3, 2004 21:27:50

Просто запуская файл через CreateProcess ты получишь хэндл и тогда уже не нужен будет OpenProcess ;-)

А вобще лучше всё-таки шпрот распаковать, а то он глючит, у меня например на 98-й не хочет запускаться.

> Надеюсь ваш форум больше не будут DDOS-ить...

Надеюсь...


Дата: Мар 3, 2004 21:46:24

Ну и как и его распаковывать предлагаешь? Сегодня посмотрел, крадёт байты с OEP, IAT отсутствует, похоже на ASProtect 1.3, про SoftIce лучше вообще забыть, даже отладиться нечем, не то, чтобы распаковать..


Дата: Мар 3, 2004 22:04:59

[ dragon: даже отладиться нечем]

А что под Olly он не идёт, тоже что-ли ребутится?


Дата: Мар 3, 2004 22:19:13

Нет, просто там необрабатываемое исключение(Debugger was unable process exception, что-то в этом роде).

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.107