Необходимо считать таблицу с чужой программы. Не знаю с какой стороны подъехать. Помогите! Интересны: Исходники, информация на заданную тему, ссылки
Можно попросить чуть более развернуто отвечать? Какой язык? Или не важно? Как напасть на нужную таблицу и НУЖНЫЕ ЯЧЕЙКИ, очень важно!
13nik13 Это WinAPI ) BOOL ReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, //адрес откуда будеш читать LPVOID lpBuffer, //адрес куда будешь читать SIZE_T nSize, SIZE_T* lpNumberOfBytesRead ); А вообще, гугл должен помочь
13nik13 Если ты грид собрался читать, то есть свои трудности. Для начала проверь не виртуальный ли это грид. В виртуальноми гриде строки не хранятся в памяти как у обыкновенного, а просто отрисовываются на конву. В таком случае прочитать их можно только путём разреверсивания метода onDrowCell и выяснения способа организации данных. В обыкновенном гриде тебе в принципе никто не мешает прочитать данные. Для этого тебе нужно будет узнать как организованы объекты в памяти приложения. Как правило, исходники гридов есть в стандартных библиотеках.
Думается прога написана на дельфи или с buider И скорее всего табличка унаследована от ее компонентов Насчет виртуальной таблички: я этого тоже боюсь. Но все таки эти данные гдето ДОЛЖНЫ хранитться, ибо по этим данным строится график
Хех. Отладчик в зубы и вперед. Я бы попробовал сначала поставить бряк на TextOut и TabbedTextOut,а дальше надо смотреть как раполагаются адреса выводимых строк. На основании полученных данных уже принимать решение о дальнейшем ходе действий
кхг... я чуть со стула не упал! бери в руки OllyDbg (это и есть отладчик) и копай. softice не трогай - только запутаешься ещё больше.
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 будет указывать на адрес возврата в код, который эту функцию вызывает. Только думается мне, что до этого скорее всего дело недойдет.
13nik13 У компонента StringGrid, к примеру, есть property Cells. Из этой информации можно достать указатель на данные, в нем хранящиеся.
13nik13 Собственно, к тому что сказал k3internal, я вряд-ли что могу добавить. Изучай программу на предмет организации данных. Можешь мне прислать экзешник на предмет оказания содействия. (Мыло - через личку).
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; Не читает она заданный адрес. Не могу понять почему? Помогите!!! Причем указатели на таблицу и главное окно есть. А толку? =(