Исследование Dekart Private Disk v.2.09 (Последняя версия) Назначение: Программа предназначена для создания виртуальных жестких дисков из зашифрованных образов, при этом разрешая к нему доступ только тем программам которым ты это позволишь. Исследование я начал с появившегося MessageBox’a, тапа у меня осталось 30 дней, я сразу же, аттачнул его олькай(ollydbg) search for => name in all modules => messageboxa, дальше follow import in disassembler, а так как в XP эта функция вызывает функцию MessageBoxExA, я поставил бряк(beak point/точку останова) после MessageBoxExA и нажал F9(run). Согласился с сообшением и это привело к остановке на том бряке, я вышел из функции по F7(step into/шаг внутрь) и попал в модуль dkar.dll, выполнил search for => all intermodular calls и мне в глаза сразу бросилась функция versnum.VerifySerialNumberEx, дальше я открыл её в идее(IDA/Interactive Disassembler) и долго пытался разобраться в способе сравнения ключа, хотеорсь сделать keygen... Спустя несколько часов, мне это надоело и я решил патчить. Я заметил что достаточно чтоб, функция VerifySerialNumberEx вернула значение отличное от нуля, тогда программа считает сабя загереной. Я сразу поставил jmp(прыжок) с начала функции, на первый же ret(учитывая стек) и программа стала считать себя зарегеной, но после того как я внёс изменения в саму versnum.dll, вылетел MessageBoxExA, с ошибкой загрузки versnum.dll, оказалось она проверяет целостность versnum.dll. Тогда я вышел из этой функции, на месте её вызова выполнил find references to => address constant, оказалось, она вызывается из нескольких мест, а также она не импортировалась, а подгружалась библиотекой dkar.dll, о чём свидетельствовала строка Code: MOV DWORD PTR DS:[9159DC],EAX Я перешел на место подгруздки функций и решил добавить к полученному адресу функции, значение, соответствующее отступлению команды ret от начала функции, но функция add eax, 0x65 занимает 3 байта, а пожертвовать я мог только командой test eax, eax которая занимает 2 байта. Code: 008FAD3C 68 E8D79000 PUSH 0090D7E8 ; ASCII "VerifySerialNumber38" 008FAD41 FF37 PUSH DWORD PTR DS:[EDI] 008FAD43 FFD6 CALL ESI 008FAD45 85C0 TEST EAX,EAX 008FAD47 A3 D4599100 MOV DWORD PTR DS:[9159D4],EAX 008FAD4C 74 63 JE SHORT 008FADB1 008FAD4E 68 D0D79000 PUSH 0090D7D0 ; ASCII "VerifySerialNumberEx" 008FAD53 FF37 PUSH DWORD PTR DS:[EDI] 008FAD55 FFD6 CALL ESI 008FAD57 85C0 TEST EAX,EAX 008FAD59 A3 DC599100 MOV DWORD PTR DS:[9159DC],EAX 008FAD5E 74 51 JE SHORT 008FADB1 как вариант было переместить mov ниже, на затереть ей инструкцию je, но тогда бы пришлось править таблицу исправлений адресации(что мне делать не хотелось), просто при паче dll’ек лучше не использовать прямых адресов, и не изменять инструкции с прямыми адресами(слишком много гемора). Решение оказалось проще, перед получением этой функции, запрашивается другая, которая отстоит от того ret на расстоянии 139 байт, в той же библиотеке, так что я просто заменил Code: 008FAD53 FF37 PUSH DWORD PTR DS:[EDI] 008FAD55 FFD6 CALL ESI 008FAD57 85C0 TEST EAX,EAX на Code: 008FAD53 59 POP ECX ; компенсирует предыдущую инструкцию 008FAD54 05 8B000000 ADD EAX,8B ; Наращивает на 139 Для полноты процесса, можно ещё и контрольную сумму поправить, но это не обязательно. Резутьтат: Code: dkar.dll 0000AD53: FF 59 0000AD54: 37 05 0000AD55: FF 8B 0000AD56: D6 00 0000AD57: 85 00 0000AD58: C0 00 Ссылки: ОффСайт - ввв[dot]private-disk[dot]net - Отсюда можно скачать. Зеркало версии 2.09 на случай, если обновят ввв[dot]4shared[dot]com[slash]file[slash]6622030[slash]65852128[slash]MyPeronalPhotos.html Пароль: CR@CK ЗЫ Вот и сэкономили $45.00