Сейчас на форуме: Adler, asfa, bartolomeo (+8 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Не фиксит проверку на правильность файла |
Посл.ответ | Сообщение |
|
Создано: 14 июня 2012 20:14 · Поправил: ghaiklor · Личное сообщение · #1 Здравствуйте профессионалы ![]() Есть ехе-шник, в котором реализована проверка на CRC32. Не могу никак побороть эту беду. PEiD выдает UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo. С помощью PE Explorer успешно снимаю дамп с восстановленной таблицей импорта. Через Resource Binder перепаковываю ресурсы PE и получаю доступ ко всем ресурсам этого ехе-шника, через DeDe получаю инфу о всех функциях и классах - казалось бы, вот оно, уже все открыто. Но при запуске программы она не запускается. Молча не запускается. Сразу же лезу в KANAL, вот что выдает: ADLER32 :: 002ED12F :: 006EDB2F ADLER32 :: 003563BD :: 00756DBD ADLER32 :: 00356486 :: 00756E86 ADLER32 :: 00356493 :: 00756E93 CRC32 :: 004AD04C :: 008AE04C List of primes [long] :: 0049C5F4 :: 0089D5F4 ZLIB deflate [long] :: 004A9670 :: 008AA670 ZLIB deflate [word] :: 004AC4AC :: 008AD4AC Через плагины CRC32 и Fix CRC PEiD попробовал пофиксить контрольную сумму, но это не дало результатов. Начал копать в сторону поиска механизма проверки, но тут же и застопорился. Нашел три "идентичных" блока кода, которые, по моему мнению, считают и проверяют контрольную сумму, но ни один из бряков на них не сработал. Программа сразу же вылетала. Дал все данные, которые я смог обнаружить. Надеюсь вы поможете мне пофиксить ехе, чтобы он после дампа запускался. Все действия провожу в целях тестирования системы защиты этой программы и использовать найденные уязвимости в коммерческих или личных целях не собираюсь. ![]() |
|
Создано: 14 июня 2012 20:22 · Личное сообщение · #2 |
|
Создано: 14 июня 2012 21:04 · Поправил: ghaiklor · Личное сообщение · #3 Сделал как ты говорил. Поставил бряк на CreateFileA/W. Выскочил сразу в кернеле32. Прошло вроде три цикла вызова CreateFile, после этого вышел в программе по адресу: 00416F94 |. E8 63993D00 CALL <JMP.&OLEAUT32.#161> После этого следует такой код:[ASM] 00416F99 |. 8BD8 MOV EBX,EAX 00416F9B |. FF4F 1C DEC DWORD PTR DS:[EDI+1C] 00416F9E |. 6A 02 PUSH 2 ; /Arg2 = 00000002 00416FA0 |. 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C] ; | 00416FA3 |. 52 PUSH EDX ; |Arg1 00416FA9 |. 83C4 08 ADD ESP,8 00416FAC |. 66:C747 10 180>MOV WORD PTR DS:[EDI+10],18 00416FB2 |. 85DB TEST EBX,EBX 00416FB6 |. 8BC3 MOV EAX,EBX 00416FB8 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4] 00416FBB |. 50 PUSH EAX 00416FBC |. FF4F 1C DEC DWORD PTR DS:[EDI+1C] 00416FBF |. 6A 02 PUSH 2 ; /Arg2 = 00000002 00416FC1 |. 52 PUSH EDX ; |Arg1 Следуя по этим функциям проверки вроде не заметил. Попал дальше на значительное считывание данных с реестра и частое указывание в EAX адреса моего ехе. Подозреваю, что он подготавливает систему для проверки хэш-суммы, поэтому в этих кусках кода веду тщательный анализ. Но пока монотонные RegCreate... и куча записей в EAX полного расположения моего ехе. ![]() |
|
Создано: 14 июня 2012 21:14 · Личное сообщение · #4 |
|
Создано: 14 июня 2012 21:17 · Личное сообщение · #5 |
|
Создано: 14 июня 2012 21:20 · Поправил: ghaiklor · Личное сообщение · #6 Dart Sergius Похоже, но дело в том, что этот тест идет сразу после выхода с CreateFile. Он еще ничего не считал даже. r_e Иду не от ОЕП, а благодаря Dart Sergius после выхода с CreateFile. Дошел к тому, что вот этот цикл берет имя файла и его каталог:[ASM] 007D2023 |> 66:8338 00 /CMP WORD PTR DS:[EAX],0 007D2029 |. 8D50 02 |LEA EDX,DWORD PTR DS:[EAX+2] 007D202E |> 8BD0 |MOV EDX,EAX 007D2030 |> 66:8338 5C |CMP WORD PTR DS:[EAX],5C 007D2036 |. 66:8338 2F |CMP WORD PTR DS:[EAX],2F 007D203C |. 66:8338 3A |CMP WORD PTR DS:[EAX],3A 007D2042 |> 8BCA |MOV ECX,EDX 007D2044 |> 8BC2 |MOV EAX,EDX 007D2046 |> 66:8338 00 CMP WORD PTR DS:[EAX],0 Искренне надеюсь на то, что после этого последует открытие этого файла и расчет его хэша. ![]() |
|
Создано: 14 июня 2012 21:23 · Поправил: ghaiklor · Личное сообщение · #7 А это еще что за? ![]() Code:
По Mutex видно, что программа еще даже не собирается закрываться, но что за IsDebuggerPresent? Это каким образом может вообще работать? Впервые это вижу. ![]() |
|
Создано: 14 июня 2012 21:34 · Поправил: ghaiklor · Личное сообщение · #8 Значит идем дальше: Правлю проверку на наличие дебагера: Code:
Затем правлю проверку на файл-сайз: Code:
Затем попадаю на: Code:
Понял то, что в случае ошибки, сразу же вызываются функции на CloseHandle и ReleaseMutex. Так вот они после этого ReadFile и вызываются. Еще не очень разобрался. После изменения попадаю все равно на закрытые хендла. Получается в любом из случаев попадаю, есть прыжок или нету. После заливки функции, которая закрывает все это, нопами все равно идет закрытие программы все тем же релейсом. Где-то должен быть прыжок на дальнейшую загрузку, только где? Вот весь этот подозрительный код: Code:
![]() |
|
Создано: 14 июня 2012 21:41 · Личное сообщение · #9 |
|
Создано: 14 июня 2012 21:42 · Личное сообщение · #10 ghaiklor 004151FC JNZ 0041528E - занопить 00415285 AND EAX,1 - заменить на mov al,1 ![]() |
|
Создано: 14 июня 2012 21:46 · Личное сообщение · #11 NikolayD после хэндла попадаем на вот это: Code:
SReg выше поправил сообщение, добавил весь код с ReadFile. Сейчас сделаю твои изменения. ![]() |
|
Создано: 14 июня 2012 21:50 · Поправил: ghaiklor · Личное сообщение · #12 |
|
Создано: 14 июня 2012 21:59 · Личное сообщение · #13 |
|
Создано: 14 июня 2012 22:07 · Личное сообщение · #14 Уязвимость найдена. Огромное спасибо всем вам, особенно SReg ![]() Рассказываю: 1) Проверка на наличие дебаггера - залил нопами. 2) Проверка на размер файла - залил нопами. 3) Еще какая-то проверка, когда считывает с файла побайтово. Спасибо SReg за Code:
После этого получаем полностью работоспособный ехе. ![]() |
|
Создано: 14 июня 2012 22:16 · Поправил: NikolayD · Личное сообщение · #15 ghaiklor пишет: 1) Проверка на наличие дебаггера - залил нопами. это лишнее. ghaiklor пишет: 00415285 AND EAX,1 - заменить на MOV AL,1 а это одно и тоже Code:
поменять на Code:
только у SReg'a на три байта меньше )) ![]() |
|
Создано: 14 июня 2012 22:50 · Личное сообщение · #16 |
|
Создано: 14 июня 2012 23:02 · Личное сообщение · #17 Нулевой бит не выделяется операцией 'И' (в результате этого получали 0 в EAX), а устанавливается непосредственно в единицу. ----- Следуй за белым кроликом ![]() |
|
Создано: 15 июня 2012 01:46 · Личное сообщение · #18 |
|
Создано: 15 июня 2012 09:50 · Личное сообщение · #19 |
![]() |
eXeL@B —› Вопросы новичков —› Не фиксит проверку на правильность файла |
Эта тема закрыта. Ответы больше не принимаются. |