Есть ГУ с 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;
}