Сейчас на форуме: tyns777, localhost1, vsv1, asfa (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Скриптинг в OllyDbg. Плагин Playtime
Посл.ответ Сообщение

Ранг: 16.6 (новичок), 1thx
Активность: 0.030.16
Статус: Участник

Создано: 02 февраля 2020 00:12 · Поправил: rukop84
· Личное сообщение · #1

Приветствую участников форума!

Начиная разбираться в практическом использовании плагина lua-скриптов Playtime для OllyDbg 2.01 столкнулся с недопониманием ряда вопросов. Не всё оказалось так просто и очевидно, даже несмотря на наличие справки и примеров в комплекте. Поэтому, собственно и был создан этот Топик.

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

Говорят лучше всего осваивать навык на простых примерах и упражнениях. Поэтому, далеко не буду отходить от этой прописной истины. Для тестов и экспериментов взял простой Crackme от Truehead'a (подойдет любой, главное разобраться в синтаксисе скриптов).

-------------------------------------------------------------------------------------------------------------------
Code:
  1. Для начала опишу словами что я хочу сделать с помощью скрипта:
  2. 1. сохранить в память по адресу [402000] строку 'Hello_World!' (байт код: 48 65 6C 6C 6F 5F 57 6F 72 6C 64 21)
  3. 2. установить HBP на execute по адресу 401068
  4. 3. установить обработчик исключений, когда таковое произойдет или сработает установленный HBP
  5. 4. запустить программу (F9)
  6. 5. проверить по какому адресу произошло исключение:
  7.          5.1 если адрес будет равен адресу нашего HBP, то:
  8.                  5.1.1 заменить значение в стеке [esp+14] на 00000004
  9.                  5.1.2 сделать Step Over (F8)
  10.                  5.1.3 удалить установленный ранее HBP
  11. 6. удалить установленный в шаге 3 обработчик исключений
  12. 7. завершить работу скрипта


-------------------------------------------------------------------------------------------------------------------
А вот как бы этот скрипт выглядел, если бы он создавался в плагине OllyScript:

Code:
  1. scr_begin:
  2.          mov [402000], #48656C6C6F5F576F726C6421#    //запись в память 'Hello_World!'
  3.          bphws 401068, "x"                 //устанавливаем hardware-бряк на выполнение
  4.          eob scr_eip_checked             //устанавливаем обработчик исключений
  5.          
  6. scr_continue:
  7.          run         //F9
  8.          jmp scr_end
  9.          
  10. scr_eip_checked:
  11.          cmp eip, 401068   //проверяем это сработал наш бряк или что-то еще
  12.          je scr_body               //если это был наш бряк, то переходим на соответствующую метку
  13.          jmp scr_continue //иначе переходим на метку продолжить
  14.          
  15. scr_body:
  16.          mov [esp+14], 4   //изменяем значение стека
  17.          sto         //F8
  18.          bphwc   //удаляем установленный ранее бряк
  19.          cob         //удаляем обработчик исключений
  20.          
  21. scr_end:
  22.          ret         //завершаем работу скрипта


-------------------------------------------------------------------------------------------------------------------
Ну, а теперь перейдем к lua-скриптингу плагина Playtime (с чем у меня возникли сложности и непонимание):

Code:
  1. -- 1. записываем в память 'Hello_World!'
  2. WriteMemoryULong(0x00402000, 0x6c6c6548)
  3. WriteMemoryULong(0x00402004, 0x6f575f6f)
  4. WriteMemoryULong(0x00402008, 0x21646c72)
  5.  
  6. -- 2. устанавливаем HBP
  7. SetHardBreakpoint(0, 0x00401068)
  8.  
  9. -- 3. устанавливаем обработчик исключений
  10. local handle = Event.Listen("Exception", function(info)
  11.          eip_checked()
  12. end)
  13.  
  14. -- 4. запускаем программу
  15. Continue()
  16.  
  17. -- 5. проверяем по какому адресу произошло исключение
  18. function eip_checked()
  19.          if EIP == 0x000401068 then
  20.                  -- если истина, то:
  21.                  -- изменяем значение в стеке по адресу [esp+14] на 4;
  22.                  Assembler.Make(ip, string.format(
  23.                  [[
  24.                         mov [esp+14], 4
  25.                         ret
  26.                  ]]))
  27.                  -- F8;
  28.                  StepOver()           
  29.                  -- удаляем установленный ранее бряк;
  30.                  RemoveHardBreakpoint(0)   
  31.                  -- удаляем обработчик исключений;
  32.                  Event.Remove(handle)         
  33.          else
  34.                  -- иначе продолжаем выполнение программы
  35.                  Continue()           
  36.          end
  37. end
  38.  
  39. -- 6. Выводим сообщение о завершении работы скрипта
  40. MsgBox "Скрипт выполнен!"

-------------------------------------------------------------------------------------------------------------------

Честно говоря, я уже упарился изменять и отлаживать последний вышеприведенный lua-скрипт. Сейчас просто хочется увидеть работу профессионала:
- сам синтаксис и структуру правильного lua-скрипта, его эргономичность, короче, чтоб по науке!!!

Сами скрипты в окне кода отображаются не идеально, поэтому их вместе с crackme залил сюда --> Link <--




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 02 февраля 2020 10:53
· Личное сообщение · #2

Во-первых настоящие Профессионалы предпочитают классическую тему windows. Во-вторых настоящий Профессионал всегда использует визор. В-третьих ты в эрмитаже свой скрипт выставлять собрался? Работает и ладно, можно было вообще на бесконечном цикле с continue() заколхозить, ограничившись изменением значения в стеке, eip и esp. StepOver() перед удалением бряка странная мера, какая-то слишком профессиональная.

-----
2 оттенка серого




Ранг: 16.6 (новичок), 1thx
Активность: 0.030.16
Статус: Участник

Создано: 03 февраля 2020 09:55 · Поправил: rukop84
· Личное сообщение · #3

f13nd пишет:
Работает и ладно

в том-то и дело, что lua-скрипт - нифига не работает. Работает только OllyScript




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 03 февраля 2020 12:27 · Поправил: f13nd
· Личное сообщение · #4

Code:
  1. WriteMemory(0x436000,"Hello_World!\0")
  2. SetHardBreakpoint(0,0x00401025,BP_MANUAL+BP_BREAK+BP_EXEC)
  3. Continue()
  4. while EIP~=0x00401025 do
  5.          Continue()
  6. end
  7. RemoveHardBreakpoint(0)
  8. WriteMemory(EIP,Assembler.Make(EIP,[[
  9.          mov DWORD ptr ss:[esp+14], 4
  10.          ret
  11. ]]))


-----
2 оттенка серого


| Сообщение посчитали полезным: rukop84

Ранг: 16.6 (новичок), 1thx
Активность: 0.030.16
Статус: Участник

Создано: 03 февраля 2020 17:32 · Поправил: rukop84
· Личное сообщение · #5

Учитель f13nd, Спасибо, очень интересное решение. Думал, что плагин Playtime работает подобно OllyScript. То есть, др. словами, после строки '03. Continue()' не было бы перехода на след. строку, а программа просто бы выполнялась подобно плагину OllyScript.

Строки кода 08.-11. - это немного не то. Требуется не патч ассемблерных инструкций в памяти, а изменение значения стека по адресу [esp+14] на значение 4.

Решение кода, которое Вы написали очень оригинальное. Тем не менее все таки очень хочется разобраться в связке Event.Listen и Event.Remove. С помощью этих связок возможно написать скрипты не только с ключевым словом 'Exception' (как в нашем примере), но и такими событиями как 'CreateThread', 'ExitThread', 'LoadDll', 'UnloadDll', 'Int3Breakpoint', 'DebugString'. А это очень ценно в плане исследования приложений.



Ранг: 16.6 (новичок), 1thx
Активность: 0.030.16
Статус: Участник

Создано: 05 февраля 2020 08:39
· Личное сообщение · #6

Пришел к выводу, что плагин Playtime - это какая-то экзотика:
- популярность у реверсеров почти нулевая;
- в самой справке отсутствуют примеры кода;
- нет достаточного количества примеров, чтобы можно было свободно разобраться в инструменте;
- нет пошаговой отладки кода;
- слишком много уходит времени на написание и отладку простых lua-скриптов;
- в общем инструмент - в топку

Для себя выбрал плагин OllyScript:
- прост в изучении;
- прост в написании скриптов;
- для каждой инструкции - примеры в справке;
- популярен среди реверсеров;
- минимум времени на написание скрипта;
- есть пошаговая отладка скрипта;
- в общем надежен как Пистолет Макарова: стреляет и в дождь, и в грязь, и в песке. Никогда не подведет!!!

Актуальность и ценность Темы для др. участников - нулевая. Тема Закрыта


 eXeL@B —› Вопросы новичков —› Скриптинг в OllyDbg. Плагин Playtime
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати