Переменные в Delphi ?

Тема в разделе "WASM.RESEARCH", создана пользователем asmlamo, 4 окт 2004.

  1. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.734
    Есть прога написанна на 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 или там нужно некое "обрамление" этой константы ?
     
  2. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Строки в Дельфи хранятся в следующем виде:
    Код (Text):
    1. -8   4 байта   счётчик ссылок (-1=0xFFFFFFFF для констант)
    2. -4   4 байта   длина строки (без завершающего нуля)
    3. 0    строка + нулевой байт


    Таким образом, тебе надо исправить не только строку, но и длину.
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    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=?"
     
  4. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.734
    Спасибо за развернутый ответ !



    Буду повышать свои знания.



    >Прежде чем пытаться что-то "забивать" в экзешнике не

    >мешало бы разобраться что это и с чем его едят.



    Согласен на 100%





    > "Переменная Act" - это не переменная , а название поля

    >(столбца) таблицы People.



    Это понятно ! Я просто не правильно сказал.
     
  5. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    asmlamo



    Вопросы о Дельфи здесь запрещены. Ересь. Однако тему удалять не буду. Мне тоже очень понравился ответ leo. Только поэтому.
     
  6. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер
    volodya

    Вроде запрещены вопросы о программировании на дельфи. А это про уже про реверсинг программы, которая на нём написана, а это уже совсем другой вопрос.
     
  7. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    dragon



    Великий Даос сам решает, что считать ересью ;)



    Твой эмуль положу
     
  8. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер
    Да, положи. И убери надпись, что его компилировать надо, потому что компилировать его не надо :)

    А насчёт вопроса, это не ересь, проги на дельфи очень часто встречаются и не мешало бы знать, как они устроены, помогает всё-таки.
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    > Твой эмуль положу



    Ну и где эмуль? Я так понимаю речь идёт о новой версии отладчика..

    Кстати, он соберётся под 4.30 или в нем заюзаны API появившиеся только начиная с 4.50 ?
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    В Delphi тоже есть асм в асм вставках, так почему же нельзя спрашивать вопросы по Delphi ? :derisive:
     
  11. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Asterix



    Завтра положу. Не бодай меня, и так устал...
     
  12. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер
    Asterix

    Я пробовал под 4.30, так и не собрал, не хотел компилироваться. Можешь попробовать, как появится(Там надо менять включааемый файл allins.hpp на ins.hpp). Только ещё условие, компилятор должен быть Intel C++, потому что cl.exe от MS не поддерживает 80-битный тип long double, сокращая его до 64 бит.
     
  13. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.734
    Вопросы о Дельфи здесь запрещены. Ересь.



    Не совсем понял . Дельфи ты в смысле не любиш ?



    А вопрос по реверсингу проги написанной на ЯВУ.

    Возможно это Дельфи:)
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    В продолжение темы: дельфийские причуды с локальными строковыми константами

    Варианты объявления в процедуре:

    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 - она те даст ответ, дельфи это или нет (поэзия однако..)
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    dragon

    > Только ещё условие, компилятор должен быть Intel C++



    Плохо, у меня не было в планах качать этот компилятор %)
     
  16. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер
    Придётся тебе качать или иду >= 4.50 или intel C++, но лучше и то и другое :)
     
  17. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    dragon

    IDA выше 4.30 у мя есть, но хотелось именно к 4.30 %)

    Кстати, для компиляции под 4.50 и выше тоже intel compiler нужен? это ты специально что-ли так задумал? :derisive:
     
  18. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер
    intel compliler в любом случае нужен. А специально я так не задумывал, если есть в VC++ настройка, чтобы была поддержка 80-бит long double, то можно и vc компилировать. А так не получится.
     
  19. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    dragon

    если есть в VC++ настройка, чтобы была поддержка 80-бит long double



    Что за настройка, в исходнике с помощью #pragma её можно указать?? Ещё интересно, почему так сильно отличаются скомпиленные тобой плагины(что сейчас лежат на васме) в размерах, 4.50,4.60 практически одинаковы, 4.60sp1 больше их ~ в 3 раза..
     
  20. dragon

    dragon New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2002
    Сообщения:
    84
    Адрес:
    Питер
    Это не я компилировал, сейчас наконец-то новый появился, там все одинаковые. А насчёт настройки ничего не знаю, но я думаю должна быть.