Тем кто выпускает, или планирует выпускать программы скомпиленные в Delphi 2010, будет интересно. Тама есть новая фича, которая по умолчанию включена — RTTI. Проблема в том, что в EXE-шник идет куча лишней информации, включая имена и типы переменных, что может очень помочь взлому программы. Отключается это директивой:
Здравствуйте, wellwell, Вы писали:
W>Тем кто выпускает, или планирует выпускать программы скомпиленные в Delphi 2010, будет интересно. Тама есть новая фича, которая по умолчанию включена — RTTI. Проблема в том, что в EXE-шник идет куча лишней информации, включая имена и типы переменных, что может очень помочь взлому программы.
Ага, а без RTTI не будет работать dynamic_cast и все что с ним связано.
Здравствуйте, wellwell, Вы писали:
W>Тем кто выпускает, или планирует выпускать программы скомпиленные в Delphi 2010, будет интересно. Тама есть новая фича, которая по умолчанию включена — RTTI. Проблема в том, что в EXE-шник идет куча лишней информации, включая имена и типы переменных, что может очень помочь взлому программы. Отключается это директивой: W>
RTTI — это старая фича всех делфи, которые я помню. Служит для получения информации о типах (классах).
Включается\выключается {$M+} or {$M-} {$TYPEINFO ON} or {$TYPEINFO OFF}
По умолчанию отключена (покрайней мере до Delphi 2007 включительно точно).
Взлому то это слабо поможет ИМХО.
Здравствуйте, wellwell, Вы писали:
W>Тем кто выпускает, или планирует выпускать программы скомпиленные в Delphi 2010, будет интересно. Тама есть новая фича, которая по умолчанию включена — RTTI. Проблема в том, что в EXE-шник идет куча лишней информации, включая имена и типы переменных, что может очень помочь взлому программы. Отключается это директивой:
Если я ничего не путаю, то в RTTI включается только инфа о published свойствах/методах/типах и я боюсь что при отключении этой кухни перестанут грузиться DFM-ы.
Здравствуйте, PolyTech, Вы писали:
PT>Если я ничего не путаю, то в RTTI включается только инфа о published свойствах/методах/типах и я боюсь что при отключении этой кухни перестанут грузиться DFM-ы.
По умолчанию RTTI отключено, что не мешает грузиться dfm-кам из ресурсов.
"PolyTech" <71243@users.rsdn.ru> wrote in message news:3665329@news.rsdn.ru... > Если я ничего не путаю, то в RTTI включается только инфа о published свойствах/методах/типах и я боюсь что при отключении этой кухни перестанут грузиться DFM-ы.
Именно так все и было, вплоть до D2010. Теперь же, берем такой пример:
type
TMyClass = class
private
FMyVeryPrivateVariable: Integer;
end;
implementation
procedure TForm1.FormCreate(Sender: TObject);
var
MyObj: TMyClass;
begin
MyObj := TMyClass.Create;
MyObj.FMyVeryPrivateVariable := 1;
end;
В Exe-шник угодило FMyVeryPrivateVariable (можно найти поиском подстроки "FMyVeryPrivateVariable") и ее тип как минимум.
"Nonmanual Worker" <69786@users.rsdn.ru> wrote in message news:3665312@news.rsdn.ru... > RTTI — это старая фича всех делфи, которые я помню. Служит для получения информации о типах (классах).
Фича-то старая, но в сабже значительно переработаная и за каким-то фигом включающая приватные переменные и их типы. Нашел я это совершенно случайно, завел переменную FTrialHasBeenUsedDays, из названия которой понятно что она делает. Раньше имена таких переменных не попадали в бинарник, а теперь попадают, и ее легко найти по слову Trial в Exe-файле. Можно, конечно, называть переменные Jopa123, но все таки удобнее когда у них нормальные имена, и до сих пор это никак не влияло на взломо-устойчивость.
Здравствуйте, wellwell, Вы писали:
W>"PolyTech" <71243@users.rsdn.ru> wrote in message news:3665329@news.rsdn.ru... >> Если я ничего не путаю, то в RTTI включается только инфа о published свойствах/методах/типах и я боюсь что при отключении этой кухни перестанут грузиться DFM-ы.
W>В Exe-шник угодило FMyVeryPrivateVariable (можно найти поиском подстроки "FMyVeryPrivateVariable") и ее тип как минимум.
Хм. Действительно имена private свойств теперь попадают в RTTI. Это пипец.
W>Фича-то старая, но в сабже значительно переработаная и за каким-то фигом включающая приватные переменные и их типы. Нашел я это совершенно случайно, завел переменную FTrialHasBeenUsedDays, из названия которой понятно что она делает. Раньше имена таких переменных не попадали в бинарник, а теперь попадают, и ее легко найти по слову Trial в Exe-файле. Можно, конечно, называть переменные Jopa123, но все таки удобнее когда у них нормальные имена, и до сих пор это никак не влияло на взломо-устойчивость.
Они там наверно офигели, вконец хотят интерпритатор сделать, ну или это подготовка комунити, прежде чем паковать исходники сразу в эксешник?
PS:
Любые имена дают ключ к взлому и анализу программы.
Если раньше можно определить было только тип внутренней переменной, то теперь еще имя внутренне переменной пишется.
Ждемс декомпилятор делфи в нормальный исходник, без асма.
Здравствуйте, AWSVladimir, Вы писали:
AWS>Ждемс декомпилятор делфи в нормальный исходник, без асма.
Ага, у нас лет как 10 есть продукт, который все dfm-ки восстанавливает из exe-шника.
Допишем и восстановление кода, если спрос будет Будет как для .net
Здравствуйте, Nonmanual Worker, Вы писали:
AWS>>Ждемс декомпилятор делфи в нормальный исходник, без асма. NW>Ага, у нас лет как 10 есть продукт, который все dfm-ки восстанавливает из exe-шника.
Здравствуйте, Nonmanual Worker, Вы писали:
NW>Ага, у нас лет как 10 есть продукт, который все dfm-ки восстанавливает из exe-шника. NW>Допишем и восстановление кода, если спрос будет Будет как для .net
Ну допустим все dfm хранятся в ресурсах, достать их нет проблем.
Dede,De Decompiller вроде выкидывали в эксешник, но там много асма было.
Думаю это нововведение поможет его существенно сократить.
// Блин жаль нельзя дописывать
Но при запущеной програмке DFM-ки все равно можно сдернуть и пропатчить эксешник, если конечно ты опять что нить не придумал.
Можно "проще" — через перехват API, работающих с ресурсами программы (FindResource/LockResource etc), с помощью которых грузятся DFM-ки. Для этого достаточно будет написать DLL-ку, которая будет перехватывать необходимые API на уровне IAT программы (у рихтера есть примеры) и написать простейший "менеджер" ресурсов, который будет выделять память и декриптовать ресурсы по запросу программы. При этом в самой VCL ничего не нужно переделывать.
Здравствуйте, PolyTech, Вы писали:
PT>Здравствуйте, wellwell, Вы писали:
W>>"PolyTech" <71243@users.rsdn.ru> wrote in message news:3665329@news.rsdn.ru... >>> Если я ничего не путаю, то в RTTI включается только инфа о published свойствах/методах/типах и я боюсь что при отключении этой кухни перестанут грузиться DFM-ы.
W>>В Exe-шник угодило FMyVeryPrivateVariable (можно найти поиском подстроки "FMyVeryPrivateVariable") и ее тип как минимум.
PT>Хм. Действительно имена private свойств теперь попадают в RTTI. Это пипец.
В Delphi 2009 как и в предыдущих версиях, RTTI был ограничен элементами, размещенными в Published секции.
У вас был доступ к указателям на свойства, поля и методы объекта. Если потратить немного времени на обучение, то старая версия RTTI превращалась в довольно мощный механизм. Однако, мощь RTTI предыдущих версий смотрится весьма скромно по сравнению с тем, что стало возможным в Delphi 2010.
В Delphi 2010 вы можете извлекать RTTI информацию практически отовсюду. Выбор, какая информация должна быть доступна, остается за вами, этим управляет новая директива $RTTI. Поведение по умолчанию определено в System.pas, фрагмент которого приведен ниже, свойства и методы теперь доступны посредствам RTTI как в Published, так и в Public секциях, а поля доступны во всех секциях.
Section of System.pas:
{ RTTI Visibility }
type
TVisibilityClasses = set of (vcPrivate, vcProtected, vcPublic, vcPublished);
const
{ Эти константы отображают текущие установки, встроенные в компилятор.
Обычно для классов они наследуются от TObject.
}
DefaultMethodRttiVisibility = [vcPublic, vcPublished];
DefaultFieldRttiVisibility = [vcPrivate..vcPublished];
DefaultPropertyRttiVisibility = [vcPublic, vcPublished];
type
{ Настройки RTTI по-умолчанию}
{$RTTI INHERIT
METHODS(DefaultMethodRttiVisibility)
FIELDS(DefaultFieldRttiVisibility)
PROPERTIES(DefaultPropertyRttiVisibility)}
Здравствуйте, wellwell, Вы писали:
W>Тем кто выпускает, или планирует выпускать программы скомпиленные в Delphi 2010, будет интересно. Тама есть новая фича, которая по умолчанию включена — RTTI.
Точнее — расширенный RTTI. Фактически это то что в других языках называется Reflection.
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Здравствуйте, PolyTech, Вы писали:
PT>Здравствуйте, AWSVladimir, Вы писали:
AWS>>1. WriteComponent AWS>>2. Пропатчить Writer/Reader AWS>>3. RunTime Create
PT>Можно "проще" — через перехват API, работающих с ресурсами программы (FindResource/LockResource etc), с помощью которых грузятся DFM-ки. Для этого достаточно будет написать DLL-ку, которая будет перехватывать необходимые API на уровне IAT программы (у рихтера есть примеры) и написать простейший "менеджер" ресурсов, который будет выделять память и декриптовать ресурсы по запросу программы. При этом в самой VCL ничего не нужно переделывать.
и что мешает злоумышленнику написать шлюз к твоей dll?? код который сидит в длл всегда можно подменить, так что это не защита.