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

 eXeL@B —› Вопросы новичков —› Не фиксит проверку на правильность файла
Посл.ответ Сообщение

Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 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 попробовал пофиксить контрольную сумму, но это не дало результатов.
Начал копать в сторону поиска механизма проверки, но тут же и застопорился. Нашел три "идентичных" блока кода, которые, по моему мнению, считают и проверяют контрольную сумму, но ни один из бряков на них не сработал. Программа сразу же вылетала.

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

Все действия провожу в целях тестирования системы защиты этой программы и использовать найденные уязвимости в коммерческих или личных целях не собираюсь.




Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 14 июня 2012 20:22
· Личное сообщение · #2

хм, смотреть пока нету возможности, но попробуй перехватить CreateFileA/W и чтобы открывался сам файл. После идёт вызов функции проверки CRC. После какой-то функции она вернёт 1 вместо 0 или наборот. Вот там и правь вызов на mov eax,0/1(смотря что нужно вернуть).



Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 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 полного расположения моего ехе.




Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 14 июня 2012 21:14
· Личное сообщение · #4

00416FB2 |. 85DB TEST EBX,EBX - не похоже на проверку после вызова функции?
регистр ebx не изменяется после call на 00416FA4
Значит он меняется в самой функции. Гляди что делает функция.



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 14 июня 2012 21:17
· Личное сообщение · #5

ghaiklor
Подозреваю что вы не там копаете. crc32 - стандартная функция для zip операций, которые вы и нашли. Скорей всего косяки где-то раньше по тексту. Трасьте от ОЕП и дальше.

-----
старый пень




Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 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
Искренне надеюсь на то, что после этого последует открытие этого файла и расчет его хэша.



Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 июня 2012 21:23 · Поправил: ghaiklor
· Личное сообщение · #7

А это еще что за?
Code:
  1. 004150DE   . 6A 00          PUSH 0                                   ; |InitialOwner = FALSE
  2. 004150E0   . 6A 00          PUSH 0                                   ; |pSecurity = NULL
  3. 004150E2   . E8 9DAB3D00    CALL <JMP.&KERNEL32.CreateMutexA>        ; \CreateMutexA
  4. 004150E7   . 8985 ACFCFFFF  MOV DWORD PTR SS:[EBP-354],EAX
  5. 004150ED   . 66:C785 C4FCFF>MOV WORD PTR SS:[EBP-33C],18
  6. 004150F6   . 6A 00          PUSH 0                                   ; /Timeout = 0. ms
  7. 004150F8   . 8B95 ACFCFFFF  MOV EDX,DWORD PTR SS:[EBP-354]           ; |
  8. 004150FE   . 52             PUSH EDX                                 ; |hObject
  9. 004150FF   . E8 8CAE3D00    CALL <JMP.&KERNEL32.WaitForSingleObject> ; \WaitForSingleObject
  10. 00415104   . 85C0           TEST EAX,EAX
  11. 00415108   . 6A 00          PUSH 0                                   ; /Title = NULL
  12. 0041510F   . E8 CCB33D00    CALL <JMP.&USER32.FindWindowA>           ; \FindWindowA
  13. 00415114   . 8985 A8FCFFFF  MOV DWORD PTR SS:[EBP-358],EAX
  14. 0041511A   . 83BD A8FCFFFF >CMP DWORD PTR SS:[EBP-358],0
  15. 00415127   . 6A 00          PUSH 0                                   ; /lParam = 0
  16. 00415129   . 6A 00          PUSH 0                                   ; |wParam = 0
  17. 0041512B   . 68 01040000    PUSH 401                                 ; |Message = WM_USER+1
  18. 00415130   . 8B8D A8FCFFFF  MOV ECX,DWORD PTR SS:[EBP-358]           ; |
  19. 00415136   . 51             PUSH ECX                                 ; |hWnd
  20. 00415137   . E8 D2B53D00    CALL <JMP.&USER32.PostMessageA>          ; \PostMessageA
  21. 00415141   > E8 30AD3D00    CALL <JMP.&KERNEL32.IsDebuggerPresent>   ; [IsDebuggerPresent

По Mutex видно, что программа еще даже не собирается закрываться, но что за IsDebuggerPresent? Это каким образом может вообще работать? Впервые это вижу.



Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 июня 2012 21:34 · Поправил: ghaiklor
· Личное сообщение · #8

Значит идем дальше:
Правлю проверку на наличие дебагера:
Code:
  1. 00415141   > E8 30AD3D00    CALL <JMP.&KERNEL32.IsDebuggerPresent>   ; [IsDebuggerPresent
  2. 00415146   . 85C0           TEST EAX,EAX

Затем правлю проверку на файл-сайз:
Code:
  1. 004151DE   . 6A 00          PUSH 0                                   ; /pFileSizeHigh = NULL
  2. 004151E0   . 8B85 A0FCFFFF  MOV EAX,DWORD PTR SS:[EBP-360]           ; |
  3. 004151E6   . 50             PUSH EAX                                 ; |hFile
  4. 004151E7   . E8 76AB3D00    CALL <JMP.&KERNEL32.GetFileSize>         ; \GetFileSize
  5. 004151EC   . 8985 9CFCFFFF  MOV DWORD PTR SS:[EBP-364],EAX
  6. 004151F2   . 81BD 9CFCFFFF >CMP DWORD PTR SS:[EBP-364],1B3600

Затем попадаю на:
Code:
  1. 00415222   . 6A 00          PUSH 0                                   ; /pOverlapped = NULL
  2. 00415224   . 8D95 98FCFFFF  LEA EDX,DWORD PTR SS:[EBP-368]           ; |
  3. 0041522A   . 52             PUSH EDX                                 ; |pBytesRead
  4. 0041522B   . 8B8D 9CFCFFFF  MOV ECX,DWORD PTR SS:[EBP-364]           ; |
  5. 00415231   . C1E1 02        SHL ECX,2                                ; |
  6. 00415234   . 51             PUSH ECX                                 ; |BytesToRead
  7. 00415235   . 8B85 94FCFFFF  MOV EAX,DWORD PTR SS:[EBP-36C]           ; |
  8. 0041523B   . 50             PUSH EAX                                 ; |Buffer
  9. 0041523C   . 8B95 A0FCFFFF  MOV EDX,DWORD PTR SS:[EBP-360]           ; |
  10. 00415242   . 52             PUSH EDX                                 ; |hFile
  11. 00415243   . E8 8EAC3D00    CALL <JMP.&KERNEL32.ReadFile>            ; \ReadFile
  12. 00415248   . 85C0           TEST EAX,EAX

Понял то, что в случае ошибки, сразу же вызываются функции на CloseHandle и ReleaseMutex. Так вот они после этого ReadFile и вызываются. Еще не очень разобрался.
После изменения попадаю все равно на закрытые хендла. Получается в любом из случаев попадаю, есть прыжок или нету.
После заливки функции, которая закрывает все это, нопами все равно идет закрытие программы все тем же релейсом. Где-то должен быть прыжок на дальнейшую загрузку, только где?
Вот весь этот подозрительный код:
Code:
  1. 00415222   . 6A 00          PUSH 0                                   ; /pOverlapped = NULL
  2. 00415224   . 8D95 98FCFFFF  LEA EDX,DWORD PTR SS:[EBP-368]           ; |
  3. 0041522A   . 52             PUSH EDX                                 ; |pBytesRead
  4. 0041522B   . 8B8D 9CFCFFFF  MOV ECX,DWORD PTR SS:[EBP-364]           ; |
  5. 00415231   . C1E1 02        SHL ECX,2                                ; |
  6. 00415234     51             PUSH ECX
  7. 00415235   . 8B85 94FCFFFF  MOV EAX,DWORD PTR SS:[EBP-36C]           ; |
  8. 0041523B   . 50             PUSH EAX                                 ; |Buffer
  9. 0041523C   . 8B95 A0FCFFFF  MOV EDX,DWORD PTR SS:[EBP-360]           ; |
  10. 00415242   . 52             PUSH EDX                                 ; |hFile
  11. 00415243   . E8 8EAC3D00    CALL <JMP.&KERNEL32.ReadFile>            ; \ReadFile
  12. 00415248     85C0           TEST EAX,EAX
  13. 0041524C   . 33DB           XOR EBX,EBX
  14. 0041524E   . 33C0           XOR EAX,EAX
  15. 00415250   . 66:C785 C4FCFF>MOV WORD PTR SS:[EBP-33C],318
  16. 00415259   . 3B85 9CFCFFFF  CMP EAX,DWORD PTR SS:[EBP-364]
  17. 00415261   > 8B95 94FCFFFF  MOV EDX,DWORD PTR SS:[EBP-36C]
  18. 00415267   . 031C82         ADD EBX,DWORD PTR DS:[EDX+EAX*4]
  19. 0041526A   . 40             INC EAX
  20. 0041526B   . 3B85 9CFCFFFF  CMP EAX,DWORD PTR SS:[EBP-364]
  21. 00415273     8B8D 94FCFFFF  MOV ECX,DWORD PTR SS:[EBP-36C]
  22. 00415279   . 51             PUSH ECX                                 ; /Arg1
  23. 0041527F   . 59             POP ECX
  24. 00415280   . 85DB           TEST EBX,EBX
  25. 00415282   . 0F94C0         SETE AL
  26. 00415285   . 83E0 01        AND EAX,1
  27. 00415288   . 8885 A7FCFFFF  MOV BYTE PTR SS:[EBP-359],AL
  28. 0041528E   > 8B95 A0FCFFFF  MOV EDX,DWORD PTR SS:[EBP-360]
  29. 00415294   . 52             PUSH EDX                                 ; /hObject
  30. 00415295   . E8 C0A93D00    CALL <JMP.&KERNEL32.CloseHandle>         ; \CloseHandle




Ранг: 189.9 (ветеран), 334thx
Активность: 0.30
Статус: Участник

Создано: 14 июня 2012 21:41
· Личное сообщение · #9

Что там за переход после CloseHandle? ))



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 14 июня 2012 21:42
· Личное сообщение · #10

ghaiklor
004151FC JNZ 0041528E - занопить
00415285 AND EAX,1 - заменить на mov al,1

| Сообщение посчитали полезным: ghaiklor

Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 июня 2012 21:46
· Личное сообщение · #11

NikolayD
после хэндла попадаем на вот это:
Code:
  1. 00415DED   . 50             PUSH EAX                                 ; /hMutex = 000001C0 (window)
  2. 00415DEE   . E8 E9A03D00    CALL <JMP.&KERNEL32.ReleaseMutex>        ; \ReleaseMutex
  3. 00415DF3   > 8B95 ACFCFFFF  MOV EDX,DWORD PTR SS:[EBP-354]
  4. 00415DF9   . 52             PUSH EDX                                 ; /hObject
  5. 00415DFA   . E8 5B9E3D00    CALL <JMP.&KERNEL32.CloseHandle>         ; \CloseHandle

SReg
выше поправил сообщение, добавил весь код с ReadFile. Сейчас сделаю твои изменения.



Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 июня 2012 21:50 · Поправил: ghaiklor
· Личное сообщение · #12

SReg
изменил на mov al,1. Идет дальнейшая загрузка приложения
А что ты записал и зачем? Я в асемблере не силен)
P.S. Приложение все еще в дебагере, я не знаю, запустится ли оно сейчас
P.P.S. Уже появляется форма загрузки потихоньку))))




Ранг: 238.8 (наставник), 67thx
Активность: 0.20
Статус: Участник
CyberHunter

Создано: 14 июня 2012 21:59
· Личное сообщение · #13

Проверка на размер файла:


И еще какая-то проверка:


-----
Nulla aetas ad discendum sera




Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 июня 2012 22:07
· Личное сообщение · #14

Уязвимость найдена. Огромное спасибо всем вам, особенно SReg
Рассказываю:
1) Проверка на наличие дебаггера - залил нопами.
2) Проверка на размер файла - залил нопами.
3) Еще какая-то проверка, когда считывает с файла побайтово. Спасибо SReg за
Code:
  1. 00415285 AND EAX,1 - заменить на MOV AL,1
.
После этого получаем полностью работоспособный ехе.



Ранг: 189.9 (ветеран), 334thx
Активность: 0.30
Статус: Участник

Создано: 14 июня 2012 22:16 · Поправил: NikolayD
· Личное сообщение · #15

ghaiklor пишет:
1) Проверка на наличие дебаггера - залил нопами.

это лишнее.

ghaiklor пишет:
00415285 AND EAX,1 - заменить на MOV AL,1

а это одно и тоже
Code:
  1. 00415282   .  0F94C0        SETE AL
  2. 00415285   .  83E0 01       AND EAX,1
  3. 00415288   .  8885 A7FCFFFF MOV BYTE PTR SS:[EBP-359],AL
  4. 0041528E   >  8B95 A0FCFFFF MOV EDX,DWORD PTR SS:[EBP-360]
  5. 00415294   .  52            PUSH EDX                                 ; /hObject
  6. 00415295   .  E8 C0A93D00   CALL <JMP.&KERNEL32.CloseHandle>         ; \CloseHandle
  7. 0041529A   >  80BD A7FCFFFF>CMP BYTE PTR SS:[EBP-359],0
  8. 004152A1   .  0F84 370B0000 JE AutoGRAP.00415DDE


поменять на

Code:
  1. 00415282   .  0F94C0        SETE AL
  2. 00415285   .  83E0 01       AND EAX,1
  3. 00415288   .  8885 A7FCFFFF MOV BYTE PTR SS:[EBP-359],AL
  4. 0041528E   >  8B95 A0FCFFFF MOV EDX,DWORD PTR SS:[EBP-360]
  5. 00415294   .  52            PUSH EDX                                 ; /hObject
  6. 00415295   .  E8 C0A93D00   CALL <JMP.&KERNEL32.CloseHandle>         ; \CloseHandle
  7. 0041529A   >  80BD A7FCFFFF>CMP BYTE PTR SS:[EBP-359],0
  8. 004152A1      90            NOP
  9. 004152A2      90            NOP
  10. 004152A3      90            NOP
  11. 004152A4      90            NOP
  12. 004152A5      90            NOP
  13. 004152A6      90            NOP


только у SReg'a на три байта меньше ))

| Сообщение посчитали полезным: ghaiklor

Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 июня 2012 22:50
· Личное сообщение · #16

NikolayD
только кто может мне объяснить
Зачем делалась замена
Code:
  1. 00415285 AND EAX,1

на
Code:
  1. MOV AL,1
?
Это помогло, но как это сработало?)




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 14 июня 2012 23:02
· Личное сообщение · #17

Нулевой бит не выделяется операцией 'И' (в результате этого получали 0 в EAX), а устанавливается непосредственно в единицу.

-----
Следуй за белым кроликом


| Сообщение посчитали полезным: ghaiklor

Ранг: 2.6 (гость)
Активность: 0.020
Статус: Участник

Создано: 15 июня 2012 01:46
· Личное сообщение · #18

neomant, спасибо
Думаю, что тему можно закрыть. Вопрос решен




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 15 июня 2012 09:50
· Личное сообщение · #19

Автор сам может закрыть свою тему, кнопка "Закрыть тему" находится внизу страницы, под кнопкой "Отправить сообщение".


 eXeL@B —› Вопросы новичков —› Не фиксит проверку на правильность файла
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати