Сейчас на форуме: (+3 невидимых)

 eXeL@B —› Дневники и блоги —› Demon666 blog: PyCracklab
Посл.ответ Сообщение

Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 28 января 2009 21:52
· Личное сообщение · #1

!!!Варнинг! - элитные пацаны тут нихрена нового для себя не найдут!!!
Так что просим их лесом нах, сторонкой обходить этот блог

Ппц, наверно дахрена написал ну хрен сним, как-нибудь %))))

Тут я о питоне рассказывать буду немного, ну сталобыть пиарить ;)
Один хрен все мы там рано или поздно будем ©кто-то там сакзал..

По традиции начну про установку немного, а то у легальных пользователей есть питон и у нас теперь тоже типа будет %))

Сливаем:
http://idapython.googlecode.com/files/idapython-1.0.0.zip (~200kb)
http://code.google.com/p/idapython/ - более подробно
также советую слить в обязательном порядке
http://idapython.googlecode.com/files/idapython-reference-1.0.0.zip (~900kb)
да-да, это то, что нужно для полного счастья %))) короче те функи итд., которые можно заюзать

копируем плагин python.plw в директорию с плагинами из архива idapython-1.0.0.zip
C:\Program Files\IDA\plugins
создаем папку с именем python в директории C:\Program Files\IDA
и копируем туда в директорию C:\Program Files\IDA\python из архива idapython-1.0.0.zip четыре файла с именами
idc.py idautils.py idaapi.py init.py
вроде все!.. но..

Но этот плагин работать не может без еще одного.. и самого главного!
Все наверное в свое время скачали отладчег для девочег %)) Immunity
Так вот внутри этого Immunity инстала находится python-2.5.msi
Надо его просто тупо установить у себя на комп
копируем из C:\Python25 библиотеки python25.dll и msvcr71.dll в директорию где установлена IDA
C:\Program Files\IDA
и все, настройка питона закончена для нубиков, но на этом безграничные возможности питона не заканчиваются....

Здесь я покажу, как при помощи питона убрать обфускацию с TLS в файле накрытым Elemental Protector v.2.0 by Smon
Скачать можно от сюда:
http://exelab.ru/f/files/f7a2_27.01.2009_CRACKLAB.rU.tgz
Вообще считаю, что если кто-то стремиться стать элитным крэкером, то именно надо начинать с этого прота - в нем есть все, чтобы тестировать свои движки, скрипты итд. на начальном этапе их создания
Если движок не смог пройти тест на Elemental, то грош цена такому кодесу! – ИМХО %))

И так для начала при открытии Keygen.exe(именно этот файл у нас будет жертвой)далее будем называть кг(гы-гы, многие наверно сейчас дальше додумали /ам, но нет %)) фсе просто КейГен – хотя кг/ам можно перевести как: - "креатифф гуд, аффтар маладец")

надо еще настроить ИДУ для удобств..
При открытии кг в ИДЕ появится окно "Load a new file" в Analysis нужно снять галочку с Enabled
Фух фсе, мы быстро справились по нужде %)
Теперь надо перейти на вкладку Exports и там два раза кликаем на TlsCallback_0 и мы в TLS сразу и попадаем
Гы-гы, и что мы там сразу видим %))(ай-ай-ай;)) ладно не будем, ведь наша цель НЕ антиотладко, а снятие обфускации для того, чтобы взглянуть на те шалости что под ней спрятаны ;)
Чтобы этот код больше не видеть, выделите код с адреса 0042DB38 до 0042DB4F и нажмите "-" на цифровой клаве
Появится окно Hidden area напишите там просто тупо "ollybug" и в color выберете красный цвет и OK
ИДА этот гуано кодес спрячед, но его можно всегда посмотреть установив курсор на красную полосу с именем "олибаг" и нажав на цифровой клаве клавишу "+"

Еще для удобств надо немного настроить ИДУ
Меню->Options->General...

На вкладке Disassembly
В Display disassembly lines уберите галочки с Empty lines и Borders between data/code
в поле Number of opcode byte пишем 10 и поле Instructions indention 2 и OK - должны появится опкоды..

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 28 января 2009 21:52
· Личное сообщение · #2

Для того чтобы писать деобфускатор, нужно проанализировать код..
Вообще, так немного хотелось сказать, что деобфускатор пишется под конкретный/определенный код и универсальный быть не может, он только автоматизирует определенный процесс
Он будет хорошо работать на одном коде(идентичном, под который писался/делался), но будет "падать" на другом, где техника в значительной степени запутывания кода(мыслей в мозге реверсера), была другая..
.. и так, посмотрим на такой код
Code:
  1. .SmoN:0042DB50 E8 04 00 00 00 call loc_42DB59
  2. .SmoN:0042DB55 E9 db 0E9h ; ù
  3. .SmoN:0042DB56 EB db 0EBh ; û
  4. .SmoN:0042DB57 06 db 6
  5. .SmoN:0042DB58 EB db 0EBh ; û
  6. .SmoN:0042DB59 loc_42DB59:
  7. .SmoN:0042DB59 FF 04 24 inc   dword ptr [esp]
  8. .SmoN:0042DB5C C3 retn
  9. .SmoN:0042DB5D EB db 0EBh ; û

Все банально просто, прыжок call loc_42DB59
в стеке адрес возврата увеличивается на единицу
тем самым попадая на адрес 0042DB56
установим на этот адрес курсор и давим клавишу "C"
получаем:
Code:
  1. .SmoN:0042DB50 E8 04 00 00 00 call loc_42DB59
  2. .SmoN:0042DB55 E9 db 0E9h ; ù
  3. .SmoN:0042DB56 EB 06 jmp short loc_42DB5E
  4. .SmoN:0042DB58 EB db 0EBh ; û
  5. .SmoN:0042DB59 loc_42DB59:
  6. .SmoN:0042DB59 FF 04 24 inc   dword ptr [esp]
  7. .SmoN:0042DB5C C3 retn
  8. .SmoN:0042DB5D EB db 0EBh ; û
  9. .SmoN:0042DB5E loc_42DB5E:
  10. .SmoN:0042DB5E 60 pusha
  11. .SmoN:0042DB5F E8 04 00 00 00 call  loc_42DB68

Если далее посмотреть то все повторяется, хм.. что мы видим..
А видим мы что в коде присутствуют опкоды E9, EB итд. которые влияют на дизасм движки
Заставляя создавать ложные прыжки, начинать дизасмить с неправильного адреса, замедлять анализ кода итд. по этой причине нам пришлось выключить анализ кода при открытии кг снятием галочки с Enabled при старте
При нажатии на клавише "C" код у нас превратился в джамп с прыжком на 42DB5E
Хм.. а там у нас 0042DB5E 60 pusha вот это и есть то что нам нужно остальное мусор
Давайте посмотрим на опкоды которые мы включили в настройках
E8 04 00 00 00 E9 EB 06 EB FF 04 24 C3 EB
Константа? Вот эта сигна – и есмь зло, которое вставляет двиг обфускатора(вернее только одна лишь его функция)
Каг сие побороть?, можно просто тупо занопить – хм.., а что мы ведь только начали, так таг и сделаем, понаблюдаем что произойдет дальше - мы ведь пишем скрипт, а не тупо компилируем плагин при малейшем пуке %))) поэтому нудная перекомпиляция нам не грозит ;)
Хотя нопить это все-таки банально, я ща подумал это всегда успеем, а вот сворачивание гуано кода это пожалуй на начальном этапе лучше, про это пожалуй и напишу

Ну вот после нудной писанины про анализ мы и начинаем писать скрипт на питоне
Но вопрос в каком редакторе кода нам его писать? В вин-блокноте? Хз. наверное лучше выпить яду %))
Есть очень адская ИДЕ для питона Эрик ее зовут, но - это тоже жесть, там одни только танцы с бубном по ее настройке чего только будут стоит, но они того стоят %)) считаю лучшая ИДЕ, которую видел для написания скриптов.. тем более что написана эта ИДЕ на питоне :P
Но да ладно, а то я щаз расплачусь от сентиментальности %)))
Самый лучший вариант для простоты заюзать гуд блокнот EmEditor - www.emeditor.com/
там подсветка кода страшная по дефолту такая, но с помощью регулярок настраивается сносно, короче юзать для скриптов на коленке претендент хороший, ну а там кому что больше нравиццо...

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 28 января 2009 21:53
· Личное сообщение · #3

Для начала нужно подключить модули питона
Ну это что-то типа LoadLibrary, которая загружает dll
Тут два варианта есть
from idaapi import *
или
import idaapi
различия у них есть, но скажу пожалуй только одно
если юзать
import idaapi
то придется при вызове функций из SDK ИДЫ писать
для примера:
idaapi.askaddr(0, "string")
а если
from idaapi import *
то
askaddr(0, "string")
короче получается код c from idaapi import *
чтобы мосх не трахать пишем тупо

from idc import *
from idaapi import *
from idautils import *

здесь символ "*" после import
разрешает использовать все функции предоставляемые модулем
символ "#" это комментарий в питоне
теперь стоит сказать о русских буквах в скриптах, просто так их в питоне не напишешь
да и вообще с кодировкой там лол неоправданный
если писать в скрипте русские буквы
выскочит мессага в лог типа:
SyntaxError: Non-ASCII character '\xfd' in file C:/.../.../O_o.py on line 7, but no encoding declared; see www.python.org/peps/pep-0263.html for details
лечится такая трабла добавлением в начале кода строчки
#-*- coding: cp1251 -*-
да-да, на первый взляд это комментарий, но это не так
это так указывается кодировка в питоне, которая юзается в скрипте, у нас это cp1251
эта строка должна в win32 быть всегда самой первой в скрипте и неипет!

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 28 января 2009 21:53
· Личное сообщение · #4

Теперь о загадочной askaddr
askaddr(address, "string")
Эта та же самая API функция, вызываем и передаем ей параметры(два параметра)
Первый параметр значение по умолчанию, типа адрес который появится в комбобоксе
А второй просто строку, ну например пояснение что нужно вводить
У нас обфускация начинается с адреса 0042DB38
Сталобыть пишем:
address = askaddr(0x0042DB38, "Enter an address:")
так теперь у нас есть код, который уже можно запустить на выполнение
создаем пустой файл в директории с кг и назовем его чич-то O_o.py
откроем его в EmEditor и копипастим туда такой код:
Code:
  1. #-*- coding: cp1251 -*- 
  2. #=================
  3. from idc import *
  4. from idaapi import *
  5. from idautils import *
  6. #=================
  7. address = askaddr(0x0042DB38, "Enter an address:")

Теперь в ИДА меню->File->Python file... и в появившемся окне выбираем файл O_o.py
Должно появиццо окно Please enter an address для ввода адреса, но он уже у нас там есть по дефолту, это так чисто для примера – жмем OK
Теперь момент истены – будем писать полезный код
Code:
  1. addr = address
  2. for i in range(35):
  3.          addr = find_binary(addr, addr+500, "E8 04 00 00 00 E9 EB 06 EB FF 04 24 C3 EB", 16, SEARCH_DOWN)
  4.          print "%08X %d" % (addr, i)
  5.          if addr == 0xFFFFFFFF: 
  6.                  break
  7.          add_hidden_area(addr, addr+14, "sign", "", "", 0xFFFF00)
  8.          addr += 1

Теперь поясню что это вообще такое
for i in range(35):
for – это что-то типа команды loop на асме, а range(35) – это типа mov ecx,35
это цикл повторяющийся 35 раз(35 на первом этапе взято от елды, потому как мы незнаем сколько раз будет повторяццо сигна в коде)
еще в питоне конец цикла ограничивается отступом
лучше юзать один таб чтобы путаницы не было, его длину можно потом в редакторе кода настроить кому как больше нравится
отступы надоооо строго соблюдать это синтаксис питона
короче если в лог окне у ИДЫ выскочит типа такой мессаги
IndentationError: expected an indented block
Это значит что где-то отступ кривой

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 28 января 2009 21:54
· Личное сообщение · #5

find_binary – это функа ИДЫ для поиска по сигнатуре, принимает 5 параметров
первый – стартовый адрес, второй – конечный адрес – диапазон поиска
тут мы addr = address
присваивали address постоянное значение 0x0042DB38 и потом присваиваем его же переменой addr
ну это типа как в олиных скриптах
там чета типа
var addr
var address
только здесь можно писать почти в любом месте
addr+500 питон прибавит к 0x0042DB38+500 и уже запишет нужный резултат
в олиных скриптах там наверно полный изеб будет, хотя хз..
третий параметр наша сигна что ищем
четвертый – это мы указываем шестнадцатеричный формат для правильного восприятия
пятый - поиск вниз, короче с буржуйского хорошо переводится
там еще есть другие режимы поиска, если надо
SEARCH_UP
SEARCH_DOWN
SEARCH_NEXT
SEARCH_CASE
SEARCH_REGEX
SEARCH_NOBRK
SEARCH_NOSHOW
SEARCH_UNICODE
SEARCH_IDENT
SEARCH_BRK

print "%08X %d" % (addr, i)
выводит в окно лога нужную инфу
короче адреса по которым нашел сигны
если кликнуть два раза на нужном, то будет переход на этот адрес ну и номер счета сигнатур
чтобы видеть сколько всего нашел

if addr == 0xFFFFFFFF:
break
это проверка на возвращаемое значение адреса где нашел
если addr будет равен 0xFFFFFFFF – значед ппц больше нет сигн в коде в этой секции кода

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 28 января 2009 21:54
· Личное сообщение · #6

add_hidden_area – эта функа ИДЫ как раз тарит гуано кодес
первый – стартовый адрес, второй – конечный адрес – диапазон сворачивания кода
там у нас сигна 14 байт – поэтому и addr+14
третий – строка "sign" чич-то будет написана когда свернута
четвертый и пятый строки когда развернут код будет написано внизу и вверху, нам оно нах не надо щаз, поэтому там просто кавычки типа пусто
и последний цвет в который окрасится свернутый код, там тупо любой цвет можно сделать для каждой сигны свой цвет
ну и
addr += 1
это смещение чтобы на одном месте не топтаццо
вроде фсе %)))
ЗЫ: честно не помню на какой планете грибами питался с зелеными человечками ;)
Теперь полностью код
Code:
  1. #-*- coding: cp1251 -*- 
  2. #=================
  3. from idc import *
  4. from idaapi import *
  5. from idautils import *
  6. #=================
  7. address = askaddr(0x0042DB38, "Enter an address:")
  8. addr = address
  9. for i in range(35):
  10. addr = find_binary(addr, addr+500, "E8 04 00 00 00 E9 EB 06 EB FF 04 24 C3 EB", 16, SEARCH_DOWN)
  11.          print "%08X %d" % (addr, i)
  12.          if addr == 0xFFFFFFFF: 
  13.                  break
  14.          add_hidden_area(addr, addr+14, "sign", "", "", 0xFFFF00)
  15.          print "%08X %d" % (addr, i)
  16.          addr += 1

Чет подзаипался уже писать, наверно оно нах никому не надо, но хс еще чуток моно
Нужно этот код тупо по-первой скопипастить в файл как раньше делали и запустить!
Что видим нашел 30 сигн, ну это уже что-то %))
Теперь там под цветными строками
Ставим курсор и жмем "С"

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 28 января 2009 21:55
· Личное сообщение · #7

Кусочег кода что получиццо должно:
Code:
  1. .SmoN:0042DB50                               ; sign
  2. .SmoN:0042DB5E 60                              pusha
  3. .SmoN:0042DB5F                               ; sign
  4. .SmoN:0042DB6D 31 DB                           xor   ebx, ebx
  5. .SmoN:0042DB6F                               ; sign
  6. .SmoN:0042DB7D F3 9C                           rep pushf
  7. .SmoN:0042DB7F                               ; sign
  8. .SmoN:0042DB8D 81 EB 00 01 00 00               sub   ebx, 100h
  9. .SmoN:0042DB93                               ; sign
  10. .SmoN:0042DBA1 F7 DB                           neg   ebx
  11. .SmoN:0042DBA3                               ; sign
  12. .SmoN:0042DBB1 21 1C 24                        and   [esp], ebx
  13. .SmoN:0042DBB4                               ; sign
  14. .SmoN:0042DBC2 58                              pop   eax
  15. .SmoN:0042DBC3                               ; sign
  16. .SmoN:0042DBD1 83 E8 D0                        sub   eax, 0FFFFFFD0h
  17. .SmoN:0042DBD4                               ; sign
  18. .SmoN:0042DBE2 64 8B 00                        mov   eax, fs:[eax]
  19. .SmoN:0042DBE5                               ; sign
  20. .SmoN:0042DBF3 8A 40 02                        mov   al, [eax+2]
  21. .SmoN:0042DBF6                               ; sign
  22. .SmoN:0042DC04 84 C0                           test  al, al

Теперь откроем EmEditor и скопипастим этот код из ИДЫ в него
Хм.. все вроде гуд, но строка
.SmoN:0042DBF6 ; sign
Всю малину обсерает, что делать? Бу-го-га, да фсе просто
В EmEditor жмем Ctrl+H и появится окно Replace там ставим галочку на Use Regular Expressions и в поле Find: пишем вот такую регулярку, надеюсь форум слеши не съест, короче должен быть первым и перед последней n(так на всякий случай)
\.SmoN.*sign\n
Поле Replace with: должно быть обязательно пустым и жмем кнопку Replace All
Результат:
Code:
  1. .SmoN:0042DB5E 60                              pusha
  2. .SmoN:0042DB6D 31 DB                           xor   ebx, ebx
  3. .SmoN:0042DB7D F3 9C                           rep pushf
  4. .SmoN:0042DB8D 81 EB 00 01 00 00               sub   ebx, 100h
  5. .SmoN:0042DBA1 F7 DB                           neg   ebx
  6. .SmoN:0042DBB1 21 1C 24                        and   [esp], ebx
  7. .SmoN:0042DBC2 58                              pop   eax
  8. .SmoN:0042DBD1 83 E8 D0                        sub   eax, 0FFFFFFD0h
  9. .SmoN:0042DBE2 64 8B 00                        mov   eax, fs:[eax]
  10. .SmoN:0042DBF3 8A 40 02                        mov   al, [eax+2]
  11. .SmoN:0042DC04 84 C0                           test  al, al

Вот так за несколько минут убирается обфускация
Но что мы видим у нас есть код, который не был обработан
Начиная с адреса 0042DC06
Code:
  1. .SmoN:0042DC06 EB 03                           jmp   short loc_42DC0B
  2. .SmoN:0042DC08 E8                              db 0E8h ; ø
  3. .SmoN:0042DC09                               loc_42DC09:
  4. .SmoN:0042DC09 EB 03                           jmp   short loc_42DC0E
  5. .SmoN:0042DC0B                               loc_42DC0B:
  6. .SmoN:0042DC0B EB FC                           jmp   short loc_42DC09
  7. .SmoN:0042DC0D E9                              db 0E9h ; ù
  8. .SmoN:0042DC0E                               loc_42DC0E:
  9. .SmoN:0042DC0E 8B 04 24                        mov   eax, [esp]

Но если посмотреть то можно увидеть что и здесь есть закономерность, а сталобыть и сигна
EB 03 E8 EB 03 EB FC E9
Так как эта сигна короче первой ее искать будем позже

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 28 января 2009 21:55
· Личное сообщение · #8

Пожалуй немного расскажу про свертывание кода в ИДЕ
Тут действует принцип – первой сигнатуры
Что это за херня, а все просто самая длинная сигна должна искаться первой
Потом уже маленькие потом еще короче и так до самой маленькой
Потому что в свернутом ранее коде уже ничего не будет сворачиваться, а это показывает то, что если первые будут искаться маленькие сигны они могут входить в состав больших и тем самым если потом искать большие после маленьких они вообще не будут найдены
Короче.. хуй его знает, каг еще проще объяснить %))

Код:
Code:
  1. try:
  2.          addr = address
  3.          for i in range(20):
  4.                  addr = find_binary(addr, addr+500, "EB 03 E8 EB 03 EB FC E9", 16, SEARCH_DOWN)
  5.                  add_hidden_area(addr, addr+8, "sign", "", "", 0x00FFFF)
  6.                  print "%08X %d" % (addr, i)
  7.                  addr += 1
  8. except:
  9.     pass

Тут поменяли сигну и цвет
Но для примера еще добавлена обработка исключений
try:
except:
pass
что есмь такое
ну это типа когда find_binary возвратит 0xFFFFFFFF, то это число передасццо в функу add_hidden_area в качестве параметров 1 и 2
функция аварийно завершится и будет вылет
но try сделает так что вылета не будет а завершит работу скрипта правильно
короче там дохуя писать надо, так что ну ее нах

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 28 января 2009 21:56
· Личное сообщение · #9

просто тупо пишите
try:
#... здесь опасный/глючный/кривой код
except:
pass
и фсе
таких сигн нашел 6
все это в логе ИДЫ имееццо
так теперь весь код чистим в EmEditor с помощью Replace и изучаем
что имеем а все просто антиотладко это гы-гы, можно сказать не одного байта нет, но лвигаццо надо дальше
в коде по адресу 0042DDF6
видно какая-то "раскриптовка" кода будет
хм.. сделаем тупо наверно так, чтобы не вкуривать в алго
запустим атладчег ИДЫ, но перед этим поставим несколько бряков
у нас же ИДА голая сталобыть ее спалят сразу
нам надо чуток подкорректировать процесс дебуга
ставим бряки на 0042DC04 и 0042DDF6 и жмем F9
остановились на
.SmoN:0042DC04 test al, al
Меняем в регистре al 01 на 00 и жмем F9
остановились на
.SmoN:0042DDF6 pop esi
Если посмотреть на этот цикл(не забываем жать "С" чтобы превращать в читабельный код)
Code:
  1. .SmoN:0042DDF6 pop     esi
  2. .SmoN:0042DDFA mov     edi, esi
  3. .SmoN:0042DDFF xor     ecx, ecx
  4. .SmoN:0042DE04 push    edi
  5. .SmoN:0042DE08 inc     ecx
  6. .SmoN:0042DE0C lodsb
  7. .SmoN:0042DE10 xor     al, cl
  8. .SmoN:0042DE15 rol     al, cl
  9. .SmoN:0042DE1A sub     al, cl
  10. .SmoN:0042DE1F stosb
  11. .SmoN:0042DE23 mov     eax, 1CD02EBh
  12. .SmoN:0042DE2B add     eax, 10000000h
  13. .SmoN:0042DE33 sub     eax, [esi-4]
  14. .SmoN:0042DE39 jnz     short loc_42DE05
  15. .SmoN:0042DE3B jmp     short locret_42DE3E

Этот код цикла уже очистить попробуйте сами, чтобы не было тупо сделай как я или хуже чем я %))
То выход у этого цикла будет 0042DE3B ставим там бряк и жмем F9
Тармазнулись, гы-гы
Чуть тресим и.. и.. и
.SmoN:0042E225 rdtsc
Ну фсе я сдох заипался уже писать, надеюсь кому-нить это в трудный период жизни поможет
Не стал перечитывать выложил как есть(черновик), может где есть ошибки - не бейте нубика сильно, я только учусь %))

Полностью скрипт
Code:
  1. #-*- coding: cp1251 -*- 
  2. #=================
  3. from idc import *
  4. from idaapi import *
  5. from idautils import *
  6. #=================
  7. address = askaddr(0x0042DB38, "Enter an address:")
  8. addr = address
  9. for i in range(35):
  10.          addr = find_binary(addr, addr+500, "E8 04 00 00 00 E9 EB 06 EB FF 04 24 C3 EB", 16, SEARCH_DOWN)
  11.          print "%08X %d" % (addr, i)
  12.          if addr == 0xFFFFFFFF: 
  13.                  break
  14.          add_hidden_area(addr, addr+14, "sign", "", "", 0xFFFF00)
  15.          addr += 1
  16.                  
  17. try:
  18.          addr = address
  19.          for i in range(20):
  20.                  addr = find_binary(addr, addr+500, "EB 03 E8 EB 03 EB FC E9", 16, SEARCH_DOWN)
  21.                  add_hidden_area(addr, addr+8, "sign", "", "", 0x00FFFF)
  22.                  print "%08X %d" % (addr, i)
  23.                  addr += 1
  24. except:
  25.     pass


-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 28 января 2009 22:15 · Поправил: Smon
· Личное сообщение · #10

Demon666
Всю обфускацию деобфусчил, пошол йа пить йад
Когда ждать распакованный, полностью восстановленный и закейгененный crackme?

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels





Ранг: 238.8 (наставник), 67thx
Активность: 0.20
Статус: Участник
CyberHunter

Создано: 28 января 2009 23:15
· Личное сообщение · #11

Demon666, молодец! + 5

-----
Nulla aetas ad discendum sera




Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 29 января 2009 07:57
· Личное сообщение · #12

прикольно, только в виде статьи в соответствующем разделе сайта удобнее



Ранг: 74.4 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 29 января 2009 14:00
· Личное сообщение · #13

Действительно в полне толковый матерьял.



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 30 января 2009 06:44
· Личное сообщение · #14

Smon пишет:
Когда ждать распакованный, полностью восстановленный и закейгененный crackme?

Нееее.. так не интересно %))
бгг, пусть это делает поколение "NEXT"©аффтар неизвестен
Да и Отец Дерматолог где-то там уже сказал, что Я только фЭйки мОстырить умею %)))
Таг что пипец, на мне клеймо неудачнега, сталобыть недостойный я %))
Мну тут просто под шумок, питон по-тихому пиарит ;)
====================================

И так продолжим юзать/пиарить питон.. %))
Мы прошлый раз остановились в отладчике ИДЫ на бряке 0042DE3B
Хм.. теперь жмакаем F7 два раза
Ок, остановились здесь
.SmoN:0042DF04 jmp short loc_42DF08
Запускаем наш скрипт еще раз
Но уже в комбобокс вбиваем адрес на котором стоим 0042DF04 и жмем окей (0042E32F)
Скрипт нашел еще сигны, но уже в "раззкриптованом" коде
Но если проскролить вниз до адреса 0042E17E
И посмотреть на код то можно заметить что обфускация есть
Но скрипт ее по каким-то причинам не асилил
Так опять анализ нужен(в дебуг режиме включить надо тоже опкоды, чтобы видно было!)
Хм, а оказывается все просто.. надо больше установить циклов, у нас их 35 поставим 70
И опять запустим, но сейчас просто нажмем Alt+7 и в появившемся окне ScriptBox два раза кликаем на C:/.../.../O_o.py
Вбиваем еще раз 0042DF04 и ок
Смотрим в лог, хмм.. нашел уже 60 сигн и 3 других
Так но постоянно жать клавишу C это жопа, когда там один-два раза это хс, но 70 раз это уже изебство
Подметим это и заставим скрипт сделать анализ за нас
В скрипт нам надо еще добавить вот такой код:

do_unknown_range(address, size, DOUNK_EXPAND)
auto_make_code(address)

auto_make_code – делает анализ кода и принимает всего один параметр – это адрес с которого нужно начать делать анализ
do_unknown_range - эта функа заставляет убить в ИДЕ сделанный ранее анализ
причина ее заюзать довольно проста, просто ИДА иногда может и не сделать новый поверх старого анализа кода, потому как там уже есть анализ сделанный ранее
короче do_unknown_range должна всегда вызываться перед auto_make_code и неипет!
do_unknown_range принимает 3 параметра
первый - это адрес с которого нужно начать убивать анализ
второй – количество байтов в области, чтобы сделать код unknown(undefined)
третий – а короче, всегда ставьте там DOUNK_EXPAND, это гарантировано убьет фсе нах

полностью весь код:
Code:
  1. #-*- coding: cp1251 -*- 
  2. #=================
  3. from idc import *
  4. from idaapi import *
  5. from idautils import *
  6. #=================
  7. address = askaddr(0x0042DB38, "Enter an address:")
  8. addr = address
  9. for i in range(70):
  10.          addr = find_binary(addr, addr+500, "E8 04 00 00 00 E9 EB 06 EB FF 04 24 C3 EB", 16, SEARCH_DOWN)
  11.          print "%08X %d" % (addr, i)
  12.          if addr == 0xFFFFFFFF: 
  13.                  break
  14.          add_hidden_area(addr, addr+14, "sign", "", "", 0xFFFF00)
  15.          do_unknown_range(addr+14, 32, DOUNK_EXPAND)
  16.          auto_make_code(addr+14)
  17.          addr += 1
  18.          
  19. try:
  20.          addr = address
  21.          for i in range(20):
  22.                  addr = find_binary(addr, addr+500, "EB 03 E8 EB 03 EB FC E9", 16, SEARCH_DOWN)
  23.                  add_hidden_area(addr, addr+8, "sign", "", "", 0x00FFFF)
  24.                  print "%08X %d" % (addr, i)
  25.                  do_unknown_range(addr+8, 32, DOUNK_EXPAND)
  26.                  auto_make_code(addr+8)
  27.                  addr += 1
  28. except:
  29.     pass

Для начала советую в обязательном порядке удалить старую базу ИДЫ от кг и повторить все телодвижения заново с использованием нового скрипта!
Все, деобфускацию убрали в TLS весь код чистенький каг слеза девственницы %))

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 30 января 2009 06:44
· Личное сообщение · #15

И теперь мы дошли до нового этапа расширения возможностей скрипта и это decrypt
Интересующие нас участки кода:
Code:
  1. .SmoN:0042DDF6 pop     esi
  2. .SmoN:0042DDFA mov     edi, esi
  3. .SmoN:0042DDFF xor     ecx, ecx
  4. .SmoN:0042DE04 push    edi
  5. .SmoN:0042DE08 inc     ecx
  6. .SmoN:0042DE0C lodsb
  7. .SmoN:0042DE10 xor     al, cl
  8. .SmoN:0042DE15 rol     al, cl
  9. .SmoN:0042DE1A sub     al, cl
  10. .SmoN:0042DE1F stosb
  11. .SmoN:0042DE23 mov     eax, 1CD02EBh
  12. .SmoN:0042DE2B add     eax, 10000000h
  13. .SmoN:0042DE33 sub     eax, [esi-4]
  14. .SmoN:0042DE39 jnz     short loc_42DE05
  15. .SmoN:0042DE3B jmp     short locret_42DE3E


Code:
  1. .SmoN:0042DF2B 64 8B 2D 30 00 00 00            mov   ebp, large fs:30h
  2. .SmoN:0042DF40 8B 6D 0C                        mov   ebp, [ebp+0Ch]
  3. .SmoN:0042DF51 8B 6D 0C                        mov   ebp, [ebp+0Ch]
  4. .SmoN:0042DF62 8B 6D 18                        mov   ebp, [ebp+18h]
  5. .SmoN:0042DF73 8D B5 00 10 00 00               lea   esi, [ebp+1000h]
  6. .SmoN:0042DF87 89 F7                           mov   edi, esi
  7. .SmoN:0042DF97 B9 04 00 00 00                  mov   ecx, 4
  8. .SmoN:0042DFAA AD                              lodsd
  9. .SmoN:0042DFB9 F7 D0                           not   eax
  10. .SmoN:0042DFC9 2D DD CB D6 1B                  sub   eax, 1BD6CBDDh
  11. .SmoN:0042DFDC D3 C8                           ror   eax, cl
  12. .SmoN:0042DFEC 35 51 EF 37 93                  xor   eax, 9337EF51h
  13. .SmoN:0042DFFF D3 C8                           ror   eax, cl
  14. .SmoN:0042E00F 05 9A F4 0D C2                  add   eax, 0C20DF49Ah
  15. .SmoN:0042E022 F7 D8                           neg   eax
  16. .SmoN:0042E032 AB                              stosd
  17. .SmoN:0042E041 FE C9                           dec   cl
  18. .SmoN:0042E04B 0F 85 4B FF FF FF               jnz   near ptr unk_42DF9C


Code:
  1. .SmoN:0042E0E1 8D B5 05 10 00 00               lea   esi, [ebp+1005h]
  2. .SmoN:0042E0F5 2B 76 04                        sub   esi, [esi+4]
  3. .SmoN:0042E106 8D 3E                           lea   edi, [esi]
  4. .SmoN:0042E116 B9 32 00 00 00                  mov   ecx, 32h
  5. .SmoN:0042E129 AD                              lodsd
  6. .SmoN:0042E138 F7 D0                           not   eax
  7. .SmoN:0042E148 2D DD CB D6 1B                  sub   eax, 1BD6CBDDh
  8. .SmoN:0042E15B D3 C8                           ror   eax, cl
  9. .SmoN:0042E16B 35 51 EF 37 93                  xor   eax, 9337EF51h
  10. .SmoN:0042E17E D3 C8                           ror   eax, cl
  11. .SmoN:0042E18E 05 9A F4 0D C2                  add   eax, 0C20DF49Ah
  12. .SmoN:0042E1A1 F7 D8                           neg   eax
  13. .SmoN:0042E1B1 AB                              stosd
  14. .SmoN:0042E1C0 FE C9                           dec   cl
  15. .SmoN:0042E1CA 0F 85 4B FF FF FF               jnz   near ptr unk_42E11B


Code:
  1. .SmoN:0042E1DE E8 02 00 00 00                  call  near ptr unk_42E1E5
  2. .SmoN:0042E1E3 00                              db    0
  3. .SmoN:0042E1E4 00                              db    0
  4. .SmoN:0042E1F3 58                              pop   eax
  5. .SmoN:0042E202 66 C7 00 61 C3                  mov   word ptr [eax], 0C361h
  6. .SmoN:0042E215 FF E0                           jmp   eax

Все остальное в TLS – для нас уже просто мусор
Так чтобы была интрижка, когда будет свободное время и тяга, я опишу функцию декрипта
И будет дано задание(простенькое) на выполнение
Трое нубиков(естественно чтобы было все честно), у которых ранг от 10 до 40, должны будут его решить и приатачить здесь результаты
За конкурс денег не будет %)))
Но зато, будет продолжено описание реверса этого кг мной далее(а там ведь столько всего интересного %))) )
Если трех аттачей не будет в течении 2 дней после задания, блог будет закрыт
сталобыть Вам решать, хотите дальше читать "дневник сумасшедшего", выполняете задание – нет, ну на нет и суда нах нет!
ЗЫ: у вас еще есть время ранги подтянуть ;)

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 30 января 2009 07:39
· Личное сообщение · #16

Без комментариев, красиво челлендж замутил

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels





Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 30 января 2009 07:50
· Личное сообщение · #17

Demon666 пишет:
у вас еще есть время ранги подтянуть ;)


или убавить гуд топ



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 03 февраля 2009 22:12 · Поправил: Demon666
· Личное сообщение · #18

Задание(так просто чич-то для теста)
Запускаем кг ставим бряк(железный) на kernel32.VirtualAlloc, но не как обычно на начало, а в самом конце на ret и F9
После того как тормазнулись смотрим на EAX и переходим по этому адресу в окне дампа
И далее тресим F7(5-6 раз) до 0042C3A6 там F8 на CALL 0042C4CC
Выделенная память заполнилась кодом – дампим и открываем в ИДЕ
в полях Loading segment и Loading offset прописываем адрес на котором дампили(короче, че было в EAX)
Теперь задача создать новую сигнатуру для деобфускации этого дампа
Написать свой скрипт на питоне и очистить в EmEditor код от мусора
Все это здесь приаттачить

P. S.
Тут стоит упомянуть ап одной особенности в комбобоксе при вводе адреса может быть типа
0:00360000 надо заменить просто на 00360000

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 04 февраля 2009 11:31
· Личное сообщение · #19

Я тут прикинул дохрена че-то писать получаеццо о декрипте, решил разбить на несколько этапов
Здесь я опишу как падчить в ИДЕ с помощью питона, а также акцентирую внимание на некоторые примитивные вещи ;)
Патчинг в ИДЕ для нубика нетривиальная задача, ибо по дефолту там такой возможности "НЕТ"
ИДА дает нам для патченга три функи(их там больше, но я опишу только три)
patch_byte – патчит байт
patch_word – патчит word
patch_long – патчит dword

принимают они всего два параметра
patch_byte(0x0042DB38, 0xC3)
первый – адрес(0x0042DB38), по которому запишется значение
второй – сталобыть, то самое значение(0xC3)

если написать в скрипте
patch_byte(0x0042DB38, 0xC3)
и запустить этот скрипт, то значение EB по адресу 0x0042DB38 пропатчиццо на C3
хм.. вроде все гуд, но есть одно «но», сам файл не пропатчился – пропатчилась только его база ИДЫ
patch_word и patch_long аналогично patch_byte, но в качестве второго параметра передаются word и dword соответственно
вот и настал момент истены %))
у нас здесь пиар питона, сталобыть средствами питона файлег падчить и будем

pos = 0 # pose aka position in the file
prey = open('Keygen.exe', 'r+b')

open открывает жертву – короче, что-то типа CreateFile
два параметра принимает
первый – имя жертвы(тут жертва, база ИДЫ и скрипт, должны находится в одной директории!)
Второй, а тупо всегда пишем 'r+b' ;)
Пишите всегда эти две строчки кода, после раздела import – короче, чтобы точно понятно было вот код:
Code:
  1. #-*- coding: cp1251 -*- 
  2. #=================
  3. from idc import *
  4. from idaapi import *
  5. from idautils import *
  6. import struct
  7. #=================
  8. pos = 0 # pose aka position in the file
  9. prey = open('Keygen.exe', 'r+b')


-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 04 февраля 2009 11:32
· Личное сообщение · #20

import struct – это есмь модуль питона, который предназначен для работы с бинарным кодом
чуть ниже я немного о нем расскажу
вообще модули питона тем и хороши что писать ничего не надо, тупо гуглим, подключаем и юзаем(уже все давно за нас/для нас написано)
процесс похож как у дельфи компоненты, только все проще – короче, у питона нет ограничений!

Жертву мы открыли, теперь осталось ее пропатчить физически на диске %))
Мы знаем что смещение в файле это НЕ есть одно и тоже что смещение в адресном пространстве, которое нам показывает ИДА
Но ИДА из своего SDK дает нам уже готовую функу get_fileregion_offset
pos = get_fileregion_offset(addr)
принимает один параметр – адрес для которого нам надо получить смещение относительно начала файла
prey.seek(pos)
seek – это устанавливает смещение в файле, относительно начала файла
ну мы просто тупо передаем seek, то что вернула get_fileregion_offset и не о чем больше не думаем
тут скажу пожалуй что prey – это "объект", а seek это его "метод", ну как-то так %))

prey.write(struct.pack('L', dd))
write – записывает в файл, то что нам нужно
но скромно говоря питон работает по дефолту для записи в файл со строками
и вот мы для этого и подключали новый модуль, чтобы без проблем юзать бинарный код в питоне!
struct.pack – что это такое? Гы, да фсе просто..
превый параметр – это типа тип указываем, ну как в асме byte, word, dword
но только символы L H B соответственно равны
L -> dword (unsigned long)
H -> word (unsigned short)
B -> byte (unsigned char)
Второй параметр – значение, которое мы хотим преобразовать для записи в файл
И так у нас получилось три строчки кодеса
Code:
  1. pos = get_fileregion_offset(0x0042DB38)
  2. prey.seek(pos)
  3. prey.write(struct.pack('B', 0xC3))


-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 04 февраля 2009 11:32
· Личное сообщение · #21

Но так писать код не есть гуд, нам надо чтобы все было красиво и мы могли этот код юзать для отлома других протов ;))
Хм.. у нас есть patch_byte логичное название, а что если мы назовем функу file_patch_byte
Полностью отражает что делает в своем названии, ОК.
Заставим ее принимать идентично два параметра как у patch_byte
В питоне для созданий функций юзается зарезервированное слово def и заканчивается символом : (двоеточие) и получается у нас:
def file_patch_byte( addr, db):
теперь изменим немного наш код и.. и.. и:
Code:
  1. def file_patch_byte(addr, db):
  2.          prey.seek(get_fileregion_offset(addr))
  3.          prey.write(struct.pack('B', db))

Сталобыть вызов будет такой
file_patch_byte(0x0042DB38, 0xC3)

Так если мы жертву открывали(open), то ее всегда надо закрывать ;)
Пишем всегда в конце скрипта
prey.close()
close – просто киляет "объект" prey

ну и по традиции полностью скрипт

Code:
  1. #-*- coding: cp1251 -*- 
  2. #=================
  3. from idc import *
  4. from idaapi import *
  5. from idautils import *
  6. import struct
  7. #=================
  8. prey = open('Keygen.exe', 'r+b')
  9. def file_patch_byte(addr, db):
  10.          prey.seek(get_fileregion_offset(addr))
  11.          prey.write(struct.pack('B', db))
  12. def file_patch_word(addr, dw):
  13.          prey.seek(get_fileregion_offset(addr))
  14.          prey.write(struct.pack('H', dw))
  15. def file_patch_dword(addr, dd):
  16.          prey.seek(get_fileregion_offset(addr))
  17.          prey.write(struct.pack('L', dd))
  18.          
  19. ################################
  20. patch_byte(0x0042DB38, 0xC3)
  21. file_patch_byte(0x0042DB38, 0xC3)
  22. ################################
  23. prey.close()


-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com



 eXeL@B —› Дневники и блоги —› Demon666 blog: PyCracklab
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати