/\ /\ / \_ _/ \ ____/ /__ T E A M . F I F T Y . T H R E E __\ \____ \__ ____\\- ____ -//____ __/ / /_____ ______\ \__________\ \ _/ /_\ \_________________________-// // ____/ /_\ \_ __\ _\ ____ /___ _ \_ \/ // ___\/_ /__ ))______________\_ _______\_|__ /____\/_____\ /gf _/______________(( \___\\- /___//- /____((- TEAM FiFTY THREE TUTORiALS PACK # SEVENTEEN ASProtect и анализ hardware breakpoints Автор..: ThunderPwr Перевод: NightCat//TEAM-53 В этом коротком документе я хотел бы объснить как мы можем обойти такую функцию ASPR'a, как "hardware breakpoint clearing". ASProtect и правда может ощичать наши hardware breakpoints, эта функция была внедрена с целью пресечь стелс-трейсинг. ASProtect способен детектить любые изменения в коде после стадии декомпрессии (memory patching) и так же любые изменения в коде самого ASProtect'a. Вы можете сталкнуться с этим делом используя software breakpoint в коде ASProtect'a или просто пропачить код до того, как прошла проверка памяти. Использование Hardware breakpoints более полезно из-за немее навязчивой природы этого брейкпоинта по сравнению с software breakpoint, т.к. последний работает с изменением кода. Работая же с hardware breakpoint мы получаем чуть больше возможностей в стелс-дебаггинге/патчинге, потому что все манипуляции могут быть проделаны без изменения самого кода. Мы можем поставить hardware breakpoint и поиграть с окружением процесса (используя GetThreadContext и SetThreadContext), чтобы изменить регистры и значения или поменять EIP... и т.д. Так что с этой точки зрения нам бы лучше найти путь, чтобы обойти эту функцию ASProtect'a. После нескольких опытов и эскпериментов :) я всё-таки выяснил, как это можно провернуть. 1. Достигаем последовательности ASPACK'a: - грузим цель в OllyDbg; - На ЕР цели ставим software breakpoint на VirtualFree API; - жмём Shift+F9 3 раза, чтобы вернуться в код вызова и скроллим немного вниз, пока не увидим последовательность от ASPACK'a (более точно вы опознаете POPAD / RETN 0C, но кое-какой код всё равно будет там): 018EE5C1 61 POPAD 018EE5C2 75 08 JNZ SHORT 018EE5CC 018EE5C4 B8 01000000 MOV EAX,1 018EE5C9 C2 0C00 RETN 0C 018EE5CC 68 00000000 PUSH 0 018EE5D1 C3 RETN 2. Убираем VirtuaFree API breakpoint и ставим еще один software breakpoint (F2) прямо на инструкцию RETN в конце последовательности ASPack'a, затем жмём Shift+F9. Когда OllyDbg прервётся, жмём F7 один раз. 018E50C4 55 PUSH EBP 018E50C5 8BEC MOV EBP,ESP 018E50C7 83C4 B4 ADD ESP,-4C 018E50CA B8 A44E8E01 MOV EAX,18E4EA4 018E50CF E8 3806FEFF CALL 018C570C 018E50D4 E8 C3E4FDFF CALL 018C359C 018E50D9 8D40 00 LEA EAX,DWORD PTR DS:[EAX] 018E50DC 0000 ADD BYTE PTR DS:[EAX],AL 018E50DE 0000 ADD BYTE PTR DS:[EAX],AL 018E50E0 0000 ADD BYTE PTR DS:[EAX],AL 018E50E2 0000 ADD BYTE PTR DS:[EAX],AL Жмём CTRL-B. 3. В окне кода OllyDbg жмём Ctrl+B и делаем "binary search" данной последовательности байт: 55 8B EC 8B 45 10 33 D2 89 50 04 4. Если всё хорошо, то вы увидите какой вот код: 018D7228 55 PUSH EBP 018D7229 8BEC MOV EBP,ESP 018D722B 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10] 018D722E 33D2 XOR EDX,EDX 018D7230 8950 04 MOV DWORD PTR DS:[EAX+4],EDX 018D7233 8B15 F8838E01 MOV EDX,DWORD PTR DS:[18E83F8] 018D7239 8990 C4000000 MOV DWORD PTR DS:[EAX+C4],EDX 018D723F 33D2 XOR EDX,EDX 018D7241 8950 08 MOV DWORD PTR DS:[EAX+8],EDX 018D7244 8B15 FC838E01 MOV EDX,DWORD PTR DS:[18E83FC] 018D724A 8990 B4000000 MOV DWORD PTR DS:[EAX+B4],EDX 018D7250 33D2 XOR EDX,EDX 018D7252 8950 0C MOV DWORD PTR DS:[EAX+C],EDX 018D7255 8B15 00848E01 MOV EDX,DWORD PTR DS:[18E8400] 018D725B 8990 B8000000 MOV DWORD PTR DS:[EAX+B8],EDX 018D7261 33D2 XOR EDX,EDX 018D7263 8950 10 MOV DWORD PTR DS:[EAX+10],EDX 018D7266 33C0 XOR EAX,EAX 018D7268 5D POP EBP 018D7269 C3 RETN 5. Этот код будет вызван из SEH ASProtect'a, чтобы очистить hardware breakpoints. Дабы предотвратить это дело нужно всего лишь пропатчить код как показано ниже: 018D7228 55 PUSH EBP 018D7229 8BEC MOV EBP,ESP 018D722B 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10] 018D722E 90 NOP 018D722F 90 NOP 018D7230 90 NOP 018D7231 90 NOP 018D7232 90 NOP 018D7233 8B15 F8838E01 MOV EDX,DWORD PTR DS:[18E83F8] 018D7239 8990 C4000000 MOV DWORD PTR DS:[EAX+C4],EDX 018D723F 90 NOP 018D7240 90 NOP 018D7241 90 NOP 018D7242 90 NOP 018D7243 90 NOP 018D7244 8B15 FC838E01 MOV EDX,DWORD PTR DS:[18E83FC] 018D724A 8990 B4000000 MOV DWORD PTR DS:[EAX+B4],EDX 018D7250 90 NOP 018D7251 90 NOP 018D7252 90 NOP 018D7253 90 NOP 018D7254 90 NOP 018D7255 8B15 00848E01 MOV EDX,DWORD PTR DS:[18E8400] 018D725B 8990 B8000000 MOV DWORD PTR DS:[EAX+B8],EDX 018D7261 90 NOP 018D7262 90 NOP 018D7263 90 NOP 018D7264 90 NOP 018D7265 90 NOP 018D7266 33C0 XOR EAX,EAX 018D7268 5D POP EBP 018D7269 C3 RETN 6. Я протестил - вы можете оставить код пропатченным. АСПР его не задетектит. Чтобы ускорить работу я написал маленькую программку. Она трейсится и ищет эту последовательности байт, но конечно разные версии АСПРа скорее всего будут иметь разные последовательности, но путь я вам указал...