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

 eXeL@B —› Программирование —› Gs.
Посл.ответ Сообщение

Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 19 декабря 2010 18:55
· Личное сообщение · #1

Здрасте.
Вот семпл выводящий сообщение. Над исходным бинарем выполнен автоматический ресерч и морфинг, при котором выполнена генерация Gs-серий для линейных блоков http://indy-vx.narod.ru/Temp/GsTest.zip

Как это отлаживать, в частности трассировать ?



Ранг: 87.8 (постоянный), 10thx
Активность: 0.070
Статус: Участник

Создано: 19 декабря 2010 20:07
· Личное сообщение · #2

В отладчике шестого вижуала все идет:

Code:
  1. 00401092    52              PUSH EDX
  2. 00401093    51              PUSH ECX
  3. 00401094    FF55 F0         CALL DWORD PTR SS:[EBP-10]               ; nt.dll RtlCreateUnicodeStringFromAsciiz
  4. 00401097    85C0            TEST EAX,EAX
  5. 00401099    8D4D E8         LEA ECX,DWORD PTR SS:[EBP-18]
  6. 0040109C    8D55 D8         LEA EDX,DWORD PTR SS:[EBP-28]
  7. 0040109F    75 07           JNZ SHORT GsMsg.004010A8
  8. 004010A1    B8 E50000C0     MOV EAX,C00000E5
  9. 004010A6    EB 59           JMP SHORT GsMsg.00401101
  10. 004010A8    52              PUSH EDX
  11. 004010A9    51              PUSH ECX
  12. 004010AA    6A 00           PUSH 0
  13. 004010AC    6A 00           PUSH 0
  14. 004010AE    FF55 F8         CALL DWORD PTR SS:[EBP-8]                ; nt.dll LdrLoadDll
  15. 004010B1    8D4D E8         LEA ECX,DWORD PTR SS:[EBP-18]


но в нем ковырять конечно геморойно.

-----
Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 19 декабря 2010 20:16
· Личное сообщение · #3

gena-m
Идёт в смысле дизасмит нормально ?

Имеется в виду трассировка. Ядро ваше не позволит этот код трассировать.



Ранг: 87.8 (постоянный), 10thx
Активность: 0.070
Статус: Участник

Создано: 19 декабря 2010 20:29
· Личное сообщение · #4

Да, все идет нормально, и пошаговая трассировка(аналог Ф8 Олли) и запускается нормально под отладчиком.
Просто адреса функций приходится высматривать в памяти - они в этой программе расположены в стеке, приходится смотреть значение EBP (0012ffb0) затем в памяти искать адрес и смотреть в Иде какая функция расположена по этому адресу, я лично так сделал, просто медленно получается. Я в нативные функции не заходил, просто взял адреса, посмотрел их названия и указал в коментариях. В принципе для небольшой программы разобраться можно что и где она делает.

-----
Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 19 декабря 2010 20:34 · Поправил: Clerk
· Личное сообщение · #5

gena-m
В оли по F8 ставятся брейки на следующую инструкцию, это например трейс процедурных ветвлений. Это бессмысленно, так как можно тупо зачекать чексумму макро, либо вобще запретить запись в память. Нормальный трейс выполняется посредством TF. Более того как только произойдёт разрыв блока при перезагруженном сегментном регистре ядро тутже его обнулит и далее при попытке выполнить код возникнет фолт.



Ранг: 87.8 (постоянный), 10thx
Активность: 0.070
Статус: Участник

Создано: 19 декабря 2010 20:42 · Поправил: gena-m
· Личное сообщение · #6

В Олли эта программа вообще не идет(трассировка), как ее заставить именно в Олли работать я не знаю, просто задача была сформулированна не конкретно для Олли а Как это отлаживать, в частности трассировать ?, поэтому я взял отладчик MSVC++, а в нем программа прекрасно идет.

-----
Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 19 декабря 2010 20:47
· Личное сообщение · #7

gena-m
Ну вопрос чисто теоретический. А установка брейков на следующую инструкцию я не считаю трассировкой.




Ранг: 116.6 (ветеран), 8thx
Активность: 0.050
Статус: Участник

Создано: 19 декабря 2010 20:55
· Личное сообщение · #8

Clerk
Вот скажи мне - нахера баловаться с GS когда ты сам знаешь, что он обнуляется каждый раз при переключении потока? Нет никаrой 100% гарантии, что переключение НЕ произойдет между POP GS и следующей за ней инструкцией, что в целом подтверждается практикой на моей Win7.



Ранг: 87.8 (постоянный), 10thx
Активность: 0.070
Статус: Участник

Создано: 19 декабря 2010 20:57 · Поправил: gena-m
· Личное сообщение · #9

Clerk
Не только теоретический, и практически трассировка в Олли действительно не идет. Но для взлома сложности пока не представляет.

-----
Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 19 декабря 2010 21:00 · Поправил: Clerk
· Личное сообщение · #10

dermatolog
Какие есчо переключения ?
Шедулер обнуляет только ядерный Gs(на нулевом кпл) и ничего не знает про юзермодный.

gena-m
Разместите этот код в проекцию секции с доступом R/E. Тогда это будет практическим вопросом.

Интересно как бы вы решали эту задачу. Мне не интересен никакой софт, например большинство аверских виртуальных машин пройдут его нормально. Вопрос не в этом.



Ранг: 87.8 (постоянный), 10thx
Активность: 0.070
Статус: Участник

Создано: 19 декабря 2010 21:10
· Личное сообщение · #11

Clerk
Доступ всегда можно изменить. Конечно можно его проверять , но и эти проверки можно нейтрализовать, здесь скорее будет вопрос в настойчивости.

-----
Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше





Ранг: 116.6 (ветеран), 8thx
Активность: 0.050
Статус: Участник

Создано: 19 декабря 2010 21:11 · Поправил: dermatolog
· Личное сообщение · #12

Clerk пишет:
Шедулер обнуляет только ядерный Gs(на нулевом кпл) и ничего не знает про юзермодный.


Этого будет достаточно?
Code:
  1. var I:Integer;
  2.     _GS:LongWord;
  3. begin
  4.   for I:=0 to 100000000 do
  5.    begin
  6.     asm
  7.      push 1
  8.      pop gs
  9.      mov _GS,gs
  10.     end;
  11.     if _GS<>1 then
  12.      writeln(IntToStr(_GS));
  13.    end;
  14. end.


P.S. На экране вижу и 0 и 2b.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 19 декабря 2010 21:14 · Поправил: Clerk
· Личное сообщение · #13

dermatolog
Не достаточно. При инвалидном селекторе регистр обнуляет не ось, а процессор. Тут сегмент валидный и берётся из источника(ds, fs etc.). Тоесть никаких обнулений нет.

ps: это только у меня шрифты мелкие стали ?



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

Создано: 20 декабря 2010 06:08
· Личное сообщение · #14

очередной сферический конь. хотите затруднить отладку вместе с анализом вот самый простой прием (для самых маленьких овощей) - за коллами размещаете несколько мусорных байт (или псевдомусорных или это могут быть какие либо параметры из которых например вычисляется адрес возврата) а перед возвратом колл прибавляет эти несколько мусорных байт к адресу возврата. дизасм переваривает это плохо и степ овер тоже делать не айс (особенно если за колом лежат параметры какието) а реализовать эту фишку очень просто и она реально хоть что то затрудняет.

-----
power and the money money and the power





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 20 декабря 2010 07:43
· Личное сообщение · #15

Угу, EXECryptor и Themida так и делают.

-----
Yann Tiersen best and do not fuck





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 20 декабря 2010 09:35
· Личное сообщение · #16

Угу, а Вмпрот вообще из кала не выходит...

-----
Everything is relative...




Ранг: 87.8 (постоянный), 10thx
Активность: 0.070
Статус: Участник

Создано: 20 декабря 2010 10:06 · Поправил: gena-m
· Личное сообщение · #17

Отладку не затрудняет, трассировку по ф8 (но не по ф7) и анализ - да, приходится делать трассу и писать парсер:
Code:
  1. 0041196D     CALL    UnPackMe.00411976                 ; ESP=0012FF98
  2. 00411976     INC     DWORD PTR SS:[ESP]                ; FL=0
  3. 00411979     RETN                                      ; ESP=0012FF9C
  4. 00411973     JMP     SHORT UnPackMe.0041197B
  5. 0041197B     MOV     ESI, DWORD PTR SS:[EBP+C7]        ; ESI=00240332
  6. 00411981     CALL    UnPackMe.0041198A                 ; ESP=0012FF98
  7. 0041198A     INC     DWORD PTR SS:[ESP]                ; FL=P
  8. 0041198D     RETN                                      ; ESP=0012FF9C
  9. 00411987     JMP     SHORT UnPackMe.0041198F
  10. 0041198F     ADD     ESI, DWORD PTR SS:[EBP+D3]        ; FL=0, ESI=00640332
  11. 00411995     CALL    UnPackMe.0041199E                 ; ESP=0012FF98
  12. 0041199E     INC     DWORD PTR SS:[ESP]
  13. 004119A1     RETN                                      ; ESP=0012FF9C
  14. 0041199B     JMP     SHORT UnPackMe.004119A3
  15. 004119A3     MOV     EDI, EAX                          ; EDI=00B00000
  16. 004119A5     CALL    UnPackMe.004119AE                 ; ESP=0012FF98
  17. 004119AE     INC     DWORD PTR SS:[ESP]
  18. 004119B1     RETN                                      ; ESP=0012FF9C
  19. 004119AB     JMP     SHORT UnPackMe.004119B3
  20. 004119B3     CALL    UnPackMe.00411E38                 ; ESP=0012FF98
  21. 00411E38     PUSHAD                                    ; ESP=0012FF78
  22. 00411E39     CALL    UnPackMe.00411E42                 ; ESP=0012FF74
  23. 00411E42     INC     DWORD PTR SS:[ESP]                ; FL=P

после парсинга:
Code:
  1. 0041197B     MOV     ESI, DWORD PTR SS:[EBP+C7]        ; ESI=00240332
  2. 0041198F     ADD     ESI, DWORD PTR SS:[EBP+D3]        ; FL=0, ESI=00640332
  3. 004119A3     MOV     EDI, EAX                          ; EDI=00B00000
  4. 004119B3     CALL    UnPackMe.00411E38                 ; ESP=0012FF98
  5. 00411E38     PUSHAD                                    ; ESP=0012FF78


если обьеденить оба метода, вот тогда будет тяжело.

-----
Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 20 декабря 2010 19:00
· Личное сообщение · #18

doctor Ice
> хотите затруднить отладку вместе с анализом
Нет, хочу сделать невозможным манипуляции контекстом в юзермоде.

gena-m
Что за парсинг, о чём вы говорите. Обратный ресерч простым смертным не доступен. Gs-серии генерируются автоматически.



Ранг: 87.8 (постоянный), 10thx
Активность: 0.070
Статус: Участник

Создано: 20 декабря 2010 21:11
· Личное сообщение · #19

Clerk
Я хотел сказать что по отдельности ни Ваш метод, ни метод doctor Ice, сложности для реверса не представляют, а вот обьеденив их можно получить большой гемор, поскольку код не видно и его трассу получить тяжело.
Как это отлаживать, в частности трассировать ?
Кстати трасса, сделанная в Олли, которую можно получить скриптом:
Code:
  1. Новый сеанс
  2. Адрес  Поток   Команда                                      ; Регистры и комментарии
  3.     Смывание собранной информации
  4. <ModuleEntryPoint>PUSH EBP                                  ; ESP=0012FFC0
  5. 00401001 Main     MOV EBP,ESP                               ; EBP=0012FFC0
  6. 00401003 Main     ADD ESP,-2C                               ; FL=C, ESP=0012FF94
  7. 00401006 Main     PUSH FS                                   ; ESP=0012FF90
  8. 00401008 Main     POP GS                                    ; ESP=0012FF94
  9. 0040100A Main     MOV EAX,DWORD PTR GS:[30]                 ; ECX=0012FCC8, ESP=0012FCA4
  10. 00401010 Main     PUSH DS                                   ; ESP=0012FF90
  11. 00401011 Main     POP GS                                    ; ESP=0012FF94
  12. 00401013 Main     MOV EAX,DWORD PTR GS:[EAX+C]              ; ECX=0012FCC8, ESP=0012FCA4
  13. 00401017 Main     PUSH DS                                   ; ESP=0012FF90
  14. 00401018 Main     POP GS                                    ; ESP=0012FF94
  15. 0040101A Main     MOV EAX,DWORD PTR GS:[EAX+C]              ; ECX=0012FCC8, ESP=0012FCA4
  16. 0040101E Main     PUSH DS                                   ; ESP=0012FF90
  17. 0040101F Main     POP GS                                    ; ESP=0012FF94
  18. 00401021 Main     MOV EAX,DWORD PTR GS:[EAX]                ; ECX=0012FCC8, ESP=0012FCA4
  19.     Конец собранной информации, начинается живая регистрация
  20.     Журнал трассировки закрыт


-----
Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 20 декабря 2010 21:51
· Личное сообщение · #20

Не помню точно, но по моему можно трассировать еще через Dr регистр, к сожалению готовых кодесов нет а кодить специально обламывает.

-----
Yann Tiersen best and do not fuck




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

Создано: 20 декабря 2010 23:21
· Личное сообщение · #21

ну а если немного причесать алгоритм трассеровщика? если трассер встречает изменение гс то запоминает значение гс не меняя если встречает команду с префом гс то он может ее например рипнуть в свой буф (чтобы не снимать защиту от записи со страницы) в своем буфе изменить преф на другой сег рег который бы соответствовал селектору который бы был должен загружен в гс.

-----
power and the money money and the power




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

Создано: 20 декабря 2010 23:35
· Личное сообщение · #22

gena-m пишет:
получить большой гемор, поскольку код не видно и его трассу получить тяжело.

трассировщиков обламать можно и попроще например переполнениями буфа трассировки. способов масса. вот прикольный. берем например команду (все это можно делать на лету) mov eax, 5 морфим ее во чтото типа push 5 pop eax полученные 2 команды снова морфим и так пока буф морфа не вырастет до мега =) потом выполняем этот мег.

-----
power and the money money and the power





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 21 декабря 2010 00:49
· Личное сообщение · #23

doctor Ice пишет:
если трассер встречает изменение гс то запоминает значение гс не меняя если встречает команду с префом гс то он может ее например рипнуть в свой буф

Это наверное самое простое, при этом можно олю запатчить под такое дело.

-----
Yann Tiersen best and do not fuck





Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 21 декабря 2010 04:20
· Личное сообщение · #24

PE_Kill пишет:
Не помню точно, но по моему можно трассировать еще через Dr регистр, к сожалению готовых кодесов нет а кодить специально обламывает.


Так в ольке есть трассировка через Dr, или я что-то не понял?

-----
Research For Food




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 21 декабря 2010 07:28
· Личное сообщение · #25

PE_Kill
В любом случае останов приводит к генерации исключения и автоматической конвертации ядерного состояния задачи в контекст, при этом регистр Gs делается инвалидным. Вероятно Rock Debugger не использует брейки при трассировке, возможно это загрузка дефолтных селекторов(базы нулевые ведь), будет не удивительно если он не сможет протрейсить инструкцию для которой Gs = Fs.
doctor Ice
Загрузить Gs через сервисы не представляется возможным. Можно выполнить обратный ресерч, удалить Gs-серии. Но он будет проблемным.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 24 декабря 2010 02:11
· Личное сообщение · #26

daFix
> трассировка через Dr

Если использовать эти регистры подобно RGP ?
Хотя они и не доступны в юзермоде, но можно написать простейшую надстройку эмулирующую манипуляции Dr-регистрами, например установив её как VEH.

| Сообщение посчитали полезным: mak
 eXeL@B —› Программирование —› Gs.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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