Сейчас на форуме: ut2004, vsv1 (+6 невидимых)

 eXeL@B —› Вопросы новичков —› как ломать exel
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 21 июля 2006 23:05
· Личное сообщение · #1

Привет всем.
Вот теперь у меня еще и такой вопрос назрел.

Как получить доступ к ячейкам exelя?
Если послать сообщение нажатия мышки в конкретную точку окна я могу (и выделится соответствующая ячейка), то слать текст в какую-то ячейку, а тем более считывать из ячейки я не знаю как.

Пробовал WM_GETTEXT - не помогает

Только обязательно нужно обойтись средствами winapi. Я знаю, что для каждой проги бывают свои средства. Например, для IE это функция ShellExecute

Но дело в том, что такие вот "неадресуемые" ячейки встречаются не только в exel, и что делать с ними - совершенно не ясно.

PS Заранее извиняюсь, если была такая тема. Дайте тогда ссылку, плиз.
Вроде поиск поюзал, но не нашел ничего удобоваримого.




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 21 июля 2006 23:24
· Личное сообщение · #2

Хм, а зачем ломать Excel? Может быть ты хочешь что-то с таблицей делать - тогда встоенные VBA-средства тебе в руки.



Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 21 июля 2006 23:32
· Личное сообщение · #3

Неее, VBA - эт понятно.
Есть другие, похожие проги, на которых есть куча всяких активных элементов: поля ввода, комбобоксы, такая же сетка, кнопки, и все это не обнаруживается шпионом spy++(и другими)

Но если на кнопки можно нажать, то считать информацию или записать ее в ячейку я не знаю как.



Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 21 июля 2006 23:46
· Личное сообщение · #4

Ну напишите кто-нить, плиз, индивидуальный ли тут подход к каждой проге или есть общие методы или функции api для работы с ячейками или комбобоксами (на запись/считывание текста).

Я ж этого не найду нигде в инете!




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 22 июля 2006 00:01
· Личное сообщение · #5

Что есть такое "ячейка"? Для комбобоксов юзаются SendMessage, всё как обычно.



Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 22 июля 2006 00:08 · Поправил: Obsession
· Личное сообщение · #6

Не, ну понимаешь, для стандартных комбобоксов - да, SendMessage
Но если spy++ выделяет только главное основное окно, а все остальное, что на нем есть - не выделяет.
Что тогда делать?

Ячейка - это я имел в виду как раз exeleвские ячейки. Те, что в VBA называются .Cells(,)

Вот, я все-таки выковырял в инете похожую проблему.
prog-gate.pp.ru/fido7.ru.programming.languages/1365.html
Именно "копнуть поглубже" туда, в окно.
Но там к сожалению не написано решение.

На других сайтах для exelя все предлагают кучу каких-то драйверов.
Нет ли какого-то общего решения?



Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 22 июля 2006 00:55
· Личное сообщение · #7

Кстати, что такое su.win32.prog?



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 22 июля 2006 01:28 · Поправил: Demon666
· Личное сообщение · #8

Obsession
Я что-то не пойму, тебе данные программой spy++ надо вытащить из ячейки или ты свою программу делаешь для выполнения этого действия?

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 22 июля 2006 01:40
· Личное сообщение · #9

Ну, да, я делаю программу для выполнения этого действия, но я не смогу этого сделать, если spy++ не может, т.к. я не могу получить данные окон внутри большого окна.

Я проверял другими прогами на наличие дочерних окон - их просто нет.



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 22 июля 2006 01:48
· Личное сообщение · #10

Obsession
Есть! Возьми два раза стукни по ячейке, потом возьми InqSoft Window Scanner и наведи на ячейку, которую только что активной сделал и увидишь, что класс окна и хендл отличаются от основного.

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 22 июля 2006 01:59
· Личное сообщение · #11

Черт побери, огромное спасибо, действительно получилось!!!!!!!!!
Жму руку!

Блин, а ведь так и не догадаешься. Сейчас уже хотел пробовать по координатам искать(у меня есть в запасе специальный класс)

Ну спасибо, я сдвинулся с мертвой точки, пойду дальше делать.

Всем, кто мне пытался помочь, - тоже спасибо



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 22 июля 2006 15:50
· Личное сообщение · #12

