- Регистрация
- 9 Май 2015
- Сообщения
- 1,486
- Баллы
- 155
Автоматизация x64dbg позволит создавать собственные инструменты для типовых задач отладки, таких как распаковка файлов, поиск сигнатур, перехват или подмена на лету результатов работы функций и даже фаззинг в оперативной памяти! Давай посмотрим, какие есть способы сделать это и как ими пользоваться.
Встроенный интерпретатор
Для быстрого решения повседневных задач в отладчик встроен простой скриптовый язык. Давай рассмотрим скрипт на нем, который будет распаковывать файл, накрытый UPX — самым распространенным упаковщиком.
//start
msg "upx (3.91) unpacker"
msg "make sure you're at the entry point of the program before you continue"
pause
//clear breakpoints
bc
bphwc
//script start
step
bphws csp,r
erun
bphwc
//find oep jump
find cip,"80E9" //some pattern
cmp $result,0
je error
//go to OEP
bp $result+1
erun
bc
sti
//finish script
ret
error:
msg "didn't find oep jump"
ret
Синтаксис говорит сам за себя: имя команды, за которым следует разделяемый запятыми набор аргументов. Комментарий идет после двух слешей. Строчки обрамляются двойными кавычками. Цифровые константы интерпретируются как шестнадцатеричные числа, то есть число 100 на самом деле значит 256.
Одна и та же команда может иметь несколько имен, в длинной и короткой форме. Например, команда SetBPX, устанавливающая точку останова, может быть записана как bp. Короткая запись удобна для управления отладчиком из встроенной консоли, расположенной снизу.
Результат команды msg
Готовый скрипт можно загрузить из текстового файла, а затем отдать на исполнение или запустить пошаговую отладку скрипта, нажимая Tab для перехода на следующую строку.
Исполняем по одной команде за раз
Разберем, что делает скрипт, переписав команды в длинной форме:
pause
//clear breakpoints
DeleteBPX
DeleteHardwareBreakpoint
//script start
StepOver
SetHardwareBreakpoint csp,r
erun
DeleteHardwareBreakpoint
//find oep jump
find cip,"80E9" //some pattern
cmp $result,0
je error
//go to OEP
SetBPX $result+1
erun
DeleteBPX
StepInto
//finish script
ret
error:
msg "didn't find oep jump"
ret
Первая команда — pause — останавливает выполнение скрипта, после чего его необходимо запустить вручную, исполнение продолжится со следующей команды. Это удобно, когда от пользователя требуется выполнять действие, например ставить EIP на точку входа.
Встроенный интерпретатор
Для быстрого решения повседневных задач в отладчик встроен простой скриптовый язык. Давай рассмотрим скрипт на нем, который будет распаковывать файл, накрытый UPX — самым распространенным упаковщиком.
//start
msg "upx (3.91) unpacker"
msg "make sure you're at the entry point of the program before you continue"
pause
//clear breakpoints
bc
bphwc
//script start
step
bphws csp,r
erun
bphwc
//find oep jump
find cip,"80E9" //some pattern
cmp $result,0
je error
//go to OEP
bp $result+1
erun
bc
sti
//finish script
ret
error:
msg "didn't find oep jump"
ret
Синтаксис говорит сам за себя: имя команды, за которым следует разделяемый запятыми набор аргументов. Комментарий идет после двух слешей. Строчки обрамляются двойными кавычками. Цифровые константы интерпретируются как шестнадцатеричные числа, то есть число 100 на самом деле значит 256.
Одна и та же команда может иметь несколько имен, в длинной и короткой форме. Например, команда SetBPX, устанавливающая точку останова, может быть записана как bp. Короткая запись удобна для управления отладчиком из встроенной консоли, расположенной снизу.

Результат команды msg
Готовый скрипт можно загрузить из текстового файла, а затем отдать на исполнение или запустить пошаговую отладку скрипта, нажимая Tab для перехода на следующую строку.

Исполняем по одной команде за раз
Разберем, что делает скрипт, переписав команды в длинной форме:
pause
//clear breakpoints
DeleteBPX
DeleteHardwareBreakpoint
//script start
StepOver
SetHardwareBreakpoint csp,r
erun
DeleteHardwareBreakpoint
//find oep jump
find cip,"80E9" //some pattern
cmp $result,0
je error
//go to OEP
SetBPX $result+1
erun
DeleteBPX
StepInto
//finish script
ret
error:
msg "didn't find oep jump"
ret
Первая команда — pause — останавливает выполнение скрипта, после чего его необходимо запустить вручную, исполнение продолжится со следующей команды. Это удобно, когда от пользователя требуется выполнять действие, например ставить EIP на точку входа.
Источник: