IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Чтение/запись в памяти приложения на Delphi (http://www.imho.ws/showthread.php?t=87763)

Crow2k 17.06.2005 23:15

Чтение/запись в памяти приложения на Delphi
 
Выручайте неопытного. Задача: написать программу с целью изменения данных в адресе памяти другого приложения или попросту редактора памяти.
Допустим, нужное значение находится по адресу $001695A0, программа должна преобразовать его в текст и вывести.
Всем кто откликнется, буду благодарен.

knight 18.06.2005 03:15

Предлагаю решение :внедрить DLL в чужое адресное пространство пример на эту тему можно посмотреть у Джеффри Рихтера "Программирование под Windows для профессионалов"
или вот по этому адресу есть статья с примерами

http://codeproject.com/threads/winspy.asp

J. Bond 23.06.2005 14:57

Если охота сделать без DLL. То можно использовать функции ReadProcessMemory/WriteProcessMemory

alexey_ma 23.06.2005 16:14

Вот абсолютно рабочая функция получающая текст активного таба в чужом процессе . Правда на С++, но механизм , я думаю понятен.
Код:

//---------------------------------------------------------------------------------
//                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;
}
// -----------------------------------------------------


Crow2k 23.06.2005 16:17

Цитата:

Сообщение от J. Bond
Если охота сделать без DLL. То можно использовать функции ReadProcessMemory/WriteProcessMemory

Ясно, а как же его внедрить?

alexey_ma 23.06.2005 17:34

Так написал же уже.
Порядок такой :
Сначала нужно получить хендл процесса. Eсли известен хендл какого либо окна этого процесса то функция GetWindowThreadProcessId вернёт processID . Открываем по этому ID процесс и получаем хендл процесса - hProcess.
hProcess = OpenProcess( PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, ProcessId)

И читаем по адресу
ReadProcessMemory(hProcess,адрес с которого читаем ,буфер куда читаем, сколько нужно прочитать байт, количество прочитанных байт);

Пишем аналогично (только осторожно чтобы не
завалить апликацию)
WriteProcessMemory(hProcess, адресс по которому пишем, адрес того что пишем, сколько байт хотим записать,сколько на самом деле записали)

Все функции - WindowsAPI, так-что в делфи проблем быть не должно ;)

chesnok 27.06.2005 19:42

alexey_ma
Только нужно добавить, что если мы пишем в чужой процесс, неплохо было бы перед этим сделать VirtualAllocEx в нём, дабы не завалить его.
rtfm

alexey_ma 27.06.2005 20:23

Не, судя по вопросу, он хочет изменить данные по определенному адресу, в этом случае аллокацию делать не нужно, но почти наверняка завалим процесс.
Кстати в коде который я привел выше есть вызов VirtualAllocEx


Часовой пояс GMT +4, время: 12:07.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.