Obsession пишет:
Кстати, что такое su.win32.prog?

Давным-давно, когда HTTP еще не было, информацию распространяли через ньюс-группы(newsgroup).
Они имели иерархическую структуру : su- Советский Союз, win32.prog - программирование для win32.
Эти ньюсы существуют до сих пор, но мы же летаем на ракетах и лошади нам ни к чему



Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 23 июля 2006 03:07 · Поправил: Obsession
· Личное сообщение · #13

tundra37
На счет su.win32.prog - понятно
)

Теперь у меня такая беда.
Смотрю в ячейку через InqSoft, в тексте окна пусто ("")
Меняю содержимое ячейки (пробовал так и так):

SendMessage(cell,WM_SETTEXT,0 ,(LPARAM)"text");
SetWindowText(cell,"text");

В результате в ячейке все равно пусто, зато у всех ячеек(т.е. у любой просмотренной ячейки) в тексте окна написано "text"

Аналогично для считывания:
SendMessage(cell,WM_GETTEXT,(WPARAM)25,(LPARAM)str);
GetWindowText(cell,str,255);

Считывает пустоту,т.е. "", если же пробовал менять текст ячейки, считывает "text",т.е. из, условно говоря, "заголовка" ячейки, а не самой ячейки.
Как это лечится?

PS После нескольких запусков GetText компьютер наглухо зависает



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 23 июля 2006 04:18
· Личное сообщение · #14

Obsession пишет:
Если послать сообщение нажатия мышки в конкретную точку окна я могу (и выделится соответствующая ячейка)

Obsession
Возьми, активируй ячейку и с поля fx, (что находится над таблицей с ячейками, и в которой редактируются данные ячейки) попробуй оттуда данные снять или уже пробовал так делать?

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 23 июля 2006 10:17
· Личное сообщение · #15

Obsession
Любит же народ себе проблемы создавать. Если бы в Excel каждая ячейка обрабатывала бы события, то в нем бы работать было невозможно. Поэтому вместо того, чтобы бороться с трудностями, найди функции для работы с таблицами Excel. Например в Дельфи есть компоненты. В конце концов даже через Вижуал Бейсик проще работать, чем разбираться кому и что надо послать, чтобы ячейку изменить.



Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 23 июля 2006 20:05 · Поправил: Obsession
· Личное сообщение · #16

Demon666 пишет:
Obsession
Возьми, активируй ячейку и с поля fx, (что находится над таблицей с ячейками, и в которой редактируются данные ячейки) попробуй оттуда данные снять или уже пробовал так делать?

InqSoft не видит там текста, даже если что-нибудь там написано, так что, я думаю, нет смысла пробовать.


tundra37 пишет:
Obsession
Любит же народ себе проблемы создавать. Если бы в Excel каждая ячейка обрабатывала бы события, то в нем бы работать было невозможно.

А почему невозможно?


tundra37 пишет:
Поэтому вместо того, чтобы бороться с трудностями, найди функции для работы с таблицами Excel. Например в Дельфи есть компоненты. В конце концов даже через Вижуал Бейсик проще работать, чем разбираться кому и что надо послать, чтобы ячейку изменить.


Никогда не слышал об этих функциях. Надо попробовать. Не понятно все же, почему не действуют обычные функции API .
Согласен, это похоже на создание лишних проблем, но просто я подбираюсь к другой программе, которой даже нет у меня на компе. А в этом они похожи с exelем: у них обеих такие необрабатываемые окна. И я хотел выяснить, что с этими окнами не так. Как в exele, так и в той проге.

А подскажите тогда, почему комп виснет после GetText.
Как правильно считывать текст?



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 24 июля 2006 13:13
· Личное сообщение · #17

