суббота, 19 января 2013 г.

Delphi HInstance

Глобальная переменная SysInit.HInstance инициализируется для exe модуля в SysInit._InitExe вызовом HInstance := GetModuleHandle(nil)
Фактически значение данной переменной - это указатель на адрес в памяти по которому загружен PE модуль.
Используя этот адрес можно, например, получить дату сборки проекта, получив прямой доступ к PE заголовку файла в памяти:
function GetLinkDate: TDateTime;
begin
  Result := FileDateToDateTime
    (PInteger(
      PImageNtHeaders(
        Cardinal(PImageDosHeader(HInstance)._lfanew) +  HInstance)^
    .OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE]
    .VirtualAddress + HInstance + 4
    )^);
end;

суббота, 3 ноября 2012 г.

Прошел игру natas

Прошел игру NATAS от OVERTHEWIRE =)
Первые уровни простые.
понравились уровни с подбором =)

natas9:sQ6DKR8ICwqDMTd48lQlJfbF1q9B3edT
natas10:s09byvi8880wqhbnonMFMW8byCojm8eA
natas11:SUIRtXqbB3tWzTOgTAX2t8UfMbYKrgp6
natas12:sh7DrWKtb8xw9PIMkh8OQsgno6iZnJQu
natas13:IGCXqS4x472aoHZYaidvmeoWj2GmuRYz
natas14:sSkCeug1bdrYejzAaBhgwI3qJXDKqlgh
natas15:m2azll7JH6HS8Ay3SOjG3AGGlDGTJSTV
natas16:3VfCzgaWjEAcmCQphiEPoXi9HtlmVr3L
natas17:9HBzt5ljtPAgmaYvNfZ8chZVq50oepsx

понедельник, 9 июля 2012 г.

Автоматизация в IDA

При разборе чужого кода в IDA периодически приходится выполнять ряд повторяющихся действий.
Для автоматизации процесса можно использовать встроенный интерпретатор idc:
File -> IDC command... (Shift + F2)

Для удобства можно добавить комбинацию клавиш на повтор последней команды:

AddHotkey("Shift-I", "___idc0");

После добавления комбинации можно описать тело автоматизации.

Например для обработки null-terminated строк идущих подряд:


MakeStr(ScreenEA(),BADADDR);//создать null-terminated строку в текущем положении курсора
Jump(FindUnexplored(ScreenEA(),1));//перейти к следующему не определенному полю.


вторник, 17 января 2012 г.

Прошел тест на воинское звание на сайте минобороны =)
с результатом можно ознакомиться ниже

Оптимальное копирование из Recordset в TStrings

При работе с ADO компонентами часто возникает необходимость копирования данных из Recordset в структуры, которые в дальнейшем используются в программе. Такими структурами могут быть объекты определенного класса, массивы записей, всякого рода списки и т.п.
О том как скопировать данные с наименьшими затратами я опишу далее.

четверг, 18 августа 2011 г.

TcxGridDBChartView и автоматический расчет осей (Delphi)

Для справки
В devExpress компоненте TcxGrid при построении графиков с использованием TcxGridDBChartView есть 3 варианта расчета минимального и максимального значения осей:
  • mmvZeroBasedAuto (по-умолчанию) - максимальное значение берется из данных, минимальное = 0 или при наличии отрицательных значений минимум из данных
  • mmvAuto - максимальное и минимальное значение берется из данных
  • mmvCustom - максимальное и минимальное значение берется из соответствующих свойств оси
Значение присваивается свойству MinMaxValues осей (например, DiagramLine.AxisValue.MinMaxValues)

среда, 17 августа 2011 г.

FreeAndNil, Assigned and Destructor (Delphi)

FreeAndNil и зачем он нужен
Каждый объект в Delphi имеет свой жизненный цикл.
Обычно он сводится к:
  • созданию объекта
  • манипуляциям с объектом
  • удалению объекта
При этом, объявляя переменную объекта класса мы объявляем указатель на объект данного класса
Например выражение MyList: TList; объявляет указатель с именем MyList - это все равно что мы бы написали MyList: Pointer;, с тем лишь отличием, что в первом случае указатель будет типизированным.