|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 4, 2004 16:06:45 Есть прога написанна на Delphi 7. Уже готовый exe. Там есть строка SQL запроса вида: SELECT * FROM People where Act= Переменная Act формируется динамически в програме. В exe файле на ее месте некий код (заглушка) вида ... where Act= яяяя в 16 ричном виде что то типа (после равно) 00 00 00 FF FF FF Теперь вопрос: Как формируется в Delphi переменные для формирования SQL строк ? Могу ли я просто забить 16 ричный код "заглушки переменной" на некую константу вида Act= 1 или там нужно некое "обрамление" этой константы ? |
|
|
Дата: Окт 4, 2004 16:23:53 Строки в Дельфи хранятся в следующем виде: -8 4 байта счётчик ссылок (-1=0xFFFFFFFF для констант) -4 4 байта длина строки (без завершающего нуля) 0 строка + нулевой байт Таким образом, тебе надо исправить не только строку, но и длину. |
|
|
Дата: Окт 5, 2004 10:29:52 · Поправил: leo asmlamo Прежде чем пытаться что-то "забивать" в экзешнике не мешало бы разобраться что это и с чем его едят. А у тебя одни пробелы\провалы: > "Переменная Act" - это не переменная , а название поля (столбца) таблицы People. > "на ее месте некий код (заглушка)" - это никакая не заглушка, а просто мусор в конце строковой константы для выравнивания или начало следующих данных. > "Там есть строка" - где там, по какому адресу и в какой секции (в коде, в данных, в хипе) ? Теперь ответ на вопрос: "Как формируется в Delphi переменные для формирования SQL строк ?" Начнем с того, что запросы бывают "обычные" и параметрические. В обычном запросе, строго говоря, никаких переменных нет - серверу передается SQL-текст явно описывающий что, откуда и с какими условиями мы должны получить. Можно сказать, что весь текст SQL и является переменной. В Delphi компонент TQuery можно использовать "статически", если явно задать свойство TQuery.SQL.Text на этапе проектирования, а можно "динамически" - изменяя текст SQL в runtime. В этом случае можно изменять весь текст или только его часть - обычно условие where. Как мы его меняем ? Ну например, так Query1.SQL.Text:=FixText+Edit1.Text, где FixText - приведенная тобой строковая константа, а Edit1.Text - значение поля Act, введенное пользователем. Вопрос: что будет если ты в exe-шнике изменишь константу FixText ? Думаю, ничего хорошего. Тем более не известно, в каком виде она хранится - просто как PChar или в виде шаблона string (см. ответ reverser) - все зависит от того, как она была объявлена (или const FixText = .. или FixText:string = .. или прямо в операторе S1+S2). Параметрические запросы - это несколько иное. На первый взгляд, это аналог функции Format или wsprintf - мы задаем постоянную часть запроса и набор переменных параметров различных типов. Для нас это действительно так, но суть параметрического запроса несколько глубже. Дело в том, что при изменении текста SQL сервер заново интерпретирует\компилирует запрос. "Глубинная" же суть параметрического запроса в том, что текст запроса грубо говоря компилируется один раз, а затем только изменяются его параметры, что несколько проще и быстрее. В параметрических SQL вместо значения параметра стоит символ вопроса, т.е. если бы в твоем примере использовался параметрический запрос, то было бы "... where Act=?" |
|
|
Дата: Окт 5, 2004 15:42:42 · Поправил: asmlamo Спасибо за развернутый ответ ! Буду повышать свои знания. >Прежде чем пытаться что-то "забивать" в экзешнике не >мешало бы разобраться что это и с чем его едят. Согласен на 100% > "Переменная Act" - это не переменная , а название поля >(столбца) таблицы People. Это понятно ! Я просто не правильно сказал. |
|
|
Дата: Окт 5, 2004 18:48:38 asmlamo Вопросы о Дельфи здесь запрещены. Ересь. Однако тему удалять не буду. Мне тоже очень понравился ответ leo. Только поэтому. |
|
|
Дата: Окт 5, 2004 22:26:37 volodya Вроде запрещены вопросы о программировании на дельфи. А это про уже про реверсинг программы, которая на нём написана, а это уже совсем другой вопрос. |
|
|
Дата: Окт 5, 2004 22:46:04 dragon Великий Даос сам решает, что считать ересью ;) Твой эмуль положу |
|
|
Дата: Окт 5, 2004 23:47:52 Да, положи. И убери надпись, что его компилировать надо, потому что компилировать его не надо :) А насчёт вопроса, это не ересь, проги на дельфи очень часто встречаются и не мешало бы знать, как они устроены, помогает всё-таки. |
|
|
Дата: Окт 6, 2004 02:01:43 > Твой эмуль положу Ну и где эмуль? Я так понимаю речь идёт о новой версии отладчика.. Кстати, он соберётся под 4.30 или в нем заюзаны API появившиеся только начиная с 4.50 ? |
|
|
Дата: Окт 6, 2004 02:46:59 В Delphi тоже есть асм в асм вставках, так почему же нельзя спрашивать вопросы по Delphi ? ;-) |
|
|
Дата: Окт 6, 2004 03:55:00 Asterix Завтра положу. Не бодай меня, и так устал... |
|
|
Дата: Окт 6, 2004 10:07:42 Asterix Я пробовал под 4.30, так и не собрал, не хотел компилироваться. Можешь попробовать, как появится(Там надо менять включааемый файл allins.hpp на ins.hpp). Только ещё условие, компилятор должен быть Intel C++, потому что cl.exe от MS не поддерживает 80-битный тип long double, сокращая его до 64 бит. |
|
|
Дата: Окт 6, 2004 11:11:43 Вопросы о Дельфи здесь запрещены. Ересь. Не совсем понял . Дельфи ты в смысле не любиш ? А вопрос по реверсингу проги написанной на ЯВУ. Возможно это Дельфи:) |
|
|
Дата: Окт 6, 2004 12:03:08 · Поправил: leo В продолжение темы: дельфийские причуды с локальными строковыми константами Варианты объявления в процедуре: 1) const S = '...' или непосредственно в операторе конкатенации S1:=S2+'...' - распределяется в коде после процедуры с 8-байтным префиксом: 4 счетчик ссылок (= -1) и 4 длина строки; - ссылка на строку непосредственно по адресу; 2) const S:string = '...' - распределяется в коде как вариант 1), но не после процедуры, а перед ней - дополнительно в data создается dword - указатель на эту строку и в процедуре используется косвенная сссылка на строку через этот dword (?! - а мы тут недавно глобальные переменные обсуждали - логику искали...); 3) const S:PChar = '...' - все также как в варианте 2), только без 8-байтного префикса; 4) const S:array[0..Х] of Char = '...' - распределяется в data (ес-но без префикса); - ссылка непосредственно по адресу; (Ну ес-но во всех случаях выравнивание начала и длины строки на 4) Вот такие фокусы..., или ересь - кому как нравится... asmlamo "Возможно это Дельфи" Если еще не пробовал, то запусти прогу в DeDe by DaFixer/TMG - она те даст ответ, дельфи это или нет (поэзия однако..) |
|
|
Дата: Окт 6, 2004 13:35:05 dragon > Только ещё условие, компилятор должен быть Intel C++ Плохо, у меня не было в планах качать этот компилятор %) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.050 |