Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
[Immunity Dbg Python Scripting] |

17.06.2008, 16:29
|
|
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме: 4226446
Репутация:
1564
|
|
[Immunity Dbg Python Scripting]
[Immunity Dbg Scripts]
[Intro]
Извиняюсь за долгое свое отсутствие и слабую активность в последнее время – виной тому экзамены и некоторые финансовые затруднения. Сейчас, настало некое “furore poetico”, образно выражаясь, конечно. Появилось некоторое количество свободного времени, которое можно потратить с пользой.
[Scripting]
Решила поднять эту тему, так как имунити дбг и скрипты под него до сего момента не особенно активно обсуждались в разделе. Так же меня не устраивало то, что за все время нашла сборничек из 15 скриптов (кто смотрел, обнаружил, что, например, некоторые там явно под ODbgScript) и 13 плагинов + довольно скудный набор примеров в самом отладчике. Потом все имеющееся плохо откомментировано, если вообще откомментировано. Сей пробел я и собираюсь заполнить.
В данной теме постим скрипты под иммунити.
Только просьба – комментируйте подробно код- это необходимое условие. И описание небольшое делайте.
Начну
Некогда (не так давно, кстати) на tuts4you выкладывался UnPackMe Mimoza 0.86 – под него писала скрипт сначала под OllyScript, а затем из спортивного интереса написала на питоне
Код:
# -*- coding: cp1251 -*-
from immlib import *
import struct,sys
#------------------------------------------------------------------------------|
#-------------------0x0c0de (c) 2008-----------------------------------|
#------------------------------------------------------------------------------|
#----------Mimoza 0.86 Unpacking script-----------------------------|
def main(args):
imm = Debugger()
v_alloc_address = imm.getAddress("kernel32.VirtualAlloc") # получаем адрес VirtualAlloc
if v_alloc_address>0: # если адрес получен успешно
imm.Log(" ")
imm.Log("VirtualAlloc address-> 0x%08X " % v_alloc_address)
imm.setHardwareBreakpoint(v_alloc_address,1,4)
imm.Log("Breakpoint at -> 0x%08X " % v_alloc_address)
imm.Log("Running ..")
imm.Run()
regs=imm.getRegs()
addres_of_region =regs['EAX']
imm.Log("Address Region -> 0x%08X " % addres_of_region) #в лог пишем адрес региона, где лежит наш файл
size_=regs['ECX']
imm.Log("Region size-> 0x%08X " % size_) # выводим в лог размер файла
imm.runTillRet() # Ctrl+F9
imm.stepIn() # F7
regs=imm.getRegs() # получаем все регистры
cur=regs['EIP']+53 # получаем адрес команды REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] - текущий eip+53
imm.setHardwareBreakpoint(cur,1,4) # ставим аппаратную точку останова на команду REP MOVSB
imm.Run() # F9
imm.setReg('ECX',size_)
imm.stepOver() # F8
imm.stepOver() # F8
f=open("Mimoza_unpacked.exe", "wb") # создаем файл для дампа
buff_=imm.readMemory(addres_of_region,size_) #записываем в него содержимое нашего распакованного файла
f.write(buff_)
f.close()
imm.Log("Unpacked file at Mimoza_unpacked.exe")
else:
imm.Log("No address")
return "Done"
# поместите файл mimoza.py в директорию PyCommands ImmunityDbg и вызывайте командой !mimoza
Обратите внимание на то, что вначале я указываю кодировку. Иначе комментарии на русском не прокатят (о кодировках написано в любом учебнике/документации по питону)
Скрипт поиска апи-функции во всех загруженных в АП процесса модулях
Код:
# -*- coding: cp1251 -*-
from immlib import*
#данный скрипт осуществляет поиск функции, полученной в качестве аргумента во всех загруженных модулях
#вызов скрипта !apifinder имя_функции в командной строке (сам скрипт поместите в директорию PyCommands)
def main(args):
imm = Debugger()
imm.Log("Simple Api Finder by 0x0c0de")
modul_list=imm.getAllModules() #получаем имена всех модулей, подгруженных в АП
for mod in modul_list.keys(): # цикл обработки всех имен модулей
lenstr=len(mod)-3 # убираем расширение
mystr="" #очищаем буфер
func_addr=0
for char_ in mod:
if lenstr>0:
mystr=mystr+char_
else:
func_addr=imm.getAddress(mystr+args[0]) #получаем адрес функции
if func_addr>0: # если не возникло ошибки, адрес получен
imm.Log(mod+" function "+args[0]+" address -> 0x%08X " % func_addr)
return "All good. See log window" #завершаем работу скрипта
else:
imm.Log("No function " +args[0]+" in "+mod)
break
lenstr=lenstr-1
return "No function! See log window" #если получает управление эта команда, то функция не найдена
Мелочь, а приятно. Запуск нужный тулз из имунити.
Код:
import sys,os
def usage(imm):
imm.Log(" Tools runner by 0x0c0de")
def main(args):
os.startfile("C:\Tools\Lord\LordPE.EXE")
os.startfile("C:\Tools\ImpREC 1.7c\ImpREC 1.7c\ImportREC.exe")
return "Done!"
Используйте скрипт hidedebug с опцией All_Debug для убийства типичной антиотладки (его здесь не привожу, так как его можно нарыть в вышеупомянутой сборке (в конце поста я приведу все ссылки)
Next…
Код:
# -*- coding: cp1251 -*-
from immlib import *
import struct,sys
#антиотладку убиваете !hidedebug All_Debug (см выше по тексту)
# обязательно поставьте в опциях игнорирование всех исключений Alt+O вкладка Exceptions - везде галочки
#скрипт помещаете в директорию PyCommands ImmunityDbg и запускаете командой !имя_скрипта
#simple YodaCrypter OEP Finder by 0x0c0de
def main(args):
imm=Debugger()
isdebpres = imm.getAddress("kernel32.IsDebuggerPresent") # определяем адрес IsDebuggerPresent
imm.setBreakpoint(isdebpres) # ставим обычный бряк на функцию
imm.Run() #F9
imm.deleteBreakpoint(isdebpres) #удаляем бряк
imm.runTillRet() # Ctrl+F9
imm.stepIn() # F7
imm.runTillRet() # Ctrl+F9
imm.stepIn() #F7
cur = imm.getCurrentAddress() #Получаем текущий адрес
cur = cur+31 #Адрес команды push eax
imm.setHardwareBreakpoint(cur,1,4) # ставим бряк на push eax
imm.Run() #запускаем прогу
regs=imm.getRegs() #получаем все регистры
addres_of_seh =regs['EAX'] #в eax - адрес нужного нам seh-обработчика
imm.setHardwareBreakpoint(addres_of_seh+36,1,4)
imm.Run() #запускаем программу
regs=imm.getRegs() #получаем все регистры
imm.setHardwareBreakpoint(regs['EDI'],1,4) #ставим breakpoint на oep
imm.Run() #Запускаем
imm.Log("OEP -> 0x%08X " % regs['EDI'])
return "Done. See log window"
Итак, так же OEP finder. Читаем комменты к коду. Так как есть определенное искажение текста скрипта при его копипасте из поста и в пост – лучше скачайте архив (ниже ссылки - если не нра файлообменник - я перезалью кому надо)..
Код:
# -*- coding: cp1251 -*-
from immlib import *
import struct,sys
#------------------------------------------------------------------------------|
#-------------------0x0c0de (c) 2008-----------------------------------|
#------------------------------------------------------------------------------|
#----------12311134 OEP Finder script---------------------------------|
def main(args):
imm = Debugger()
imm.Log("Running 12311134 oep finder script..")
gpa_address = imm.getAddress("kernel32.GetProcAddress") # получаем адрес GetProcAddress
if gpa_address==0: # произошла ошибка и нельзя получить адрес нужной функции
return "No address GetProcAddress"
imm.setBreakpoint(gpa_address) # обычный брекпоинт на GetProcAddress
imm.Run() # F9
imm.deleteBreakpoint(gpa_address) #удаляем бряк с GetProcAddress
imm.runTillRet() # Ctrl+F9
imm.stepIn() # F7
cur=imm.getCurrentAddress() # текущий адрес
oep_per=imm.searchCommandsOnModule(cur,"jmp eax") #поиск команды jmp eax
for oep_jmpeax in oep_per: # цикл по элементам списка
imm.Log("Command jmp eax found -> 0x%08X address" % oep_jmpeax[0]) # выводим в лог все адреса с командой jmp eax, но нам нужен только последний
imm.setHardwareBreakpoint(oep_jmpeax[0],1,4) # ставим на последний в списке jmp eax хардварный бряк
imm.Run() # F9
imm.stepIn() # F7
regs=imm.getRegs() # получаем все регистры
imm.Log("oep -> 0x%08X " % regs['EIP']) # записываем в лог адрес oep
return "EIP is OEP"
MEW
Код:
# -*- coding: cp1251 -*-
from immlib import *
import struct,sys
#------------------------------------------------------------------------------|
#-------------------0x0c0de (c) 2008-----------------------------------|
#------------------------------------------------------------------------------|
#----------MEW OEP Finder script-------------------------------------|
def main(args):
imm = Debugger()
imm.Log("MEW12 Dumper by 0x0c0de...")
imm.stepIn() # F7
gpa_address = imm.getAddress("kernel32.GetProcAddress") # получаем адрес GetProcAddress
if gpa_address==0: # произошла ошибка и нельзя получить адрес нужной функции
return "No address GetProcAddress"
imm.setBreakpoint(gpa_address) # обычный брекпоинт на GetProcAddress
imm.Run() # F9
imm.deleteBreakpoint(gpa_address) #удаляем бряк с GetProcAddress
imm.runTillRet() # Ctrl+F9
imm.stepIn() # F7
cur=imm.getCurrentAddress() # текущий адрес
imm.setBreakpoint(cur+5)
imm.Run()
imm.stepIn() # F7
regs=imm.getRegs() # получаем все регистры
imm.Log("oep -> 0x%08X " % regs['EIP']) # записываем в лог адрес oep
imm.setComment(regs['EIP'],'< - OEP') # коммент на oep
return "Script finished! See log window"
NSpack
Код:
# -*- coding: cp1251 -*-
from immlib import *
import struct,sys
#------------------------------------------------------------------------------|
#-------------------0x0c0de (c) 2008-----------------------------------|
#------------------------------------------------------------------------------|
#----------NSPack37 OEP Finder script-------------------------------|
def main(args):
imm = Debugger()
regs=imm.getRegs()
imm.setHardwareBreakpoint(regs['ESP']-4,2,1) # HR ESP-4
imm.Run() # f9
imm.Run() #f9
imm.stepIn() # F7
regs=imm.getRegs() # получаем все регистры
imm.Log("oep -> 0x%08X " % regs['EIP']) # записываем в лог адрес oep
imm.setComment(regs['EIP'],'< - OEP') # коммент на oep
return "Script finished! See log window"
Далее, реализовала простой поиск строки в загруженном в отладчик модуле. Функция getReferencedStrings - функция поиска всех ссылок на строки (Search for-> All referenced text strings в имунити) . Ищется именно вся строка, а не ее часть. Поиск в 2-х кодировках – ASCII и UNICODE.
Код:
# -*- coding: cp1251 -*-
from immlib import *
import struct,sys
#Простой скрипт для поиска строки
#Вызываете скрипт командой !имя_скрипта строка
#Поиск в кодировках ASCII, UNICODE
def main(args):
imm = Debugger()
if not args:
imm.Log("Error search string. No args")
return "Error. See log window"
str = " ".join(args)
imm.Log("Search string -> "+str) #выводим в лог, что ищем
str_="ASCII \""+str+"\"" #ищем строки в кодировке ASCII
cur=imm.getCurrentAddress() # получаем текущий адрес
mod_=imm.findModule(cur) #получаем информацию о загруженной в отладчик проге
hep=imm.getReferencedStrings(mod_[1]) # ищем все строки (а точнее, ссылки на них)
for info_str in hep: #пробегаемся по всем строкам
if info_str[2]==str_: #если нашли такую строку
imm.Log("String found at address (ASCII)-> 0x%08X" % info_str[0]) #выводим в лог где найдена строка
#если ничего не нашли в ASCII - попробуем найти в UNICODE
str_="UNICODE \""+str+"\"" #ищем строки в кодировке UNICODE
for info_str in hep: #пробегаемся по всем строкам
if info_str[2]==str_: #если нашли такую строку
imm.Log("String found at address (UNICODE)-> 0x%08X" % info_str[0]) #выводим в лог где найдена строка
return "Done. See log window"
[Ссылки]
http://reversengineering.wordpress.com/category/tools/immunity-debugger/ - здесь 15 скриптов и 13 плагов
http://0x0c0de.net/immscr.rar - скрипты из поста и hidedebugger
http://0x0c0de.net/examples_packed.rar - здесь примеры для тестирования скриптов
[Outro]
Если тема приживется – закреплю..
Простимулировать активность общественности могу только поощрением репутации . Ставлю от +3 за каждый выложенный рабочий скрипт (проверяйте лично перед тем, как выкладывать!).
Если у вас есть ко мне какие-либо вопросы по этой теме – пишите в pm или icq (буду только рада указанию на ошибки и неточности). Причем пользоваться лучше вторым средством связи.
Grazie dell'attenzione, 0x0c0de
Последний раз редактировалось 0x0c0de; 28.06.2008 в 19:50..
Причина: обновление ссылок
|
|
|

18.06.2008, 10:02
|
|
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме: 4226446
Репутация:
1564
|
|
Вменяемый поиск строки и универсальный (в отличие от приведенного выше). Внимательно читаем комменты - там ответы на все потенциальные вопросы=) Результат работы скрипта по обыкновению в Log Window
Код:
# -*- coding: cp1251 -*-
from immlib import *
import struct,sys,string
#------------------------------------------------------------------|
#Простой скрипт для поиска строки или ее части
#Вызываете скрипт командой !имя_скрипта строка
#------------------------------------------------------------------|
def main(args):
imm = Debugger()
if not args:
imm.Log("Error search string. No args")
return "Error. See log window"
str = " ".join(args)
imm.Log("Search string -> "+str) #выводим в лог, что ищем
cur=imm.getCurrentAddress() # получаем текущий адрес
mod_=imm.findModule(cur) #получаем информацию о загруженной в отладчик проге
hep=imm.getReferencedStrings(mod_[1]) # ищем все строки (а точнее, ссылки на них)
for info_str in hep: #пробегаемся по всем строкам
if (info_str[2].count(str))>0: # метод count возвращает число вхождений строки str в строке info_str[2]
imm.Log("String reference found at address -> 0x%08X" % info_str[0]) #выводим в лог где найдена строка, содержащая введенную строку
return "Done. See log window"
Последний раз редактировалось 0x0c0de; 28.06.2008 в 19:39..
|
|
|

19.06.2008, 07:29
|
|
Постоянный
Регистрация: 20.08.2006
Сообщений: 327
Провел на форуме: 2472378
Репутация:
1077
|
|
На счет комментирования каждой строчки не согласен! Буду комментировать только то, что необходимо!
Итак! Наверняка все исследовали CrackME от Great'a, который использует vm. Во время исследования этой вм, мной были написаны следущие скрипты. Скрипты немного кривоваты, но в качестве оправдания скажу, что они были написаны в боевых условиях!
1: Разбор команд VM от Great'a. Данный скрипт разбирает только те команды, которые использует алгоритм защиты CrackME от Great'a.
Код:
Результат:
| Address | Message
+----------+------------------------------------------
| | ...
| |
| | -----[ Mnemonics ]-----
| |
| 004014BB | xor r4, r4
| 004014C5 | mov r5, r0
| 004014CF | add r5, r2
| 004014D9 | mov r3, dword [r0]
| 004014E3 | xor r3, r1
| 004014ED | add r4, r3
| 004014F7 | inc r0
| 00401501 | cmp r0, r5
| | Execute if less:
| 00401515 | mov [eip], 0x004014d9
| 0040151F | cmp r4, r7
| | Execute if equal:
| 00401533 | mov r8, 0x87148712
| 0040153D | mov r4, 0x00000000
| |
| | ---[ End Mnemonics ]---
Note: Address - это EIP виртуальной машины! Кстати!!! Я разбираю команду за командой и если бы Great применил старенький трюк с прыжком в середину команды или смешивание, то всё накрылось бы пиздой!
Код:
# -*- coding: cp1251 -*-
# Author: taha
# Data: 18.o6.2oo8
# Note: Разбор команд VM от Great'a. Данный скрипт разбирает только те команды, которые
# использует алгоритм защиты CrackME от Great'a.
# Результат:
#| Address | Message
#+----------+------------------------------------------
#| | ...
#| |
#| | -----[ Mnemonics ]-----
#| |
#| 004014BB | xor r4, r4
#| 004014C5 | mov r5, r0
#| 004014CF | add r5, r2
#| 004014D9 | mov r3, dword [r0]
#| 004014E3 | xor r3, r1
#| 004014ED | add r4, r3
#| 004014F7 | inc r0
#| 00401501 | cmp r0, r5
#| | Execute if less:
#| 00401515 | mov [eip], 0x004014d9
#| 0040151F | cmp r4, r7
#| | Execute if equal:
#| 00401533 | mov r8, 0x87148712
#| 0040153D | mov r4, 0x00000000
#| |
#| | ---[ End Mnemonics ]---
# Note: Address - это EIP виртуальной машины! Кстати!!! Я разбираю команду за командой
# и если бы Great применил старенький трюк с прыжком в середину команды или
# смешивание, то всё накрылось бы пиздой!
import immlib
imm = immlib.Debugger()
def get_args(ind, reg, arg):
s = ""
if reg <= 0x9:
s = "r"+str(reg)
if ind == 0x1: # Индикатор говорит нам, что команда берет DWORD по адресу reg+arg
s = "dword ["+s
if arg != 0: # При arg равном 0'ю вспоминать о нем не обязательно
s = s + " + 0x%08x" % arg
s = s+"]"
elif reg == 0xC: # reg равное 0xC, говорит о том, что arg не что иное как Immediate
s = "0x%08x" % arg
return s
def main(args):
imm = immlib.Debugger()
imm.Log("")
imm.Log(" [ Author: taha", highlight=1)
imm.Log(" Data: 18.o6.2oo8", highlight=1)
imm.Log(" Special for Antichat ]", highlight=1)
imm.Log("")
imm.Log("-----[ Mnemonics ]-----", highlight=2)
imm.Log("")
pCode = 0x4014BB
while 1:
a = (imm.readLong(pCode) & 0xFF)
opcode = a & 0x3F
bit8 = a >> 0x7
bit7 = (a >> 0x6) & 0x1
a = (imm.readLong(pCode+0x1) & 0xFF)
FieldB = a & 0x0F
FieldA = a >> 0x4
arg1 = imm.readLong(pCode+0x2)
arg2 = imm.readLong(pCode+0x6)
tReg2 = get_args(bit7,FieldA,arg2)
tReg1 = get_args(bit8,FieldB,arg1)
c_arg = 2
if opcode == 0x6:
mnem = "xor "
elif opcode == 0x3:
mnem = "mov "
if FieldB == 0xA:
tReg1 = "[eip]"
tReg2 = "0x%08x" % arg2
elif opcode == 0x4:
mnem = "add "
elif opcode == 0xA:
mnem = "inc "
c_arg = 1
elif opcode == 0xF:
mnem = "cmp "
elif opcode == 0x14:
mnem = "Execute if less: "
c_arg = 0
elif opcode == 0x10:
mnem = "Execute if equal: "
c_arg = 0
else:
break
if c_arg == 0:
imm.Log(mnem)
elif c_arg == 1:
imm.Log(mnem+tReg1, address = pCode)
elif c_arg == 2:
imm.Log(mnem+tReg1+", "+tReg2, address = pCode)
one_arg = 2
pCode += 0xA
imm.Log("")
imm.Log("---[ End Mnemonics ]---", highlight=2)
2: Далее очень полезно было бы просматривать состояние регистров! Например возьмем | 004014ED | add r4, r3 из результата работы предыдущего скрипта! Поставим условную точку останова с условием "[vm_eip] == 004014ED" и исполним мой скрипт!
Код:
# -*- coding: cp1251 -*-
# Author: taha
# Data: 18.o6.2oo8
# Note: Подсматриваем значения регистров виртуальной машины.
# Опять же, просматриваются только те регистры, которые
# задействованы в CrackME от Great'a.
import immlib
imm = immlib.Debugger()
regs = ['r0 ','r1 ','r2 ','r3 ','r4 ','r5 ','r6 ','r7 ','r8 ','r9 ',\
'eip']
def main(args):
imm.Log("")
imm.Log("Dump of registers: ", highlight=2)
imm.Log("")
count, addr_vm_regs = 0x0, 0x401400
for x in regs:
imm.Log(x+": 0x%08x " % imm.readLong(addr_vm_regs+count*4))
count += 0x1
return
|
|
|

19.06.2008, 14:30
|
|
Постоянный
Регистрация: 20.08.2006
Сообщений: 327
Провел на форуме: 2472378
Репутация:
1077
|
|
Усовершенствованная мелочь, более приятная))
Пример: !tools LordPE ImpREC
Note: Порядок неважен и регистр букв тоже!
Сообщение от Log Data
[ Tools runner by taha -> Team Antichat.ru ]
o LordPE is started
o ImpRec is started
Код:
# -*- coding: cp1251 -*-
# Author: taha
# Data: 19.o6.2oo8
# Note: Команда для запуска утилит, которые указаны в списке tools в формате alias, patch!
import os,immlib
imm = immlib.Debugger()
tools = ["LordPE","C:\Program Files\CrackersKit\LordPE\LordPE.EXE",\
"ImpRec","C:\Program Files\CrackersKit\ImpRec\ImportREC.exe"]
def main(args):
if args:
imm.Log("[ Tools runner by taha -> Team Antichat.ru ]", highlight=1)
for x in args:
x = x.lower()
for i in range(len(tools)):
if tools[i].lower() == x:
os.startfile(tools[i+1])
imm.Log(" o %s is started" % tools[i], highlight=2)
else:
imm.Log("Error!!!")
|
|
|

20.06.2008, 05:45
|
|
Постоянный
Регистрация: 20.08.2006
Сообщений: 327
Провел на форуме: 2472378
Репутация:
1077
|
|
Еще одна приятная мелочь!
Иногда нужно изменить много строчек кода! И изменять каждую, мягко говоря, неудобно. Следущая команда как раз поможет в этом вопросе! Конечно до функциональности plugin'ов типа IDAFicator или NonaWrite далеко, но это-же просто мелочь
Пример: !asmedit 0x401400
В появившемся окне пишем код и наблюдаем изменения по введенному вами адресу
Код:
# -*- coding: cp1251 -*-
# Нах комментиовать три строчки легкоусвояимоимоимого кода?
import immlib, string
imm = immlib.Debugger()
def main(args):
if args:
addr = string.atoi(args[0],16)
imm.writeMemory(addr, imm.Assemble(imm.inputBox("Asm text:")))
imm.Log("<--[ Edited ]",address=addr, highlight=2)
else:
imm.Log("Error!")
|
|
|

28.06.2008, 15:32
|
|
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме: 4226446
Репутация:
1564
|
|
Next….
Продолжаю. В комментах есть все =)
Код:
# -*- coding: cp1251 -*-
from immlib import *
import struct,sys,string
#-----------------------------c0d3d by 0x0c0de 2008---------------------------------------------------
# Работа с процессами в отладчике-----------------------------------------------------------------
#[Commands]
# 1.Аттач к процессу
# первый аргумент -a, второй аргумент - вводите имя процесса без расширения
#2. Перезапуск текущего отлаживаемого процесса - команда -r
#3. Выход из отладчика -q
#4. Пауза - ключ -p
#5. Справка по коммандам -h
#---------------------------------------------------------------------------------------------------------------
def main(args):
imm = Debugger()
if not args: # если не передано аргументов, то выводим в лог ругательство и завершаемся
imm.Log("PScript: No args")
imm.createLogWindow()
return "Error. See log window"
elif args[0]=="-a": # если сказали аттачиться к процессу
process_list = imm.Ps() # получаем информацию о запущенных процессах
for pr_info in process_list:
if pr_info[1]==args[1]: # если совпало введенное имя процесса и имя процесса в памяти
imm.Attach(pr_info[0]) #атачимся
imm.createLogWindow() #открываем log window
return "Attached =)"
elif args[0]=="-r": # команда на рестарт текущего процесса
imm.restartProcess(-2) # рестартим процесс без вывода сообщения-подтверждения (желаете с выводом - ставьте параметр -1)
d_name = imm.getDebuggedName() # получаем имя загруженного в отладчик процесса
imm.Log(d_name+" restarted ok")
elif args[0]=="-h":
imm.Log("Process script keys:")
imm.Log("Attach to process: -a process_name (no extension)")
imm.Log("Restart current process -r")
imm.Log("Close debugger -q")
imm.Log("Pause process -p")
elif args[0]=="-q": # выход из отладчика
imm.quitDebugger()
elif args[0]=="-p": # Pause
imm.Pause()
imm.Log("Pause ok")
else:
return "Invalid command. Use key -h for more info about commands"
imm.createLogWindow()
return "Done. See log window"
Код:
# -*- coding: cp1251 -*-
from immlib import *
import struct,sys,string
#-----------------------------------cod3d by 0x0c0de--------------------------------------------------------------------
# собственно, в соседней теме было объяснено в принципе все относительно crack_me by taha
# но если кто-то вдруг не понял - задачу взлома можно решить с помощью этого скрипта
# По ходу выполнения появляются комменты по нужным адресам
# Каков алгоритм генерации s/n - это я уже рассказала и показала (см. keygen)
#Все будет работать, если включить игнорирование все исключений
#все возникшие вопросы - в осеку
#---------------------------------------Nice Try!----------------------------------------------------------------------------
def main(args):
imm = Debugger()
gt_address = imm.getAddress("user32.GetDlgItemTextA")
if gt_address!=0:
imm.setBreakpoint(gt_address+5)
imm.Log("Breakpoint at GetDlgItemTextA -> 0x%08X" % (gt_address+5))
# потом вы вводите свое имя и ключ какой-нибудь
imm.Run()
regs = imm.getRegs()
imm.setComment(regs['EIP'],'<-Reading input')
imm.deleteBreakpoint(gt_address+5) # удаляем бряк
imm.runTillRet()
imm.stepIn() # F7
seh_list = imm.getSehChain() # получаем список из обработчиков seh
for seh_handler in seh_list:
imm.Log("Seh handler -> 0x%08X " % seh_handler[1])
imm.setBreakpoint(seh_handler[1])
imm.Log("Breakpoint sets at -> 0x%08X" % seh_handler[1])
imm.Log("Running ...")
imm.Run()
for seh_handler in seh_list:
imm.deleteBreakpoint(seh_handler[1])
imm.Log("Breakpoint deleted at -> 0x%08X" % seh_handler[1])
regs = imm.getRegs()
imm.setComment(regs['EIP'],'<-Seh handler')
imm.setBreakpoint(regs['EIP']+33) # устанавливаем бряк на call vm_proc
imm.Run()
imm.setComment(regs['EIP']+33,'<-vm proc call')
imm.deleteBreakpoint(regs['EIP']+33)
imm.setBreakpoint(0x402113)
regs = imm.getRegs()
while regs['EAX']!=0x0BADC0DE: # цикл пока eax не станет равным 0BADC0DE
imm.Run()
regs = imm.getRegs()
imm.deleteBreakpoint(regs['EIP'])
imm.stepIn()
regs = imm.getRegs()
imm.Log("Serial number for your name at address [DWORD]-> 0x%08X " %regs['EDX'])
# серийный номер - дворд, лежащий по адресу, указанному в логе
sn = imm.readLong(regs['EDX'])
imm.Log("Serial number-> %08X " %sn)
imm.createLogWindow()
return "This all =)"
Код:
# -*- coding: cp1251 -*-
from immlib import*
#----------------------------------c0d3d by 0x0c0de----------------------------------------------
# данный скрипт ставит бряки на все команды, указанные в качестве аргумента
# например !имя_скрипта push eax
#bp будут поставлены на все команды push eax в данном модуле
#---------------------------------------------------------------------------------------------------------
def main(args):
imm = Debugger()
if not args:
return "Error. No args"
cmm = " ".join(args)
comm_list = imm.searchCommandsOnModule(imm.getCurrentAddress(),cmm) # находим все команды
imm.Log("Search command "+cmm)
for comm_ in comm_list: # обрабатываем все адреса с искомой командой
imm.setBreakpoint(comm_[0]) # ставим бряки
imm.Log("Breakpoint sets at -> 0x%08X" % comm_[0])
imm.createLogWindow()
return "Done"
Последний раз редактировалось 0x0c0de; 28.06.2008 в 19:43..
|
|
|
|
 |
Похожие темы
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
Books Python
|
FRAGNATIC |
PHP, PERL, MySQL, JavaScript |
1 |
01.11.2009 18:20 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|