Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > дамп памяти процесса


Автор: александр1 26.10.2009, 22:22
здравствуйте! хотелось бы узнать с помощью какой утилиты можно снать дамп памяти конкретного системного процесса, или как это реализовать самому программно (с помощью функции MiniDumpWriteDump пробовал, на мобайле не катит)

Автор: smoke_man 27.10.2009, 08:55
Читает 20 байт памяти текущего процесса:
Код

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <windows.h>

int main()
{
    HANDLE hProcess = GetCurrentProcess();
    SIZE_T readbyte = 0;
    unsigned char *buffer = new unsigned char[20];
    int start = 0x00411172;
    ReadProcessMemory(hProcess,(void *)start,buffer,20,&readbyte);
    for(int i = 0; i< readbyte;i++)
        printf("%x\n",buffer[i]);
    std::cout<<std::endl;
    delete [] buffer;
    system("pause");
    return EXIT_SUCCESS;
}


Добавлено через 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
Для текущего процесса можно так:
Код

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <windows.h>

int main()
{
    int start;
    __asm{ 
        call blabla 
blabla: 
        mov eax, [esp] 
        mov start, eax 
        sub esp, 4 
    }
    HANDLE hProcess = GetCurrentProcess();
    SIZE_T readbyte = 0;
    unsigned char *buffer = new unsigned char[20];
    //int start = 0x00411172;
    ReadProcessMemory(hProcess,(void *)start,buffer,20,&readbyte);
    for(int i = 0; i< readbyte;i++)
        printf("%x\n",buffer[i]);
    std::cout<<std::endl;
    delete [] buffer;
    system("pause");
    return EXIT_SUCCESS;

}

Автор: bra1ny 29.10.2009, 15:00
Из PEB можно узнать. 


Код

nt!_PEB
   +0x000 InheritedAddressSpace : UChar
   +0x001 ReadImageFileExecOptions : UChar
   +0x002 BeingDebugged    : UChar
   +0x003 SpareBool        : UChar
   +0x004 Mutant           : Ptr32 Void
   +0x008 ImageBaseAddress : Ptr32 Void
....
...
....

Автор: александр1 29.10.2009, 22:23
немножко несовсем понял можно поподробней?)) а разве нет каких нибудь апи функции для этого?

int start;
    __asm{ 
        call blabla 
blabla: 
        mov eax, [esp] 
        mov start, eax 
        sub esp, 4 
    }
это вариант не работает smile 

Автор: 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.

Автор: александр1 29.10.2009, 23:47
Цитата(smoke_man @  29.10.2009,  23:37 Найти цитируемый пост)
А насчет CreateRemoteThread нужно посмотреть в sdk на wm6 - поддерживается она платформой или нет

 как посмотреть (извиняюсь за тупые вопросы) smile 

Автор: 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
Код

PROCESSENTRY32 pe32;
pH = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
Process32First(pH,&pe32);

pM = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe32.th32ProcessID);
MODULEENTRY32 mo = {sizeof(mo)};
Module32First(pM,&mo);


 SIZE_T readbyte = 0;
 unsigned char *buffer = new unsigned char[_MAX_PATH];
 HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
 HMODULE hMod = NULL;
 MODULEINFO modinfo;
 hMod=mo.hModule;
 GetModuleInformation
               (hProc,        
                      hMod,         
                      &modinfo,  
                      sizeof(MODULEINFO)           
                      );
PBYTE pBuffer = new BYTE[modinfo.SizeOfImage];                        
ReadProcessMemory(hProc, modinfo.lpBaseOfDll, buffer, modinfo.SizeOfImage, &readbyte);

for(int i = 0; i<readbyte;i++)
fprintf(r,"%X ",buffer[i]);



пробую так, результат: readbyte =0 ----> функция ReadProcessMemory возвращает False ----> значит функция работает с областью памяти которая не относится к данному процессу. опять что-то не то smile 

Автор: 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
хорошая прога, и дезасемблирует сразу)

Код

_armdis_dump (stdout, ins, 52);


меняю первый параметр stdout на "dump.txt" и она дамп записывает в txt файл
3й параметр - сколь бит считывать памяти. увеличиваю его и программа дальше дампит

но вот почему она именно с адресса 1802FBD0 начинает дампить, и можно ли изменить точку старта не разберусь(
подскажите smile 

Автор: smoke_man 30.10.2009, 22:08
Если бегло пробежаться по коду, то можно понять что он начинает дампить от функции main, а выше только старт CRT и загрузка библиотек . Если есть IDA, то посмотри что из себя представляет твоя программа для лучшего понимания. Кстати, адрес не будет   всегда одинаковым. Для того, чтобы понять как он расчитывается нужно разобраться как работает функция setup_fib_jit данного проекта, а так же что из себя представляет архитектура ARM. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)