Есть прога написанна на 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 или там нужно некое "обрамление" этой константы ?
Строки в Дельфи хранятся в следующем виде: Код (Text): -8 4 байта счётчик ссылок (-1=0xFFFFFFFF для констант) -4 4 байта длина строки (без завершающего нуля) 0 строка + нулевой байт Таким образом, тебе надо исправить не только строку, но и длину.
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=?"
Спасибо за развернутый ответ ! Буду повышать свои знания. >Прежде чем пытаться что-то "забивать" в экзешнике не >мешало бы разобраться что это и с чем его едят. Согласен на 100% > "Переменная Act" - это не переменная , а название поля >(столбца) таблицы People. Это понятно ! Я просто не правильно сказал.
asmlamo Вопросы о Дельфи здесь запрещены. Ересь. Однако тему удалять не буду. Мне тоже очень понравился ответ leo. Только поэтому.
volodya Вроде запрещены вопросы о программировании на дельфи. А это про уже про реверсинг программы, которая на нём написана, а это уже совсем другой вопрос.
Да, положи. И убери надпись, что его компилировать надо, потому что компилировать его не надо А насчёт вопроса, это не ересь, проги на дельфи очень часто встречаются и не мешало бы знать, как они устроены, помогает всё-таки.
> Твой эмуль положу Ну и где эмуль? Я так понимаю речь идёт о новой версии отладчика.. Кстати, он соберётся под 4.30 или в нем заюзаны API появившиеся только начиная с 4.50 ?
Asterix Я пробовал под 4.30, так и не собрал, не хотел компилироваться. Можешь попробовать, как появится(Там надо менять включааемый файл allins.hpp на ins.hpp). Только ещё условие, компилятор должен быть Intel C++, потому что cl.exe от MS не поддерживает 80-битный тип long double, сокращая его до 64 бит.
Вопросы о Дельфи здесь запрещены. Ересь. Не совсем понял . Дельфи ты в смысле не любиш ? А вопрос по реверсингу проги написанной на ЯВУ. Возможно это Дельфи
В продолжение темы: дельфийские причуды с локальными строковыми константами Варианты объявления в процедуре: 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 - она те даст ответ, дельфи это или нет (поэзия однако..)
dragon > Только ещё условие, компилятор должен быть Intel C++ Плохо, у меня не было в планах качать этот компилятор %)
dragon IDA выше 4.30 у мя есть, но хотелось именно к 4.30 %) Кстати, для компиляции под 4.50 и выше тоже intel compiler нужен? это ты специально что-ли так задумал?
intel compliler в любом случае нужен. А специально я так не задумывал, если есть в VC++ настройка, чтобы была поддержка 80-бит long double, то можно и vc компилировать. А так не получится.
dragon если есть в VC++ настройка, чтобы была поддержка 80-бит long double Что за настройка, в исходнике с помощью #pragma её можно указать?? Ещё интересно, почему так сильно отличаются скомпиленные тобой плагины(что сейчас лежат на васме) в размерах, 4.50,4.60 практически одинаковы, 4.60sp1 больше их ~ в 3 раза..
Это не я компилировал, сейчас наконец-то новый появился, там все одинаковые. А насчёт настройки ничего не знаю, но я думаю должна быть.