[Описание плагина]
Делаю небольшое описание функций либы ollylib.py.
[Скриптинг]
1. Начало работы
Любой скрипт нужно начинать с подключении ollylib.py. Делается это так
Код:
from ollylib import*
Таким образом вы сможете использовать в вашем скрипте api OllyDbg.
2. Получение значений всех регистров
Для этих целей я написала функцию GReg.
Вызывать так
Например (и сразу вывод в лог значения):
Код:
eax = GReg("Eax")
Log("eax is %X" % int(str(eax)))
esp = GReg("eSp")
Log("esp is %X" % int(str(esp)))
ebp = GReg("ebp")
Log("ebp is %X" % int(str(ebp)))
esi = GReg("esi")
Log("esi is %X" % int(str(esi)))
edi = GReg("edi")
Log("edi is %X" % int(str(edi)))
eip = GReg("eip")
Log("eip is %X" % int(str(eip)))
ss = GReg("ss")
Log("ss is %X" % int(str(ss)))
ds = GReg("ds")
Log("ds is %X" % int(str(ds)))
efl = GReg("efl")
Log("efl is %X" % int(str(efl)))
и так далее ....
Полностью пример в Get_Regs.py
Функции вывода подробнее смотреть в п.4
3. Анализ текущего модуля
AnalyseCurrentModule()
Не знаю, нужно ли это было здесь, но все равно. Пример в файле Analyse.py
4.Результат работы скрипта – информационные функции
Код:
Log(”message”) – запись в лог
Flashmes(“message”)
msg(адрес,”message”)
Err(“message”) – вывод сообщения об ошибке
Info(“message”)
Пример работы в файле Inf_func.py
5. Получение адреса библиотечной функции
Пример:
Код:
addr_ = Getfuncaddr("kernel32.LoadLibraryA")
и вывод в лог
Код:
Info("LoadLibraryA address %X" %int(addr_))
6. Ассемблирование команды
Код:
Asm(“команда”,адрес)
Пример:
Код:
Asm("sub eax,eax",0x0401000)
Теперь по адресу 0x0401000 инструкция sub eax,eax
7. Постановка хардварного бряка
Код:
Sethardbp(address,size,type)
Варианты типа бряка (последний аргумент)
Код:
HB_CODE бряк на исполнение
HB_ACCESS бряк на доступ
HB_WRITE бряк на запись
Пример постановки бряка на библиотечную функцию
Код:
laddr = Getfuncaddr("kernel32.LoadLibraryA")
Sethardbp(long(laddr),4,HB_CODE)
Вся работа с бряками в файле breaks.py
8. Удаление хардварного бряка
Удалить хардварный бряк можно двумя способами. Используя функцию
или
Код:
Deletehardbpbyaddr(адрес)
В первом случае указываете значение от 0 до 3 – номер бряка. Во втором – адрес, по которому поставлен бряк.
9. Исполнение программы
Функция Run () – эквивалент F9
Функция StepF8() – F8
Функция StepF7() - F7
Функция RunRet() – Ctrl+F9
Пример в файле ex.py
10. Атач к процессу
Можно осуществить двумя способами. Если вам известен ProcessId, то воспользуйтесь функцией
Если же вам известно имя процесса в памяти, то
Код:
Attachbyname(procname)
Пример в файле Attach.py
11. Постановка мемори-бряков
Функция
Код:
Setmembp(type,addr,size)
Варианты первого параметра
Код:
MEMBP_READ мемори-бряк на чтение
MEMBP_WRITE мемори-бряк на запись
12.Выбор и загрузка файла в отладчик
Сначала вызов диалога открытия файла
Код:
Browsefile(title,buf,ext,mode)
title – заголовок окна
buf – буфер для имени
ext – расширение файла
Пример
Код:
buf = ""
Browsefile("Test browse",buf,".exe",0)
Если вы выберете какой-то файл – в переменной buf будет путь к этому файлу
Затем нужно вызвать функцию
Производная от OpenEXEfile из Олиного апи=)
В нашем случае
Пример в файле open.py
13. Приостановка процесса
14. Восстановление всех нитей процесса
15. То, же, что 14, только для 1 треда
Код:
Runthread(thread_id)
16. Дамп региона в файл
Код:
Dumpreg(file_name,base,size)
file_name – имя файла
base – адрес начала региона
size – размер региона
Чтобы получить адрес начала региона воспользуйтесь функцией
Код:
Findmem(адрес_принадлежащий_региону)
Функция возвращает структуру
Код:
typedef struct t_memory { // Memory block descriptor
ulong base; // Base address of memory block
ulong size; // Size of block
ulong type; // Service information, TY_xxx
ulong owner; // Address of owner of the memory
ulong initaccess; // Initial read/write access
ulong access; // Actual status and read/write access
ulong threadid; // Block belongs to this thread or 0
char sect[SHORTLEN]; // Name of module section
char *copy; // Copy used in CPU window or NULL
ulong reserved[8]; // Reserved for plugin compatibility
} t_memory;
OllyDbg Plugin API v1.10
*взято из PluginSDK OllyDbg (так как не у всех читающих он есть)
В этой структуре нам надо 2 поля base и size…
Пример в файле dump.py