![]() |
eXeL@B —› Программирование —› C0000026 (INVALID DISPOSITION) |
Посл.ответ | Сообщение |
|
Создано: 01 мая 2009 03:43 · Личное сообщение · #1 Ктонить сталкивался с таким исключением? ...Что это значит ? Есть ли антидебаг какой то на этом принцепе? Ковыряю прогу , и там импорт заполняется через постоянные C0000026 (INVALID DISPOSITION) , причем как то хитро что я даже не пойму что за методика ![]() ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 01 мая 2009 03:49 · Поправил: mak · Личное сообщение · #2 ![]() Вот что значит C0000026 EXCEPTION_INVALID_DISPOSITION An exception handler returned an invalid array to the exception dispatcher. А вот надыбал доку .... Non-continuable exception trick I haven't seen it before in public but it's possible I'm not the first one who researched this subject. I implemented similar code about year ago in my "ever unfinished" crackme, but since I doubt I'll finish the crackme, here it goes. The idea revolves about non-continuable exceptions, that is exceptions with EXCEPTION_NONCONTINUABLE flag set in exception record. Normally, if your SEH procedure gets such an exception, you're basically screwed: you can't return 'continue execution' status, and your process is going to be mercilessly killed. If you try to continue, you will get STATUS_NONCONTINUABLE_EXCEPTION thrown by Windows exception dispatcher - there is no way out. Or is there? ;) What if we patch or hook windows exception dispatcher (in our process only) and just clear the noncontinuable bit if it's present before dispatching the exception down to SEH? It turns out that it works as expected - we can now escape and continue even after originally non-continuable exception. Furthermore, debuggers seem to not really like it. Olly simply refuses to continue even if we clear the noncontinuable flag (but olly can't even properly handle haedware BPs set in the code so who cares ;). Windbg fares a bit better, but still falls in an infinite loop (maybe more experienced users could overcome that). IDA seems to not handle the "rethrow" of division by zero exception at the end properly (but I hardly use IDA's debugger, so others may have more luck). Also, it doesn't properly run on WINE I heard, but more tests would be nice. ![]() Anyway, it's quite fun code, maybe it will be useful to someone. Below is the FASM source, and here is the source+exe: omeg.pl/code/noncontinuable_exc.zip ;------------------------------------------------ ; Invalid Disposition exception trick ; or making noncontinuable exception continuable ;) ; Copyleft (c) Omega Red 2007, 2008 ; fasm source ;------------------------------------------------ ; 32-bit executable ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 01 мая 2009 03:55 · Поправил: mak · Личное сообщение · #3 NoobyProt это фигню использует , буду терь разбирать код и импорт востановлю =) , интересно то что там еще какая то фигня с оепом , уже почти у оепа , но что то там опять нето. Тоже на исключениях построено. Может даже тот же принцып ... Code:
----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 01 мая 2009 12:05 · Поправил: Nooby · Личное сообщение · #4 enum EXCEPTION_DISPOSITION { ExceptionContinueExecution, ExceptionContinueSearch, ExceptionNestedException, ExceptionCollidedUnwind } EXCEPTION_DISPOSITION __cdecl _except_handler (struct _EXCEPTION_RECORD *_ExceptionRecord, void *_EstablisherFrame, struct _CONTEXT *_ContextRecord, void *_DispatcherContext); Appearently some value other than the defined enumerations will cause an INVALID_DISPOSITION exception and then passed into the same handler again, and eventually cause a stack overflow. mak: Your example assumes that there is only one exception frame between it's own handler and the unhandled exception handler, which is usually not the case and I didn't use it. ![]() ![]() |
|
Создано: 01 мая 2009 16:08 · Личное сообщение · #5 |
|
Создано: 02 мая 2009 12:34 · Поправил: ARCHANGEL · Личное сообщение · #6 |
|
Создано: 02 мая 2009 13:23 · Личное сообщение · #7 ARCHANGEL ![]() Мож еще кто хочет поковырять ... вот тут залил www.onlinedisk.ru/file/131853/ , может старая версия , новых не видел...но всеравно интересно ![]() А импорт приложил к вложению , вроде полный ... Nooby Спасибо! ![]() ![]() ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 02 мая 2009 13:25 · Личное сообщение · #8 |
|
Создано: 06 мая 2009 15:25 · Личное сообщение · #9 |
|
Создано: 07 мая 2009 00:06 · Поправил: mak · Личное сообщение · #10 ARCHANGEL ![]() Ктонить ковырял дальше ? =)нубапрот ? Вот дешифровщик кода ...шаблон , таких много там 00D59B6A 87B0 BB75EC50 XCHG DWORD PTR DS:[EAX+50EC75BB],ESI 00D59B70 E8 00000000 CALL npdemo.00D59B75 00D59B75 830424 2C ADD DWORD PTR SS:[ESP],2C 00D59B79 9C PUSHFD 00D59B7A 50 PUSH EAX 00D59B7B 810424 BB75EC50 ADD DWORD PTR SS:[ESP],50EC75BB 00D59B82 60 PUSHAD 00D59B83 6A 00 PUSH 0 00D59B85 54 PUSH ESP 00D59B86 68 40010000 PUSH 140 00D59B8B 6A 04 PUSH 4 00D59B8D FF7424 30 PUSH DWORD PTR SS:[ESP+30] 00D59B91 B8 16C6618A MOV EAX,8A61C616 00D59B96 FF90 416CEE75 CALL DWORD PTR DS:[EAX+75EE6C41] ; kernel32.VirtualProtect 00D59B9C 83C4 04 ADD ESP,4 00D59B9F 61 POPAD 00D59BA0 C3 RETN 00D59BA1 87EE XCHG ESI,EBP 00D59BA3 03F5 ADD ESI,EBP 00D59BA5 03F1 ADD ESI,ECX 00D59BA7 33F2 XOR ESI,EDX 00D59BA9 33F7 XOR ESI,EDI 00D59BAB 03FE ADD EDI,ESI 00D59BAD 87B0 BB75EC50 XCHG DWORD PTR DS:[EAX+50EC75BB],ESI 00D59BB3 D1C9 ROR ECX,1 00D59BB5 D1C2 ROL EDX,1 00D59BB7 03C3 ADD EAX,EBX 00D59BB9 83EB 04 SUB EBX,4 00D59BBC 2BC3 SUB EAX,EBX 00D59BBE 83FB 00 CMP EBX,0 00D59BC1 ^ 75 A7 JNZ SHORT npdemo.00D59B6A сейчас его гоняю по разному , тут расшифровывается секция кода , через Guard Pages , сначала думал антиотладка , но фиг знает , смотрю пока , потому что расшифровка идет по кускам точно , и судя по всему рандомными кусками , не обязательно те что сразу за внедренным кодом в секции кода вида 0048626C 9D POPFD 0048626D C3 RETN 0048626E 70 28 JO SHORT npdemo.00486298 по рету мы выхожим на дешифровщик по адресу 00D59B6A также всегда присутсвует 0048626E 70 28 JO SHORT npdemo.00486298 а вот трасировка сразу следующая 00486270 9D POPFD 00486271 C3 RETN 00486272 70 28 JO SHORT npdemo.0048629C и следующая =) 00486274 9D POPFD 00486275 C3 RETN 00486276 70 28 JO SHORT npdemo.004862A0 и еще одна для статистики 00486278 9D POPFD 00486279 C3 RETN 0048627A 70 28 JO SHORT npdemo.004862A4 не трудно отследить что шаг 4 идет Ближайший сех в коде настроеный выглядит так 00D52DEE 60 PUSHAD 00D52DEF 70 53 JO SHORT npdemo.00D52E44 00D52DF1 71 51 JNO SHORT npdemo.00D52E44 00D52DF3 36:B4 2A MOV AH,2A ; Superfluous prefix 00D52DF6 4D DEC EBP 00D52DF7 BC 3BA82AB8 MOV ESP,B82AA83B 00D52DFC DF2A FILD QWORD PTR DS:[EDX] 00D52DFE AD LODS DWORD PTR DS:[ESI] 00D52DFF C8 4AD8BF ENTER 0D84A,0BF 00D52E03 4A DEC EDX 00D52E04 CD 7C INT 7C 00D52E06 FE ??? ; Unknown command 00D52E07 6C INS BYTE PTR ES:[EDI],DX ; I/O command 00D52E08 0B06 OR EAX,DWORD PTR DS:[ESI] 00D52E0A 815CDE 4C 2BE66>SBB DWORD PTR DS:[ESI+EBX*8+4C],CE61E62B 00D52E12 4C DEC ESP 00D52E13 C2 A554 RETN 54A5 Похоже он не расшифровывается =) бряк на сехе не срабатывал .... а вот в то что привращается код после вот таких примерных игр с пайдж гуард 0047CD5E 50 PUSH EAX 0047CD5F F7D9 NEG ECX 0047CD61 55 PUSH EBP 0047CD62 C74424 34 28000>MOV DWORD PTR SS:[ESP+34],28 0047CD6A 895C24 38 MOV DWORD PTR SS:[ESP+38],EBX 0047CD6E 894C24 3C MOV DWORD PTR SS:[ESP+3C],ECX 0047CD72 66:C74424 40 01>MOV WORD PTR SS:[ESP+40],1 0047CD79 66:C74424 42 20>MOV WORD PTR SS:[ESP+42],20 0047CD80 896C24 44 MOV DWORD PTR SS:[ESP+44],EBP 0047CD84 FF15 1C914900 CALL DWORD PTR DS:[<&GDI32.CreateDIBSection>] ; GDI32.CreateDIBSection 0047CD8A 8BC8 MOV ECX,EAX 0047CD8C 3BCD CMP ECX,EBP 0047CD8E 894C24 18 MOV DWORD PTR SS:[ESP+18],ECX Код разбит на куски , между ними стоят инты ....много интов , далее посмотрим зачем эти области нужны =) Теоретически ОЕП была найдена ранее =) ... но она срабатывала по нескольку раз и все время как то проскакивало мимо ... сейчас когда находимся на теоретическом оепе =)код такой 00491247 55 PUSH EBP 00491248 8BEC MOV EBP,ESP ; Original Entry Point 0049124A 83C4 E0 ADD ESP,-20 0049124D 8945 E0 MOV DWORD PTR SS:[EBP-20],EAX 00491250 DD5D F8 FSTP QWORD PTR SS:[EBP-8] 00491253 894D E4 MOV DWORD PTR SS:[EBP-1C],ECX 00491256 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10] 00491259 8B4D 14 MOV ECX,DWORD PTR SS:[EBP+14] 0049125C 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX 0049125F 894D EC MOV DWORD PTR SS:[EBP-14],ECX 00491262 8D45 08 LEA EAX,DWORD PTR SS:[EBP+8] 00491265 8D4D E0 LEA ECX,DWORD PTR SS:[EBP-20] 00491268 50 PUSH EAX 00491269 51 PUSH ECX 0049126A 52 PUSH EDX 0049126B E8 17150000 CALL npdemo.00492787 00491270 83C4 0C ADD ESP,0C 00491273 DD45 F8 FLD QWORD PTR SS:[EBP-8] 00491276 66:817D 08 7F02 CMP WORD PTR SS:[EBP+8],27F 0049127C 74 03 JE SHORT npdemo.00491281 0049127E D96D 08 FLDCW WORD PTR SS:[EBP+8] 00491281 C9 LEAVE 00491282 C3 RETN 00491283 CC INT3 00491284 CC INT3 00491285 CC INT3 но код расшифрован не полностью судя например по коду вот тут 004112B5 8B86 0146C45A MOV EAX,DWORD PTR DS:[ESI+5AC44601] 004112BB 3D CC4B2AA8 CMP EAX,A82A4BCC 004112C0 3E:59 POP ECX ; Superfluous prefix 004112C2 A8 2F TEST AL,2F 004112C4 7A F8 JPE SHORT npdemo.004112BE 004112C6 6E OUTS DX,BYTE PTR ES:[EDI] ; I/O command 004112C7 09F8 OR EAX,EDI 004112C9 ^ 7F 82 JG SHORT npdemo.0041124D 004112CB 0096 F1008744 ADD BYTE PTR DS:[ESI+448700F1],DL 004112D1 C6 ??? ; Unknown command 004112D2 54 PUSH ESP 004112D3 33CE XOR ECX,ESI 004112D5 49 DEC ECX 004112D6 A6 CMPS BYTE PTR DS:[ESI],BYTE PTR ES:[EDI] 004112D7 24 BA AND AL,0BA 004112D9 DD ??? ; Unknown command 004112DA 2C AB SUB AL,0AB 004112DC F674EA 8D DIV BYTE PTR DS:[EDX+EBP*8-73] 004112E0 ^ 7C FB JL SHORT npdemo.004112DD 004112E2 6A E8 PUSH -18 004112E4 7E 19 JLE SHORT npdemo.004112FF 004112E6 E8 6F72F066 CALL 6731855A 004112EB 01F0 ADD EAX,ESI 004112ED 77 60 JA SHORT npdemo.0041134F 004112EF E2 70 LOOPD SHORT npdemo.00411361 004112F1 17 POP SS ; Modification of segment register 004112F2 E2 65 LOOPD SHORT npdemo.00411359 004112F4 8200 96 ADD BYTE PTR DS:[EAX],-6A 004112F7 F1 INT1 004112F8 0087 32B02641 ADD BYTE PTR DS:[EDI+4126B032],AL 004112FE B0 37 MOV AL,37 00411300 1290 06619017 ADC DL,BYTE PTR DS:[EAX+17906106] 00411306 C446 D4 LES EAX,FWORD PTR DS:[ESI-2C] ; Modification of segment register 00411309 B3 4E MOV BL,4E 0041130B C9 LEAVE 0041130C 04 86 ADD AL,86 0041130E 14 73 ADC AL,73 00411310 8E09 MOV CS,WORD PTR DS:[ECX] ; Segment CS is not allowed 00411312 36:B4 2A MOV AH,2A ; Superfluous prefix 00411315 4D DEC EBP 00411316 BC 3B840694 MOV ESP,9406843B 0041131B F3: PREFIX REP: ; Superfluous prefix 0041131C 0E PUSH CS 0041131D 8932 MOV DWORD PTR DS:[EDX],ESI 0041131F B0 26 MOV AL,26 00411321 41 INC ECX а вот еще один дешифровщик найденный по ходу дела =) ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 07 мая 2009 00:12 · Личное сообщение · #11 00D5959C 87B0 F851C8B9 XCHG DWORD PTR DS:[EAX+B9C851F8],ESI 00D595A2 E8 00000000 CALL npdemo.00D595A7 00D595A7 830424 0E ADD DWORD PTR SS:[ESP],0E 00D595AB 9C PUSHFD 00D595AC 50 PUSH EAX 00D595AD 810424 F851C8B9 ADD DWORD PTR SS:[ESP],B9C851F8 00D595B4 C3 RETN 00D595B5 87EE XCHG ESI,EBP 00D595B7 03F5 ADD ESI,EBP 00D595B9 03F1 ADD ESI,ECX 00D595BB 33F2 XOR ESI,EDX 00D595BD 33F7 XOR ESI,EDI 00D595BF 03FE ADD EDI,ESI 00D595C1 87B0 F851C8B9 XCHG DWORD PTR DS:[EAX+B9C851F8],ESI 00D595C7 D1C1 ROL ECX,1 00D595C9 D1CA ROR EDX,1 00D595CB 03C3 ADD EAX,EBX 00D595CD 83EB 04 SUB EBX,4 00D595D0 2BC3 SUB EAX,EBX 00D595D2 83FB 00 CMP EBX,0 00D595D5 ^ 75 C5 JNZ SHORT npdemo.00D5959C .... расматривая дальше , идем по коду и видим по адресу вот такую лажу 00D59AF9 83EC FC SUB ESP,-4 00D59AFC E8 B4FCFFFF CALL npdemo.00D597B5 00D59B01 5A POP EDX 00D59B02 17 POP SS ; Modification of segment register 00D59B03 D836 FDIV DWORD PTR DS:[ESI] 00D59B05 816C24 04 317D4>SUB DWORD PTR SS:[ESP+4],3A487D31 00D59B0D 83C4 04 ADD ESP,4 00D59B10 9D POPFD 00D59B11 9D POPFD 00D59B12 9D POPFD 00D59B13 9D POPFD 00D59B14 9D POPFD 00D59B15 9D POPFD 00D59B16 9D POPFD 00D59B17 9D POPFD 00D59B18 9D POPFD 00D59B19 9D POPFD 00D59B1A 9D POPFD 00D59B1B 9D POPFD 00D59B1C 9D POPFD 00D59B1D 9D POPFD 00D59B1E 9D POPFD 00D59B1F 9D POPFD 00D59B20 9D POPFD 00D59B21 9D POPFD 00D59B22 9D POPFD 00D59B23 9D POPFD 00D59B24 9D POPFD 00D59B25 9D POPFD 00D59B26 9D POPFD 00D59B27 9D POPFD 00D59B28 9D POPFD 00D59B29 9D POPFD 00D59B2A 9D POPFD 00D59B2B 9D POPFD 00D59B2C 9D POPFD 00D59B2D 9D POPFD =) В проте активно используются потоки , что не есть гуд для нас ....оля как наркоман балдеет от них ) ...а я от оли)))))))) Также используется синхронизация через критикалсекшн =) Модифицированные код , который я просто наскоком просматривал , внезапно оказался по другому офсету =) , и причем эти куски я уже видел , именно они дешифровались а теперь они уже в секции по адресу - хочу сказать что это лишшь заметки поведения прота =) Трасируя дальше становится ясно , что оеп собственно говоря неверный, потому что остались куски пошифрованные , и еще нет активной работы проги , есть только обфусцированный код , с антиотладкой =) , который при косяках , выдает всякие странные фичи =) Бряки ставить вообще нереально , на любой адрес .... по крайней мере отладчик сразу убивает прогу с кодом неверный импорт , или же просто инвалид деспозишн. Собственно того что я хотел я добился. Безпроблемное беганье по коду в ольге .... и постоянный запуск прота в оле без косяков Сейчас проблема со скриптами , почему то они не выполняют то что мне нужно , раз через раз , причем даже при ручной прогонке олискрипт оч оч глючит. Поэтому как только его починю =) Выложу полный анпаченый файл. Импорт вроде тот же ...второй раз его не проверял , но там легко , на крайняк востановить ![]() ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 09 мая 2009 16:15 · Поправил: Clerk · Личное сообщение · #12 mak Вот скомпилел антидебаг, тока на другом принципе: Code:
В стек загружаем указатель куда будет выполнен переход, поксоренный с UsEncodeMask и юзаем начало пикода, например: Code:
Попробуйте протрассировать. ![]() |
|
Создано: 09 мая 2009 17:38 · Личное сообщение · #13 Нуби был прав ,там другой принцып инвалиддиспозишн , тем не менее наткнулся на такой трюк ... интересно тоже с вариантами поиграться. Clerk ты как всегда ченить интересное выложишь ![]() ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 09 мая 2009 17:44 · Поправил: Clerk · Личное сообщение · #14 mak Нету там ничего интересного, баян уже сто раз писал и говорил. Вот сурцы Выход потока из под трассировки, тоесть сброс TF это альтернатива любому антиотладочному механизму в юзермоде. Лучшего легального способа обойти трассировку не существует. ![]() |
|
Создано: 17 мая 2009 22:34 · Личное сообщение · #15 |
|
Создано: 18 мая 2009 15:58 · Личное сообщение · #16 Как-то странно навешан прот на нуби протект. Ни защиты импорта, ничего кроме выноса некоторых функций в отдельную секцию и их замусоривания ----- Research For Food ![]() |
|
Создано: 18 мая 2009 22:26 · Личное сообщение · #17 |
|
Создано: 20 мая 2009 08:51 · Личное сообщение · #18 |
|
Создано: 20 мая 2009 14:24 · Личное сообщение · #19 ![]() Вообщемто , учитывая что никто не пишет о падениях , то пусть топ будет временно закрыт , потом когда будет время скриптисы сделаю нормальные. Но я так понял протектор не будет пользоваться популярностью. Поэтому вот так ... ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
![]() |
eXeL@B —› Программирование —› C0000026 (INVALID DISPOSITION) |