Показать сообщение отдельно
Старый 19.02.2015, 10:21   #1
urban81
Писатель
Доп. информация
По умолчанию KIA SORENTO 2013 NEW ГУ AV310DMDG.S

Есть ГУ с WinCE 6.0 (MIPSII) и приложение Х, которое работает с портами. Надо снять лог, что приложение считывает с портов и что пишет в них. С возможностью потом динамически преобразовывать информацию в нужную. Сделать таким способом подсоединиться к процессу приложения X, добавить свою ДЛЛ к процессу в которой буду перехватывать API CreateFileW, ReadFile и WriteFile и с помощью переопределения этих функци буду писать лог…Переопределённые функции ReadFilXXX и WriteFileXXX должны иметь возможность менять размер массива байт (считанный или который хочем записать), а также сам массив байт.

Добавлено через 34 минуты
Всем здравствуйте.Так вот длл не инжектится к приложению X !!! УТОЧНЯЮ: Не работает PerformCallBack4! Какой алтернативный способ? После шага
HINSTANCE hInst = ( HINSTANCE ) PerformCallBack4 ( &ci ); - ERROR_SHARING_VIOLATION и hInst выдаёт unused = CXX0030: ошибка: не удается вычислить значение выражения.Пробовал другой способ но там в одном из мест после memcpy(p, &Code, sizeof(DWORD) * 9);-ERROR_SHARING_VIOLATION.Как правильно подсоединять ДЛЛ к процессу приложения Х?
Заранее благодарю. Функция способа №1 вот:
Код:
 void Inject9 ( void )
{
	DWORD Err = 0;
	BOOL bMode = SetKMode ( TRUE );
	printf( "SetKMode (%d).\n", GetLastError() );
	DWORD dwPerm = SetProcPermissions ( 0xFFFFFFFF );
	printf( "SetProcPermissions (%d).\n", GetLastError() );
	HANDLE targetProcessHandle = GetProcessHandle ( szApplication );//get handle
	printf( "GetProcessHandle (%d).\n", GetLastError() );
	if ( targetProcessHandle )
	{ 
		void *Ptr = MapPtrToProcess( L"Urban81Dll.dll", GetCurrentProcess ( ) );
		printf( "MapPtrToProcess (%d).\n", GetLastError() );
		CALLBACKINFO ci;
		ci.hProc = targetProcessHandle;
		void *t = GetProcAddress ( GetModuleHandle ( L"coredll.dll" ), L"LoadLibraryW" );
		printf( "GetProcAddress (%d).\n", GetLastError() );
		ci.pfn = ( FARPROC ) MapPtrToProcess ( t, targetProcessHandle );
		printf( "MapPtrToProcess (%d).\n", GetLastError() );
		ci.pvArg0 = Ptr;
		HINSTANCE hInst = ( HINSTANCE ) PerformCallBack4 ( &ci, 0, 0 , 0 );
		printf( "PerformCallBack4 (%d).\n", GetLastError() );
		FARPROC pHook = GetProcAddress ( hInst, (LPWSTR ) 1 );
		printf( "GetProcAddress (%d).\n", GetLastError() );
		ci.hProc = targetProcessHandle;
		ci.pfn = ( FARPROC ) MapPtrToProcess( pHook , targetProcessHandle );
		printf( "MapPtrToProcess (%d).\n", GetLastError() );
		ci.pvArg0 = targetProcessHandle;
		DWORD dw = PerformCallBack4 ( &ci );
		printf( "PerformCallBack4 (%d).\n", GetLastError() );
		CloseHandle ( targetProcessHandle );
	}
}
Функции способа №2 вот:
Код:
HMODULE LoadRemoteLibrary(HANDLE hProcess, HANDLE hThread, LPCTSTR FileName)
{
	HMODULE hModule;
	void* pSrc;
	void* pDst;
	DWORD* p;
	DWORD Code[9] = {
		0xe92d5fff,	//stmdb       sp!, {r0 - r12, lr}
		0xe59f4024,	//ldr         r4, [pc, #0x24]
		0xe59f001c,	//ldr         r0, [pc, #0x1C]
		0xe1a0e00f,	//mov         lr, pc
		0xe1a0f004,	//mov         pc, r4
		0xe58f000c,	//str         r0, [pc, #0xC]
		0xe8bd5fff,	//ldmia       sp!, {r0 - r12, lr}
		0xe58ff000,	//str         pc, [pc]
		0xeafffffe
//		0x00000000,	//*pbDone
//		0x00000000,	//hModule
//		0x00000000,	//&FileName
//		0x00000000,	//&LoadLibrary()
//		0x00000000,	//FileName[0]
	};
	BOOL* pbDone;
	HMODULE* phModule;
	CONTEXT Context;
	CONTEXT NewContext;
	hModule = NULL;
	if(pSrc = VirtualAlloc(NULL, 65536, MEM_COMMIT, PAGE_EXECUTE_READWRITE))
	{
		printf( "VirtualAlloc - (%d).\n", GetLastError() );
		if(pDst = VirtualAllocEx(hProcess, NULL, 65536, MEM_COMMIT, PAGE_EXECUTE_READWRITE))
		{
			printf( "VirtualAllocEx - (%d).\n", GetLastError() );
			p = (DWORD*)pSrc;
			memcpy(p, &Code, sizeof(DWORD) * 9);
			printf( "memcpy - (%d).\n", GetLastError() );
			p += 9;
			*p = (DWORD)FALSE;
			pbDone = (BOOL*)p;
			p++;
			phModule = (HMODULE*)p;
			p++;
			*p = (DWORD)pDst + sizeof(DWORD) * (9 + 4);
			p++;
#ifdef UNICODE
			*p = (DWORD)GetProcAddress(LoadLibrary(_T("coredll.dll")), _T("LoadLibraryW"));
			printf( "GetProcAddress - (%d).\n", GetLastError() );
#else
			*p = (DWORD)GetProcAddress(LoadLibrary(_T("coredll.dll")), _T("LoadLibrary"));
#endif
			p++;
			_tcscpy((TCHAR*)p, FileName);
			if(WriteProcessMemory(hProcess, pDst, pSrc, 65536, NULL))
			{
				printf( "WriteProcessMemory - (%d).\n", GetLastError() );
				while(true)
				{
					SuspendThread(hThread);
					Context.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
					GetThreadContext(hThread, &Context);
					if(Context.Pc < 0x40000000)
					{
						NewContext = Context;
						NewContext.Pc = (ULONG)pDst;
						SetThreadContext(hThread, &NewContext);
						break;
					}
					ResumeThread(hThread);
					Sleep(10);
				}
				ResumeThread(hThread);
				while(!(*pbDone))
				{
					ReadProcessMemory(hProcess, pDst, pSrc, 65536, NULL);
					Sleep(10);
				}
				hModule = *phModule;
				SuspendThread(hThread);
				SetThreadContext(hThread, &Context);
				ResumeThread(hThread);
			}
			VirtualFreeEx(hProcess, pSrc, 65536, MEM_DECOMMIT);
		}
		VirtualFree(pSrc, 65536, MEM_DECOMMIT);
	}
	return hModule;
}
urban81 вне форума  
 
Время генерации страницы 0.03186 секунды с 11 запросами