Считать кусок данных с чужой программе

Тема в разделе "WASM.SOFTWARE", создана пользователем 13nik13, 17 сен 2007.

  1. 13nik13

    13nik13 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    35
    Необходимо считать таблицу с чужой программы. Не знаю с какой стороны подъехать. Помогите!
    Интересны: Исходники, информация на заданную тему, ссылки
     
  2. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    ReadProcessMemory ?
     
  3. 13nik13

    13nik13 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    35
    Можно попросить чуть более развернуто отвечать?
    Какой язык? Или не важно?
    Как напасть на нужную таблицу и НУЖНЫЕ ЯЧЕЙКИ, очень важно!
     
  4. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    13nik13 Это WinAPI )

    BOOL ReadProcessMemory(
    HANDLE hProcess,
    LPCVOID lpBaseAddress, //адрес откуда будеш читать
    LPVOID lpBuffer, //адрес куда будешь читать
    SIZE_T nSize,
    SIZE_T* lpNumberOfBytesRead
    );

    А вообще, гугл должен помочь
     
  5. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    13nik13
    Если ты грид собрался читать, то есть свои трудности. Для начала проверь не виртуальный ли это грид. В виртуальноми гриде строки не хранятся в памяти как у обыкновенного, а просто отрисовываются на конву. В таком случае прочитать их можно только путём разреверсивания метода onDrowCell и выяснения способа организации данных. В обыкновенном гриде тебе в принципе никто не мешает прочитать данные. Для этого тебе нужно будет узнать как организованы объекты в памяти приложения. Как правило, исходники гридов есть в стандартных библиотеках.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    что понимаешь под таблицей?
     
  7. 13nik13

    13nik13 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    35
    Думается прога написана на дельфи или с buider
    И скорее всего табличка унаследована от ее компонентов
    Насчет виртуальной таблички: я этого тоже боюсь. Но все таки эти данные гдето ДОЛЖНЫ хранитться, ибо по этим данным строится график
     
  8. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Хех. Отладчик в зубы и вперед. :)
    Я бы попробовал сначала поставить бряк на TextOut и TabbedTextOut,а дальше надо смотреть как раполагаются адреса выводимых строк.
    На основании полученных данных уже принимать решение о дальнейшем ходе действий
     
  9. 13nik13

    13nik13 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    35
    Я - новичок. Какой отладчик посоветуешь? TextOut - функция из NTDLL.dll?
     
  10. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    кхг... я чуть со стула не упал! :)

    бери в руки OllyDbg (это и есть отладчик) и копай. softice не трогай - только запутаешься ещё больше.
     
  11. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Бери сисер и капай. С теми двумя ещё болше гемора. Если навешан прот на прогу.
     
  12. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    13nik13
    TextOut и TabbedTextOut это функции из библиотеки Gdi32.dll. Они хорошо документированы и найти по ним информацию сможешь легко в инете. В качестве отладчика лучше используй OllyDbg. Файл действительно может быть запакован именно поэтому ставить бряки нужно непосредственно на сами функции в библиотеках.

    Делается это следующим образом загружаешь свою прогу в OllyDbg дальше щелкаешь по коду правой кнопкой мыши и выбираешь пункт Search For->Name in All modules. В появившемся списке находишь пункт, к примеру, GDI32.TextOutA Щелкаешь на нем правой кнопкой мыши и выбираешь пункт Follow import in Disassembler после этого ты оказываешься внутри Gdi32.dll на первом байте функции TextOutA. Ставишь на нем, например, аппаратный бряк. (Правой кнопкой мыши на коде затем Breakpoints->Hardware on execution) и запускаешь программу. Программа будет у тебя останавливаться как только будет вызываться эта функция. Причем независимо от того навешан на прогу протектор или нет.

    По параметрам можешь определить какой текст она собирается рисовать. Если понял, что попал на необходимый Grid, то можешь, например, выписать отдельно адреса выводимых буферов. Если Grid простой, то адреса будут располагаться последовательно в памяти. И тогда уже можно воспользоваться ReadProcessMemory из своей программы.

    Если Grid виртуальный и для отображения ряда ячеек используется один и тот же буфер памяти, то при в точке останова esp будет указывать на адрес возврата в код, который эту функцию вызывает. Только думается мне, что до этого скорее всего дело недойдет.
     
  13. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    13nik13
    У компонента StringGrid, к примеру, есть property Cells. Из этой информации можно достать указатель на данные, в нем хранящиеся.
     
  14. 13nik13

    13nik13 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    35
    Как натравить отладчик на Cell`сы???
     
  15. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    13nik13
    Собственно, к тому что сказал k3internal, я вряд-ли что могу добавить. Изучай программу на предмет организации данных. Можешь мне прислать экзешник на предмет оказания содействия. (Мыло - через личку).
     
  16. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Miller Rabin
    5 баллов!!!!
     
  17. 13nik13

    13nik13 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    35
    bool __stdcall EnumChild(HWND hWind, LPARAM lParam)
    {
    SendMessage(hWind, WM_GETTEXT, sizeof(buf), (LPARAM) (PCOPYDATASTRUCT)buf);
    GetClassName(hWind, buf2, sizeof(buf2));
    if (AnsiString(buf2)=="TDBGrid")
    {
    hStrGrd=hWind;
    frmMain->Memo1->Lines->Add("**************************************");
    frmMain->Memo1->Lines->Add("Указатель на таблицу: " + IntToStr(int)hStrGrd)));
    frmMain->Memo1->Lines->Add("**************************************");
    bool flag = EnableDebugPrivilege(true);
    frmMain->onClickLabel(flag);
    int b = 0x00DA8ABC;//адрес первый из четырех
    double buffer;
    ZeroMemory(&buffer,4);
    ULONG PID, dwReaded;
    HWND hProc;
    bool q = GetWindowThreadProcessId((ULONG*)hWind, (ULONG*)PID);
    hProc = OpenProcess(PROCESS_VM_READ, False, PID);
    ReadProcessMemory(hProc, (HWND)b, &buffer, 4, &dwReaded);
    ShowMessage( CurrToStr(buffer)+ "\n" + IntToStr(dwReaded));
    flag = EnableDebugPrivilege(false);
    frmMain->onClickLabel(!flag);
    frmMain->Memo1->Lines->Add("Указатель на данные: " + IntToStr((int)buffer));
    }
    return true;
    Не читает она заданный адрес. Не могу понять почему? Помогите!!! Причем указатели на таблицу и главное окно есть. А толку? =(