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

 eXeL@B —› Вопросы новичков —› Вопрос по взлому программы (похоже антитрасер стоит)
Посл.ответ Сообщение

Ранг: 0.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 декабря 2007 11:23
· Личное сообщение · #1

Здраствуйте. Нужда заставила заняться взломом программы. Ранее этим никогда не занимался, а по сему не судите пожалуйста строго за мои глупые вопросы. Итак:

Инструменты
OllyDbg 1.10
PhantOm 1.15
Olly Advanced

В Оле адвансед включены все bufixes. В Фантоме "Hide from PEB", "LoadDriver", "hook GetTickCount", "hook RDTSC" и "Custom handler exceptions".

Есть программка которая вызывает функцию из защищенной Хаспом библиотеки. Если хасп присутствует - метод возвращает 0 иначе 9.

Путем тупого трасерта набрел я на такой кусок кода:

10001FEF 90 NOP
10001FF0 6A 64 PUSH 64
10001FF2 FFD6 CALL ESI
10001FF4 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
10001FF8 85C0 TEST EAX,EAX
10001FFA ^74 F4 JE SHORT gwx.10001FF0
10001FFC 5E POP ESI

Содержимое регистров:

EAX 00000000
ECX 7C80240F KERNEL32.7C80240F
EDX 7C90EB94 ntdll.KiFastSystemCallRet
EBX 00F93A54
ESP 0012E4D4
EBP 0012EBB0
ESI 7C802442 KERNEL32.Sleep
EDI 0012EC54 ASCII "c:\maps\rostsub.chart"
EIP 10001FF0 gwx.10001FF0
C 0 ES 0023 32bit 0(FFFFFFFF)
P 1 CS 001B 32bit 0(FFFFFFFF)
A 0 SS 0023 32bit 0(FFFFFFFF)
Z 1 DS 0023 32bit 0(FFFFFFFF)
S 0 FS 003B 32bit 7FFDF000(FFF)
T 0 GS 0000 NULL
D 0
O 0 LastErr ERROR_SUCCESS (00000000)
EFL 00000246 (NO,NB,E,BE,NS,PE,GE,LE)
ST0 empty -??? FFFF 005E005E 005E005E
ST1 empty -??? FFFF 00D500D5 00D500D5
ST2 empty -??? FFFF 00000057 0056004F
ST3 empty -??? FFFF 000000C4 00C200B4
ST4 empty 0.0
ST5 empty 86.000000000000000000
ST6 empty 0.2500000000000000000
ST7 empty 251.39941406250000000
3 2 1 0 E S P U O Z D I
FST 0100 Cond 0 0 0 1 Err 0 0 0 0 0 0 0 0 (LT)
FCW 027F Prec NEAR,53 Mask 1 1 1 1 1 1

Стэк

0012E4D4 00F93A00
0012E4D8 00000000
0012E4DC 10051B4C RETURN to gwx.10051B4C from gwx.10001FC0
0012E4E0 100513E0 gwx.100513E0
0012E4E4 0012E4EC
0012E4E8 10086777 RETURN to gwx.10086777 from gwx.1008935B
0012E4EC 100B08B0 gwx.100B08B0
0012E4F0 10051A60 gwx.10051A60
0012E4F4 100A7810 gwx.100A7810
0012E4F8 00000000
0012E4FC 00000C83
0012E500 10051160 gwx.10051160
0012E504 10051370 gwx.10051370
0012E508 10001CD0 gwx.10001CD0
0012E50C 1000F9B7 RETURN to gwx.1000F9B7 from gwx.10051AF0
0012E510 0012EBA4 Pointer to next SEH record
0012E514 100929CE SE handler
0012E518 00000000
0012E51C 1001CA1C RETURN to gwx.1001CA1C from gwx.1000F980
0012E520 00F946CC
0012E524 00F943F0
0012E528 00162910
0012E52C 6D5C3A63
0012E530 5C737061
0012E534 74736F72
0012E538 2E627573
0012E53C 00696E69
0012E540 00150000
0012E544 7C910732 RETURN to ntdll.7C910732 from ntdll.7C90EE02
0012E548 00000004
0012E54C 00150748
0012E550 00150000
0012E554 001ACFC0
0012E558 0012E548
0012E55C 7C810603 RETURN to KERNEL32.7C810603 from KERNEL32.7C802501



Эспериментально выяснил, что если на момент 10001FEF нет хаспа и в этой точке его вставить, то при отпускании программы все проходит гладко и ключ обнаруживается. И наоборот Если ключа нет до 10001FFC, а потом его вставить, то длл-ка его все равно не видит. Логически рассуждая решил что, именно в этом куске кода и порылся хасп (не бейте ногами!). При попытке трассировать этот кусок трасер влетает в кернельную, чего-то там делает и выходит. Поскольку DWORD PTR SS:[ESP+4] всегда на выходе дает 0, то получается вечный цикл. Стоит в любой момент трасерта отпустить прогу, как она начинает плодить треды, их завершать и выходит из цикла, останавливаясь на 10001FFC (брекпойнт). Любая попытка трасерта опять приводит к бесконечному циклу. Опять же. Глянув на ESI вижу ссылку на KERNEL32.Sleep, что и навело меня на подозрение о присутствии антитрасера.

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



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 05 декабря 2007 17:08
· Личное сообщение · #2

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

Сам посмотри, в этом коде нет ничего особенного:

10001FEF 90 NOP ; пустышка для выравнивания цикла
10001FF0 6A 64 PUSH 64 ; 100mc ожидания
10001FF2 FFD6 CALL ESI ; вызов функции (оптимизация C++)
10001FF4 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] ; локальная переменная, а что в ней – х.з.
10001FF8 85C0 TEST EAX,EAX ; IF Local ==0
10001FFA ^74 F4 JE SHORT gwx.10001FF0 ; jmp 10001FF0
10001FFC 5E POP ESI ; ENDIF

Сама функция Slip ничего не возвращает, и трассировать её нет смысла.
Видимо, поток усыпает для ожидания "сигнала".
Очевидно, какой-то другой поток должен изменить локаль [ESP+4], а для этого его нужно было как-то проинформировать об этой локали выше (передать указатель). Причём поскольку это именно локальная переменная дело было обязательно в этой функции.
А что ещё можно сказать... Не знаю...
Давай листинг всей функции из IDA или саму dll.

-----
Всем привет, я вернулся



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


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