| imho.ws |
![]() |
|
|
|
# 1 |
|
Newbie
Регистрация: 07.05.2005
Сообщения: 32
![]() |
Чтение/запись в памяти приложения на Delphi
Выручайте неопытного. Задача: написать программу с целью изменения данных в адресе памяти другого приложения или попросту редактора памяти.
Допустим, нужное значение находится по адресу $001695A0, программа должна преобразовать его в текст и вывести. Всем кто откликнется, буду благодарен. |
|
|
|
|
# 2 |
|
Junior Member
Регистрация: 12.09.2004
Сообщения: 106
![]() ![]() |
Предлагаю решение :внедрить DLL в чужое адресное пространство пример на эту тему можно посмотреть у Джеффри Рихтера "Программирование под Windows для профессионалов"
или вот по этому адресу есть статья с примерами http://codeproject.com/threads/winspy.asp |
|
|
|
|
# 4 |
|
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
![]() ![]() |
Вот абсолютно рабочая функция получающая текст активного таба в чужом процессе . Правда на С++, но механизм , я думаю понятен.
Код:
//---------------------------------------------------------------------------------
// GetActiveTabText
//---------------------------------------------------------------------------------
// This function return the text(caption) of active page
// in the tabcontrol window, that it get.
//---------------------------------------------------------------------------------
typedef LPVOID (__stdcall * PFNVIRTALLEX)(HANDLE, LPVOID, DWORD, DWORD,DWORD);
CString GetActiveTabText(HWND hWnd)
{
DWORD dwProcessId;
HANDLE hProcess;
PFNVIRTALLEX pfnVirtualAllocEx;
TC_ITEM *ptci;
TC_ITEM tci;
CString Text;
int TabSelected;
char Buffer[255] = "\n";
TabSelected = TabCtrl_GetCurSel(hWnd);
GetWindowThreadProcessId(hWnd, &dwProcessId);
hProcess = OpenProcess( PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwProcessId);
if (hProcess == NULL)
{
MessageBox(NULL,"Could not communicate with process","", MB_OK | MB_ICONWARNING);
return "";//0;
}
/// Allocate memory in the remote process's address space
//get procAddress this way so the code can be compiled on win 95/98
pfnVirtualAllocEx = (PFNVIRTALLEX) GetProcAddress(GetModuleHandle("KERNEL32.DLL"),"VirtualAllocEx");
ptci = (TC_ITEM*) pfnVirtualAllocEx(hProcess, NULL, sizeof(TC_ITEM)+25, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
tci.mask = TCIF_TEXT;
tci.pszText = (LPTSTR) (ptci + 1) ;
tci.cchTextMax = 25;
// Write the local TC_ITEM structure to the remote memory block
WriteProcessMemory(hProcess, ptci, &tci, sizeof(tci), NULL);
TabCtrl_GetItem(hWnd,TabSelected ,ptci);
// Read the remote text string into the end of our clipboard buffer
ReadProcessMemory(hProcess, ptci + 1,Buffer, 24, NULL);
// Free the memory in the remote process's address space
VirtualFreeEx(hProcess, ptci, 0, MEM_RELEASE);
CloseHandle(hProcess);
Text = Buffer;
return Text;
}
// -----------------------------------------------------
__________________
Best Regards |
|
|
|
|
# 6 |
|
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
![]() ![]() |
Так написал же уже.
Порядок такой : Сначала нужно получить хендл процесса. Eсли известен хендл какого либо окна этого процесса то функция GetWindowThreadProcessId вернёт processID . Открываем по этому ID процесс и получаем хендл процесса - hProcess. hProcess = OpenProcess( PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, ProcessId) И читаем по адресу ReadProcessMemory(hProcess,адрес с которого читаем ,буфер куда читаем, сколько нужно прочитать байт, количество прочитанных байт); Пишем аналогично (только осторожно чтобы не завалить апликацию) WriteProcessMemory(hProcess, адресс по которому пишем, адрес того что пишем, сколько байт хотим записать,сколько на самом деле записали) Все функции - WindowsAPI, так-что в делфи проблем быть не должно
__________________
Best Regards |
|
|
|
|
# 7 |
|
Member
Регистрация: 01.01.2004
Адрес: Воронеж, Россия
Сообщения: 206
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
alexey_ma
Только нужно добавить, что если мы пишем в чужой процесс, неплохо было бы перед этим сделать VirtualAllocEx в нём, дабы не завалить его. rtfm
__________________
<SPEEDing|VoNK> you cant use knoppix as a server can you? <bob> why not? people use windows as one. |
|
|
|
|
# 8 |
|
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
![]() ![]() |
Не, судя по вопросу, он хочет изменить данные по определенному адресу, в этом случае аллокацию делать не нужно, но почти наверняка завалим процесс.
Кстати в коде который я привел выше есть вызов VirtualAllocEx
__________________
Best Regards |
|
|