![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
F0b0S |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 12.10.2004 Репутация: нет Всего: нет |
Отцы помогите пожалуйста рашить проблему
![]() проблема заключается в следующем: есть файл1на жестком диске. есть программа1 которая работает с этим файлом. нужно: 1. отлавить обращение этой программы к файлу1 2. тормознуть программу1 3. загрузить файлв1память 4. выполнить некотрые действия с ним 5. подсунуть данные файла1 (находящиеся в памяти) этой прогорамме, не сохраняя данные файла1 на диск 6. возобновить работу прграммы1 Очень буду признателен любым советам... Программа работает с файлом только в режиме ReadOnly. |
|||
|
||||
Step |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: нет Всего: 25 |
точно не скажу... но советую поискать доку по перехвату функци winapi и перехватывать открытие файла... можно конечно и прогу в реалтайме бомбить, но геморно
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
<Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: нет Всего: 64 |
Да, как уже сказал Step, тебе нужно в реалтайме попасть в адресное пространство целевого процесса(например, при помощи хуков) и там перехватывать вызов CreateFile.
Это сообщение отредактировал(а) <Spawn> - 13.10.2004, 11:51 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
F0b0S |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 12.10.2004 Репутация: нет Всего: нет |
![]() Рализовывал хуки на перехват глобальных сообщений ОС, но некогда не пробывал перехватить конкретные сообщения конкретной программы... Если есть такая возможность, дайте какие - нибудь ссылки на документацию по этому вопросу, либо, если не сложно, скиньте мне их на почту [email protected] |
|||
|
||||
Step |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: нет Всего: 25 |
F0b0S, по сути это вопросы системного программирования, которое почемуто в нашем форуме не развиваеться, специалистов такого уровня маловато....
покачто вам придеться искать решения самим... да можно залезть в память процесса с помощью хука далее нужно найти все вызовы функции перевести их на свои обработать их по своиму... вообщем вам нужно искать... -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
F0b0S |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 12.10.2004 Репутация: нет Всего: нет |
Вся задача сводится к перенаправлению запросов программы к файлу в память.... Вся проблема - это сделать перенаправление.....
Добавлено @ 14:15 Step, читая сообщения форума, я уже заметил, что вопросы низкоуровневого программирования здесь почти не обсуждаются.... Добавлено @ 14:20 Step По поводу риалтаймого доступа к самой программе, пробывал, на уровне ассемблера, но здесь загвоздка - поскольку я не знаю структуры работы программы, при молейшем перехвате контроля программа вываливалась с ошибкой, поэтому я сделал вывод, что единственным вариантом является - работа на уровне сообщений системы.... |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 2 Всего: 164 |
Сделаешь - расскажи плз как
![]() Одно из моих бредовизмов - сделать защищеный файл и ловить access-denied. --------------------
|
|||
|
||||
Step |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: нет Всего: 25 |
F0b0S, за щот сообщений винды твой модуль может прикрепиться к приложению а там у него почти все в руках...
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
0bs3rv3r |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 16.10.2004 Репутация: 1 Всего: 1 |
Недавно писал прогу, которая к мультилекс конектится и выдирает переводы
Вот код длл которая внедряется в нужный процесс:
вызывается это дело так:
далее так (уже в длл)
а сюды оно обратится
вторая половина не моя[s] Это сообщение отредактировал(а) 0bs3rv3r - 16.10.2004, 19:50 |
||||||||
|
|||||||||
0bs3rv3r |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 16.10.2004 Репутация: 1 Всего: 1 |
чуть не забыл к проджекту нужно еще .def добавить вида
LIBRARY "LexProbe" EXPORTS DummyHook |
|||
|
||||
menkaur |
|
|||
Unregistered |
Следующий класс позволяет заменить в адресном пространстве любого процесса системное api на твое собственное:
class KPEFile { PIMAGE_DOS_HEADER pDOSHeader; PIMAGE_NT_HEADERS pNTHeader; public: const char * pModule; const char * RVA2Ptr(unsigned rva) { if ( (pModule!=NULL) && rva ) return pModule + rva; else return NULL; } KPEFile(HMODULE hModule); const void * GetDirectory(int id); PIMAGE_IMPORT_DESCRIPTOR GetImportDescriptor(LPCSTR pDllName); const unsigned * GetFunctionPtr(PIMAGE_IMPORT_DESCRIPTOR pImport, LPCSTR pProcName); FARPROC SetImportAddress(LPCSTR pDllName, LPCSTR pProcName, FARPROC pNewProc); FARPROC SetExportAddress(LPCSTR pProcName, FARPROC pNewProc); }; --------------------------------------------------------------------------------------------------------------------------------------------------- #define STRICT #define WIN32_LEAN_AND_MEAN #include <windows.h> #include "pehack.h" KPEFile::KPEFile(HMODULE hModule) { pModule = (const char *) hModule; if ( IsBadReadPtr(pModule, sizeof(IMAGE_DOS_HEADER)) ) { pDOSHeader = NULL; pNTHeader = NULL; } else { pDOSHeader = (PIMAGE_DOS_HEADER) pModule; if ( IsBadReadPtr(RVA2Ptr(pDOSHeader->e_lfanew), sizeof(IMAGE_NT_HEADERS)) ) pNTHeader = NULL; else pNTHeader = (PIMAGE_NT_HEADERS) RVA2Ptr(pDOSHeader-> e_lfanew); } } // returns address of a PE directory const void * KPEFile::GetDirectory(int id) { return RVA2Ptr(pNTHeader->OptionalHeader.DataDirectory[id]. VirtualAddress); } // returns PIMAGE_IMPORT_DESCRIPTOR for an imported module PIMAGE_IMPORT_DESCRIPTOR KPEFile::GetImportDescriptor( LPCSTR pDllName) { // first IMAGE_IMPORT_DESCRIPTOR PIMAGE_IMPORT_DESCRIPTOR pImport = (PIMAGE_IMPORT_DESCRIPTOR) GetDirectory(IMAGE_DIRECTORY_ENTRY_IMPORT); if ( pImport==NULL ) return NULL; while ( pImport->FirstThunk ) { if ( stricmp(pDllName, RVA2Ptr(pImport->Name))==0 ) return pImport; // move to next imported module pImport ++; } return NULL; } // returns address of __imp__xxx variable for an import function const unsigned * KPEFile::GetFunctionPtr( PIMAGE_IMPORT_DESCRIPTOR pImport, LPCSTR pProcName) { PIMAGE_THUNK_DATA pThunk; pThunk = (PIMAGE_THUNK_DATA) RVA2Ptr(pImport-> OriginalFirstThunk); for (int i=0; pThunk->u1.Function; i++) { bool match; if ( pThunk->u1.Ordinal & 0x80000000 ) // by ordinal match = (pThunk->u1.Ordinal & 0xFFFF) == ((DWORD) pProcName); else match = stricmp(pProcName, RVA2Ptr((unsigned) pThunk->u1.AddressOfData)+2) == 0; if ( match ) return (unsigned *) RVA2Ptr(pImport->FirstThunk)+i; pThunk ++; } return NULL; } BOOL HackWriteProcessMemory(HANDLE hProcess, void * pDest, void * pSource, DWORD nSize, DWORD * pWritten) { __try { memcpy(pDest, pSource, nSize); } __except ( EXCEPTION_EXECUTE_HANDLER ) { __try { MEMORY_BASIC_INFORMATION mbi; VirtualQuery(pDest, & mbi, sizeof(mbi)); VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_READWRITE, & mbi.Protect); memcpy(pDest, pSource, nSize); } __except ( EXCEPTION_EXECUTE_HANDLER ) { return FALSE; } } * pWritten = nSize; return TRUE; } FARPROC KPEFile::SetImportAddress(LPCSTR pDllName, LPCSTR pProcName, FARPROC pNewProc) { PIMAGE_IMPORT_DESCRIPTOR pImport = GetImportDescriptor(pDllName); if ( pImport ) { const unsigned * pfn = GetFunctionPtr(pImport, pProcName); if ( IsBadReadPtr(pfn, sizeof(DWORD)) ) return NULL; // read the original function address FARPROC oldproc = (FARPROC) * pfn; DWORD dwWritten; // overwrite with new function address HackWriteProcessMemory(GetCurrentProcess(), (void *) pfn, & pNewProc, sizeof(DWORD), & dwWritten); return oldproc; } else return NULL; } FARPROC KPEFile::SetExportAddress(LPCSTR pProcName, FARPROC pNewProc) { PIMAGE_EXPORT_DIRECTORY pExport = (PIMAGE_EXPORT_DIRECTORY) GetDirectory(IMAGE_DIRECTORY_ENTRY_EXPORT); if ( pExport==NULL ) return NULL; unsigned ord = 0; if ( (unsigned) pProcName < 0xFFFF ) // ordinal ? ord = (unsigned) pProcName; else { const DWORD * pNames = (const DWORD *) RVA2Ptr(pExport->AddressOfNames); const WORD * pOrds = (const WORD *) RVA2Ptr(pExport->AddressOfNameOrdinals); // find the entry with the function name for (unsigned i=0; i<pExport->AddressOfNames; i++) if ( stricmp(pProcName, RVA2Ptr(pNames[i]))==0 ) { // get the corresponding ordinal ord = pExport->Base + pOrds[i]; break; } } if ( (ord<pExport->Base) || (ord>pExport->NumberOfFunctions) ) return NULL; // use ordinal to get the address where export RVA is stored DWORD * pRVA = (DWORD *) RVA2Ptr(pExport->AddressOfFunctions) + ord - pExport->Base; // read original function address DWORD rslt = * pRVA; DWORD dwWritten = 0; DWORD newRVA = (DWORD) pNewProc - (DWORD) pModule; HackWriteProcessMemory(GetCurrentProcess(), pRVA, & newRVA, sizeof(DWORD), & dwWritten); return (FARPROC) RVA2Ptr(rslt); } ----------------------------------------------------------------------------------------------------------------------------------------------------- Вот, как это работает на деле: #define STRICT #define WIN32_LEAN_AND_MEAN #include <windows.h> #include "..\..\include\pehack.h" int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR pText, LPCSTR pCaption, UINT uType) { WCHAR wText[MAX_PATH]; WCHAR wCaption[MAX_PATH]; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pText, -1, wText, MAX_PATH); wcscat(wText, L" - intercepted"); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pCaption, -1, wCaption, MAX_PATH); wcscat(wCaption, L" - intercepted"); return MessageBoxW(hWnd, wText, wCaption, uType); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { { KPEFile pe(hInstance); pe.SetImportAddress("user32.dll", "MessageBoxA", (FARPROC) MyMessageBoxA); MessageBoxA(NULL, "Test", "SetImportAddress", MB_OK); } HMODULE hUser = GetModuleHandle("user32.dll"); KPEFile user32(hUser); FARPROC oldproc = GetProcAddress(hUser, "MessageBoxA"); user32.SetExportAddress("MessageBoxA", (FARPROC) MyMessageBoxA); FARPROC newproc = GetProcAddress(hUser, "MessageBoxA"); char temp[64]; wsprintf(temp, "GetProcAddress(MessageBoxA)\n" "changes from %x to %x", oldproc, newproc); MessageBoxA(NULL, temp, "SetExportAddress", MB_OK); return 0; } Для внедрения можеш использовать hooks, но мне нравится следующий способ: HKLM\Software\Microsoft\Windows NT\Current Version\Windows\AppInit_DLLs Сюда нужно записать полный путь к твоей dll. После етого система автоматически будет внедрять ее в каждый новый процесс. Заменять адреса я можна в DllMain. Приятных развлечений! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |