| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > дамп памяти процесса |
| Автор: александр1 26.10.2009, 22:22 |
| здравствуйте! хотелось бы узнать с помощью какой утилиты можно снать дамп памяти конкретного системного процесса, или как это реализовать самому программно (с помощью функции MiniDumpWriteDump пробовал, на мобайле не катит) |
| Автор: smoke_man 27.10.2009, 08:55 | ||
Читает 20 байт памяти текущего процесса:
Добавлено через 1 минуту и 36 секунд на WM не проверял - но попробывать можно. |
| Автор: DrHex 27.10.2009, 12:04 | ||
Надо повышать своему процессу привелегии.... Лучше всего через ring-0 |
| Автор: александр1 28.10.2009, 19:40 |
| smoke_man спасибо, именно то что нужно было, 1 вопрос только: как получить начальный адресс процесса у вас он сразу задан int start = 0x00411172; |
| Автор: smoke_man 28.10.2009, 23:54 | ||
Для текущего процесса можно так:
|
| Автор: bra1ny 29.10.2009, 15:00 | ||
Из PEB можно узнать.
|
| Автор: александр1 29.10.2009, 22:23 |
| немножко несовсем понял можно поподробней?)) а разве нет каких нибудь апи функции для этого? int start; __asm{ call blabla blabla: mov eax, [esp] mov start, eax sub esp, 4 } это вариант не работает |
| Автор: smoke_man 29.10.2009, 23:13 |
| ты его на wm6 использовал? |
| Автор: александр1 29.10.2009, 23:21 |
| на эмуляторе проверял нашел на одном сайте такой способ: I. Открываем процесс // Открываем процесс (DWORD dwProcessId - идентификатор процесса) HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId); II. Получаем HMODULE процесса Для дальнейшей работы необходим этот идентификатор. Для Своего процесса его можно легко получить с помощью GetModuleHandle(NULL). Как показывает практика он и для других процессов такой же, даже более того он похоже всегда равен 0x00400000, но для надежности следует его получать правильно. А правильно его можно получить с помощью одного выкрутаса // получаем HMODULE HMODULE hMod = NULL; HANDLE hThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)GetModuleHandle, NULL, 0, NULL); WaitForSingleObject(hThread, INFINITE); GetExitCodeThread(hThread, (LPDWORD)&hMod); CloseHandle(hThread); Здесь в другом процессе создается поток который предстовляет собой апишную функцию GetModuleHandle, к счастью параметры его совпадают с параметрами LPTHREAD_START_ROUTINE а адреса таких функций во всех процессах находятся по одним и тем-же адресам, так что вызов её произойдет без особых проблем. III. Читаем память Здесь уже может быть куча вариатнов работы. Самое простое воспользоваться функцией из библиотеки PSAPI - GetModuleInformation. Правда для этого в VC 6.0 нужнор последнее SDK или грузить функцию напрямую из psapi.dll. Как с этим обстоят дела в Делфи - незнаю. Вот пример - // Получаем стартовый адрес и размер MODULEINFO modinfo; GetModuleInformation(hProc, // handle to process hMod, // handle to module &modinfo, // information buffer sizeof(MODULEINFO) // size of buffer ); // Создаем буфер и читаем туда =) PBYTE pBuffer = new BYTE[modinfo.SizeOfImage]; ReadProcessMemory(hProc, modinfo.lpBaseOfDll, pBuffer, modinfo.SizeOfImage, &dwReaded); Но хоть убей что не делаю, функцию CreateRemoteThread не распознает компилятор Oo |
| Автор: smoke_man 29.10.2009, 23:37 |
| Ну на wm6 этот код работать конечно не будет - но можно сделать по аналогии - разница в том что у тебя WM крутится под арм-контроллером. У него несколько другая архитектура и ассемблер тоже. А насчет CreateRemoteThread нужно посмотреть в sdk на wm6 - поддерживается она платформой или нет. Насчет PEB тоже можно посмотреть в sdk. |
| Автор: smoke_man 29.10.2009, 23:53 |
| ты какую среду используешь для WM6? Кстати, PEB тоже не попользуешь. |
| Автор: александр1 29.10.2009, 23:57 |
| Visual Studio 2008 |
| Автор: smoke_man 30.10.2009, 00:08 |
| Windows Mobile 6 SDK установлен? |
| Автор: александр1 30.10.2009, 00:09 |
| да, установлен |
| Автор: smoke_man 30.10.2009, 00:14 |
| Тогда с ним же должен был постаивтся msdn под платформу wm6 - Windows Mobile SDK Help. В нем все поодерживающиеся функции описаны для данной платформы. |
| Автор: smoke_man 30.10.2009, 00:35 |
| Посмотри вот эту функцию - GetModuleInformation - думаю она поможет. |
| Автор: александр1 30.10.2009, 00:35 |
| нда CreateRemoteThread я там не обнаружил. есть еще 1 способ без использования ее(еслипринять hMod = modinfo.lpBaseOfDll): HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId); MEMORY_BASIC_INFORMATION mbi; VirtualQueryEx(hProc, (LPCVOID)hMod, &mbi, sizeof(MEMORY_BASIC_INFORMATION)); // Выделяем память и читаем PBYTE pBuffer = new BYTE[mbi.RegionSize]; ReadProcessMemory(hProc, mbi.BaseAddress, pBuffer, mbi.RegionSize, &dwReaded); но в это случае не видет функцию VirtualQueryEx, хотя ее я в SDK нашел http://www.radikal.ru |
| Автор: smoke_man 30.10.2009, 00:44 |
| Хотя вру...эта функция не подойдет. Добавлено через 1 минуту и 29 секунд Подойдет, тока если ,например, подгружаешь библиотеки. |
| Автор: александр1 30.10.2009, 01:12 | ||
пробую так, результат: readbyte =0 ----> функция ReadProcessMemory возвращает False ----> значит функция работает с областью памяти которая не относится к данному процессу. опять что-то не то |
| Автор: smoke_man 30.10.2009, 01:14 |
| Держи исходник. Взят http://www.codeproject.com/KB/mobile/ARMJitCE.aspx. Пересобрал под 2008 студию. Архив исправлен. |
| Автор: smoke_man 30.10.2009, 01:15 |
| Думаю это то, что нужно! |
| Автор: александр1 30.10.2009, 01:17 |
| спасибо smoke_man ))) *ушел разбираться* |
| Автор: smoke_man 30.10.2009, 01:19 |
| Не за что! |
| Автор: александр1 30.10.2009, 01:25 |
| блин, не открывает проект, выдает: http://www.radikal.ru а потом http://www.radikal.ru |
| Автор: smoke_man 30.10.2009, 01:34 |
| Исправил. |
| Автор: александр1 30.10.2009, 01:42 |
| работет) завтра отпишусь) |
| Автор: александр1 30.10.2009, 20:15 | ||
хорошая прога, и дезасемблирует сразу)
меняю первый параметр stdout на "dump.txt" и она дамп записывает в txt файл 3й параметр - сколь бит считывать памяти. увеличиваю его и программа дальше дампит но вот почему она именно с адресса 1802FBD0 начинает дампить, и можно ли изменить точку старта не разберусь( подскажите |
| Автор: smoke_man 30.10.2009, 22:08 |
| Если бегло пробежаться по коду, то можно понять что он начинает дампить от функции main, а выше только старт CRT и загрузка библиотек . Если есть IDA, то посмотри что из себя представляет твоя программа для лучшего понимания. Кстати, адрес не будет всегда одинаковым. Для того, чтобы понять как он расчитывается нужно разобраться как работает функция setup_fib_jit данного проекта, а так же что из себя представляет архитектура ARM. |