Obsession
Пардон конечно за оффтоп, но вспомнился анекдот. Там мужик искал пропажу не там, где потерял, а там, где светло. Твоя ситуация похожая. Даже если ты научишься Excel-ем управлять через события или через API, это мало чем поможет тебе с другой программой. Микрософт специально реализовал несколько механизмов для работы с Excel извне. Один из них DDE. Наверняка что-то описано в MSDN. Попытка использовать механизм сообщений обречена на провал без изучения кухни Микрософт. Если тебя устраивает работа с той "другой программой" вслепую, то это самый правильный путь. Все API, какие тебе для этого нужны : просмотр списка окон и посылка им сообщений. В InqSoft я что-то не нашел возможности протоколировать сообщения. В spy++ это есть, сообщения действительно WM_GETTEXT, но много шансов за то, что сам текст передается внутри самого Excel или через другое окно(там их масса) или через API. В MSO9.dll более тысячи входов, к сожалению там ординалы. Возможно там твои API и сидят. Но MSO9 для другой программы мало чем поможет



Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 11 августа 2006 22:27
· Личное сообщение · #18

Меня давно не было. Но я раздобыл ту прогу и даже пытался ее поломать немного дома.
Я ее выложить не могу, она 10мб (ехешник и dllины).

Но я выяснил следующие вещи:
1)Одно окошко, которое мне перво-наперво нужно, в нем есть поля ввода(как обычные окна класса TEdit).
InqSoft "видит" только это окошко, а все что есть на нем(поля ввода и кнопки) не видит.
Пробовал делать перебор детей следующей процедурой:


BOOL CALLBACK WinProc(HWND wh,LPARAM lParam)
{
//выводит в memo все окна
char wn[256];
if(lParam)return 1;
GetWindowText(wh,wn,256);

Form1->Memo1->Text=Form1->Memo1->Text+wn;
return 1;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int A=(StrToInt("0x"+Form1->Edit1->Text));
EnumChildWindows((HWND)A,(WNDENUMPROC)WinProc,0);
}


Детей нет(я эту процедуру откуда-то содрал, как раз, когда начинал осваивать функции Winapi, она работает правильно, я проверял)


А spy++ не видит даже этого окошка. Видит только главное окно программы.


2)Dll-ины имеют следующие названия:
Vfp6r.dll
Vfp6renu.dll
Vfp6t.dll

Я где-то прочитал, что такие библиотеки вроде как раз используются против уязвимости windows к сообщениям. Что, типа, нет никакого editboxа, есть белая полоска и мигающий курсор:все просто нарисованно. Соответственно, пытаться добраться до этого окна - все равно, что пытаться открыть нарисованную дверь.

Пробовал слать сообщения о нажатии клавиш таким кодом:
HWND poisk;//хэндл окна поиск

SendMessage(poisk,WM_LBUTTONDOWN,0,MAKELPARAM(74,21));
SendMessage(poisk,WM_LBUTTONUP,0,MAKELPARAM(74,21));
SendMessage(poisk,WM_SETFOCUS,0,0);

char key='f';
SendMessage(poisk,WM_KEYDOWN,key,0);
//SendMessage(poisk,WM_CHAR,key,0);// так тоже пробовал - не работает
SendMessage(poisk,WM_KEYUP,key,0);


Так вот, может есть какие-то способы борьбы с этим?
(о таблицах типа stringgrid(или как они правильно называются: listboxы, кажется), которые там присутствуют, я уже даже и не мечтаю. Мне хотяб это доделать раз взялся)

Сообщения от spy++ я, честно говоря, не понял, как ловить. Надо копать в эту сторону?

Кому еще не надоела эта тема, пожалуйста, выскажитесь, что вы об этом думаете.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 12 августа 2006 11:14
· Личное сообщение · #19

Obsession пишет:
Vfp6r.dll
Vfp6renu.dll
Vfp6t.dll

Я где-то прочитал

Да любой поиск даст, что это - VFP - Visual Fox Pro. Вообще-то странно, я считал что все Вижуалы построены одинаково. Возможно, что для совместимости со старыми версиями в Фоксе все сделано на битмапах и внутренних механизмах. Короче - есть декомпиляторы Фокса, есть куча форумов - читай,спрашивай и ломай не хочу. И Эксель совсем здесь лишний был.
На будущее запомни : самое главное в краке понять, что за враг, а не пытаться его сразу взорвать, да еще тренироваться черт-те на чем



Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 12 августа 2006 17:43
· Личное сообщение · #20

А, ну спасибо на добром слове!



Ранг: 88.0 (постоянный)
Активность: 0.070
Статус: Участник

Создано: 12 августа 2006 21:01
· Личное сообщение · #21

Obsession пишет:
SendMessage(poisk,WM_LBUTTONDOWN,0,MAKELPARAM(74,21));
SendMessage(poisk,WM_LBUTTONUP,0,MAKELPARAM(74,21));
SendMessage(poisk,WM_SETFOCUS,0,0);


Вот после этого окно для ввода появляется?



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 12 августа 2006 21:48
· Личное сообщение · #22

Obsession пишет:
Кому еще не надоела эта тема, пожалуйста, выскажитесь, что вы об этом думаете.

Мне тема интересна!

Obsession
Выложи здесь без debug информации свой *.exe файл, из которого кусок кода показал!?

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 12 августа 2006 22:40
· Личное сообщение · #23

Уммм, это 2 куска из двух разных программ. Первый кусок из программы на 3м билдере, которая выводит в memo названия всех дочерних окон окна, хэндл которого введешь.

А второй кусок - тоже 3й билдер. Это я уже пытался писать резидентную программу для той проги, которая на фоксе.

И я не очень понял, как это без debug информации.
Вернее, как с debug информацией?


Дело в том, что при отладке создается "маленький", условно говоря, exeшник.
На компе, на котором не установлен этот самый пресловутый 3й билдер(или выше, наверное), этот файл не запустится.

Меня, в принципе, научили делать "независимый" ехешник(там с подключением или наоборот отключением использования всяких runtime модулей, библиотек и т.д., я особо не разбирался), он запустится, но он будет большой. Поскольку использование разных формочек, этот GUI занимает все место,то он будет больше 1мб наверное.

В общем, это я все к тому,
скажи, что тебе конкретно нужно.



Ранг: 88.0 (постоянный)
Активность: 0.070
Статус: Участник

Создано: 12 августа 2006 23:26
· Личное сообщение · #24

Obsession
Вот состряпал функцию:

void SetTextInExel(char* string, POINT p) { //p = (74,21)

HWND h = WindowFromPoint(p);

SendMessage(h,WM_LBUTTONDOWN,0,MAKELPARAM(p.x,p.y));
SendMessage(h,WM_LBUTTONUP,0,MAKELPARAM(p.x,p.y));

h = WindowFromPoint(p);
SendMessage(h,WM_SETTEXT,0,string);
SendMessage(h,WM_KEYDOWN,VK_RETURN,0);
}

хз работает ли она, но теоретически должна. =)

ЗЫ: было бы хорошо если бы ты отвечал на вопросы.



Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 13 августа 2006 00:05
· Личное сообщение · #25

rep0A пишет:
было бы хорошо если бы ты отвечал на вопросы.

сорри, извини пожалуйста, я случайно пропустил


rep0A пишет:
Obsession пишет:
SendMessage(poisk,WM_LBUTTONDOWN,0,MAKELPARAM(74,21));
SendMessage(poisk,WM_LBUTTONUP,0,MAKELPARAM(74,21));
SendMessage(poisk,WM_SETFOCUS,0,0);

Вот после этого окно для ввода появляется?


Да, можно даже без WM_SETFOCUS

rep0A пишет:
Вот состряпал функцию:

Большое спасибо! Сейчас попробую!



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 13 августа 2006 01:41
· Личное сообщение · #26

Obsession пишет:
Первый кусок из программы на 3м билдере, которая выводит в memo названия всех дочерних окон окна, хэндл которого введешь.

Угу, это и имел ввиду.

Obsession пишет:
Вернее, как с debug информацией?

Ладно, проехали, просто с этим возни больше будет.

Obsession пишет:
скажи, что тебе конкретно нужно.

Конкретно коллекционирую варианты в своем “шпиЁне” то, что другие проги не могут делать, так на скидку подумал, вдруг придется столкнуться с такой проблемой как у тебя ну и попутно добавить такой вариант с “рисованными окнами”.
Вообще есть идея, но нужно полностью быть уверенным, чтобы потом констатировать факты. (Пока буду юзать Excel)
Ну и так для примера, возьми InqSoft и наведи на toolbar в Olly, это сразу наводит на мысль что присутствует вариант WM_PAINT. (я не проверял, но предстоит, пока воюю с регионами (WM_NCPAINT), но это не важно.)

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 13 августа 2006 01:47 · Поправил: Obsession
· Личное сообщение · #27

rep0A пишет:
Вот состряпал функцию:


Ну кстати грамотнее было бы так:

POINT p = (498,426);

HWND h = WindowFromPoint(p);

SendMessage(h,WM_LBUTTONDOWN,0,MAKELPARAM(74,21));
SendMessage(h,WM_LBUTTONUP,0,MAKELPARAM(74,21));

либо

SendMessage(NULL,WM_LBUTTONDOWN,0,MAKELPARAM(p.x,p.y));
SendMessage(NULL,WM_LBUTTONUP,0,MAKELPARAM(p.x,p.y));

поскольку координаты, если указывать хэндл окна, определяются для этого окна(клиентские,по-моему, как показывает InqSoft) ,а не для экрана.


Но все равно не работает. В h записывается хэндл именно окна поиска, а не контрола ввода, который на этом окне поиска находится(и должен бы был быть ребенком)
А окну поиска что-то слать - ясное дело нет смысла.

Я прочитал (кстати вот форум по VFP если у кого тоже будут проблемы forum.foxclub.ru ), что в VFP вовсе не все контролы - это окна.

Ну еще фишка могла бы быть в том, что туда можно вписать только русские буквы(даже цифры нельзя)

я уж по-разному изощрялся:
и так:

char string='л';
SendMessage(h,WM_SETTEXT,0,string);
SendMessage(h,WM_KEYDOWN,VK_RETURN,0);

и так:

long string='л';
SendMessage(h,WM_SETTEXT,0,string);
SendMessage(h,WM_KEYDOWN,VK_RETURN,0);

и так(для пробы):

char string='q';
SendMessage(h,WM_SETTEXT,0,string);
SendMessage(h,WM_KEYDOWN,VK_RETURN,0);

но бесполезно.
Можно что-то вписать, если курсор мигает. А в результате отработки резидентной программы появляется только синяя полоса(как будто выделили пустое место), и ничего не мигает.

Я уже читаю тот форум, вроде есть там какой-то способ. Но все равно спасибо еще раз.



Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 13 августа 2006 02:04 · Поправил: Obsession
· Личное сообщение · #28

Demon666 пишет:
Ну и так для примера, возьми InqSoft и наведи на toolbar в Olly, это сразу наводит на мысль что присутствует вариант WM_PAINT. (я не проверял, но предстоит, пока воюю с регионами (WM_NCPAINT), но это не важно.)


Я пока не игрался с Olly и т.д. (софтайс только пробовал, но мои познания в ассемблере не велики(мягко говоря), поэтому я его удалил. Сейчас разбираться с ним не буду точно)
ну ты олю для примера просто привел, да?

Единственное, что интересно, InqSoft ловит окошко поиска в фоксовской проге, а spy++ нет.

На счет той проги - она ловит только действительно существующие окна, у которых есть хэндл. Всякие "нарисованные двери" она не ловит. Если хочешь, прикреплю проект с "маленьким" ехешником.



Ранг: 9.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 13 августа 2006 02:25
· Личное сообщение · #29

Че-то не то с форумом: файл не получается заменить.
А редактировать можно только через 4 минуты, хотя написано, что через 4 секунды


4aec_13.08.2006_CRACKLAB.rU.tgz - childrenofhandle.zip



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 13 августа 2006 10:41 · Поправил: tundra37
· Личное сообщение · #30

Ребята !! Куда вас несет ?!
Ну давайте, я сейчас распакую BC5.2 или даже 5.0 , сделаю проект и вы все дружно будете разбираться, как в прошлом веке программировали Edit-ы. Просто там другие API и все.
Вопроса как такового нет. Тов. Obsession сначала берет Excel, потом Фокс-6, потом Билдер 3-й. Все-таки в одной теме нельзя разбирать вселенскую проблему : "Как программировали окна с 1992 года по 2006-й". Все проблемы, поднятые Obsession, уже давно задокументированы, но каждый в своем месте.

Obsession пишет:
childrenofhandle.zip

Ты ее слинковал неправильно, без библиотек посмотреть нельзя.


. 1 . 2 . >>
 eXeL@B —› Вопросы новичков —› как ломать exel
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати