KindEcstasy
31.10.2006, 23:01
Взлом программы PDF2TXT 2.9
[ Инструменты ]
+ OllyDebuger
+ ResHacker
+ HackersView
[ О программе ]
Ку, люди античата!
Программа PDF2TXT, предназначенна для переконвертирования файлов из формата pdf в txt, соответственно. Ограничения по работе в незарегенной версии, 100 раз использования. Сегодня мы взломаем её не как всегда, а сделаем так чтобы она работала вечно, не вводя серийник. Поехали:
[ Взлом - Отключение счётчика числа запусков]
Вся эта приблуда, то-есть счётчик, содержиться в библиотеке verypdf.dll, её то мы и будем мучить в отладчике, благо библиотека не пакованная, как впрочем и сама программа. Итак начинаем:
Загружаем программу, не в отладчик а просто так. Появиться окошко с просьбой ввести серийник, мы же его не вводим, а нажимаем кнопку Try. Видим окошко со следующей информацией:
You have 99 times to try, please register... -тра-та-та (у вас число может быть другим, в зависимости от того, сколько раз вы запускали программу)
Эту строку мы запоминаем и грузим в отладчик нашу библиотеку verypdf.dll. Сканируем её на ascii-строки и ищем часть этой строки (например: times to try) которую мы только-что запомнили. Находим, щёлкаем по ней 2 раза и попадаем в окно кода. Вы должны видеть следующее:
10001B5C > A1 D8730110 MOV EAX,DWORD PTR DS:[100173D8]
10001B61 . 894424 0C MOV DWORD PTR SS:[ESP+C],EAX
10001B65 B9 64000000 MOV ECX,64
10001B6A . 68 88720110 PUSH verypdf.10017288 ; ASCII "PDF2TXT v2.9"
10001B6F 2BCE SUB ECX,ESI
10001B71 . 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
10001B75 . 51 PUSH ECX
10001B76 . 68 40720110 PUSH verypdf.10017240 ; ASCII "Your have %d times - МЫ СДЕСЬ!
10001B7B . 52 PUSH EDX
10001B7C . C78424 F000000>MOV DWORD PTR SS:[ESP+F0],2
10001B87 . E8 1DA40000 CALL verypdf.1000BFA9
10001B8C . 8B4424 1C MOV EAX,DWORD PTR SS:[ESP+1C]
10001B90 . 83C4 10 ADD ESP,10
10001B93 . 6A 30 PUSH 30 ; /Style =
10001B95 . 68 88730110 PUSH verypdf.10017388 ; |Title = "Software
10001B9A . 50 PUSH EAX ; |Text
10001B9B . 57 PUSH EDI ; |hOwner
10001B9C . FF15 3C330110 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
Теперь прикинем, по идее прога должна запускаться только 100 раз, так? Значит где-то это должно быть явно видно. Теперь внимание:
По смещению 10001B65, регистр ECX, принемает значение 64! И тут вы скажете: Ну и что? Причём тут значение 64? А я вам скажу, что 100 в хексе (в шестнадцатиричной системе), как раз равняется 64! И значит это то, что нам нужно!
Далее дело за малым, меняем 64 на значение побольше, например 2710 - 10 000 в десятичной системе. Затем править файл в Hiew, а именно :
10001B65 B9 10 27 00 00
Этими действиями, мы заставляем программу запускаться не 100 раз как обычно, а 10 000 раз! Но тем неменее, по истечении 10 000 раз, прога перестанет работать. "Почему?" - спросите вы. А потому что! Посмотрим ещё раз на код:
10001B65 B9 10270000 MOV ECX,2710 ; Изменённое значение!
10001B6A . 68 88720110 PUSH verypdf.10017288 ; ASCII "PDF2TXT v2.9"
10001B6F 2BCE SUB ECX,ESI ; !!!!!!!!!!!!!!!!!!!!
10001B71 . 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
10001B75 . 51 PUSH ECX
10001B76 . 68 40720110 PUSH verypdf.10017240 ; ASCII "Your have %d times
10001B7B . 52 PUSH EDX
10001B7C . C78424 F000000>MOV DWORD PTR SS:[ESP+F0],2
10001B87 . E8 1DA40000 CALL verypdf.1000BFA9
10001B8C . 8B4424 1C MOV EAX,DWORD PTR SS:[ESP+1C]
10001B90 . 83C4 10 ADD ESP,10
10001B93 . 6A 30 PUSH 30 ; /Style =
10001B95 . 68 88730110 PUSH verypdf.10017388 ; |Title = "Software
10001B9A . 50 PUSH EAX ; |Text
10001B9B . 57 PUSH EDI ; |hOwner
10001B9C . FF15 3C330110 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
Смотрите на строку по адресу 10001B6F, там из ECX вычитается ESI. А как вы помните в ECX - находиться наше новое значение, в то время как в ESI - число настоящих запусков программы, то есть, например мы запустили программу 10 раз, тогда ESI, содержит значение A - 10 в хексе. Тут как бы счётчик:
1) Из ECX вычитается ESI
2) Выводиться сообщение с числом оставшихся запусков, то есть выводиться новое значение ECX!
Как бы это исправить? Конечно можно сделать так, чтобы в ESI, всегда было значение 0 (нуль), но это не дзенский метод, мы просто занопим сам счётчик, делаем:
---БЫЛО---
10001B6F 2BCE SUB ECX,ESI
---СТАЛО---
10001B6F 90 NOP
10001B70 90 NOP
Затем просто правим это в Hiew и наша прога работает ВЕЧНО! Потом можно с помощью ResHacker'а на этом окне, где просят ввести серийник, удалить все кнопки, кроме кнопки Try, удалить все поля ввода и написать чё-нить вроде:
Cracked by: Vasya-Cracker, special 4 CCCP, а кнопку Try, переименовать в OK!
Я прекрасно осознаю, что прогу можно было взломать просто вырубив проверку на валидный серийник, я просто хотел показать в этой статье, как можно манипулировать числом запусков программ. С тем же успехом это можно проделывать например с такими ограничениями:
+ Число открытых файлов
+ Число сохранений изменений
+ Число нажатий на кнопку
И таких программ, с такими защитами очень много!
Вот и всё! Все кто слушал - молодец!
Спасибо за внимание. Всем бб!
Но в этой проге есть косяк, его заметил hidden:
В незарегистренной версии стоит ограничение на 10 страниц, и вот как это исправить:
00410E9C 75 39 JNZ SHORT pdf2txt.00410ED7
00410E9E |. 83FF 0A CMP EDI,0A
00410EA1 |. 7C 08 JL SHORT pdf2txt.00410EAB
00410EA3 C74424 10 0A00>MOV DWORD PTR SS:[ESP+10],0A
00410EAB |> 8B15 FCB24200 MOV EDX,DWORD PTR DS:[42B2FC]
00410EB1 |. 6A 24 PUSH 24
00410EB3 |. 68 AC6C4200 PUSH pdf2txt.00426CAC ; ASCII "Purchase prompt"
00410EB8 |. 68 286C4200 PUSH pdf2txt.00426C28 ; ASCII "This is a trial version. It will can only extract the first ten pages from the pdf file. Would you like to purchase PDF2TXT online?"
00410EBD |. 52 PUSH EDX
00410EBE |. E8 6DE4FFFF CALL pdf2txt.0040F330
00410EC3 |. 83C4 10 ADD ESP,10
00410EC6 |. 83F8 06 CMP EAX,6
00410EC9 |. 75 0C JNZ SHORT pdf2txt.00410ED7
00410ECB |. 6A 01 PUSH 1
00410ECD |. 68 FC6B4200 PUSH pdf2txt.00426BFC ; ASCII "http://www.verypdf.com/pdf2txt/pdf2txt.htm"
00410ED2 |. E8 D9590000 CALL <JMP.&verypdf.#5>
00410ED7 |> 8B4424 10 MOV EAX,DWORD PTR SS:[ESP+10]
Функция проверки колва страниц находиться в главном модуле, то есть в файле pdf2txt.exe. Открываем его отладчиком, ищём строку:
This is a trial version. It will can only extract the first ten pages from the pdf file. Would you like to purchase PDF2TXT online?
И по адресу 00410E9C, вместо JNZ лепим JMP! Догадались что произойдёт? Прога просто проскочит проверку на 10 страниц и будет работать нормально.
Вот и всё!
Всё это актуально и для версии 3.2, только в 3.2 файлы запакованны UPX'ом! Распаковывайте:
upx.exe <filename.nn> -d
И Вперёд!
(ц) KindEcstasy
[ Инструменты ]
+ OllyDebuger
+ ResHacker
+ HackersView
[ О программе ]
Ку, люди античата!
Программа PDF2TXT, предназначенна для переконвертирования файлов из формата pdf в txt, соответственно. Ограничения по работе в незарегенной версии, 100 раз использования. Сегодня мы взломаем её не как всегда, а сделаем так чтобы она работала вечно, не вводя серийник. Поехали:
[ Взлом - Отключение счётчика числа запусков]
Вся эта приблуда, то-есть счётчик, содержиться в библиотеке verypdf.dll, её то мы и будем мучить в отладчике, благо библиотека не пакованная, как впрочем и сама программа. Итак начинаем:
Загружаем программу, не в отладчик а просто так. Появиться окошко с просьбой ввести серийник, мы же его не вводим, а нажимаем кнопку Try. Видим окошко со следующей информацией:
You have 99 times to try, please register... -тра-та-та (у вас число может быть другим, в зависимости от того, сколько раз вы запускали программу)
Эту строку мы запоминаем и грузим в отладчик нашу библиотеку verypdf.dll. Сканируем её на ascii-строки и ищем часть этой строки (например: times to try) которую мы только-что запомнили. Находим, щёлкаем по ней 2 раза и попадаем в окно кода. Вы должны видеть следующее:
10001B5C > A1 D8730110 MOV EAX,DWORD PTR DS:[100173D8]
10001B61 . 894424 0C MOV DWORD PTR SS:[ESP+C],EAX
10001B65 B9 64000000 MOV ECX,64
10001B6A . 68 88720110 PUSH verypdf.10017288 ; ASCII "PDF2TXT v2.9"
10001B6F 2BCE SUB ECX,ESI
10001B71 . 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
10001B75 . 51 PUSH ECX
10001B76 . 68 40720110 PUSH verypdf.10017240 ; ASCII "Your have %d times - МЫ СДЕСЬ!
10001B7B . 52 PUSH EDX
10001B7C . C78424 F000000>MOV DWORD PTR SS:[ESP+F0],2
10001B87 . E8 1DA40000 CALL verypdf.1000BFA9
10001B8C . 8B4424 1C MOV EAX,DWORD PTR SS:[ESP+1C]
10001B90 . 83C4 10 ADD ESP,10
10001B93 . 6A 30 PUSH 30 ; /Style =
10001B95 . 68 88730110 PUSH verypdf.10017388 ; |Title = "Software
10001B9A . 50 PUSH EAX ; |Text
10001B9B . 57 PUSH EDI ; |hOwner
10001B9C . FF15 3C330110 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
Теперь прикинем, по идее прога должна запускаться только 100 раз, так? Значит где-то это должно быть явно видно. Теперь внимание:
По смещению 10001B65, регистр ECX, принемает значение 64! И тут вы скажете: Ну и что? Причём тут значение 64? А я вам скажу, что 100 в хексе (в шестнадцатиричной системе), как раз равняется 64! И значит это то, что нам нужно!
Далее дело за малым, меняем 64 на значение побольше, например 2710 - 10 000 в десятичной системе. Затем править файл в Hiew, а именно :
10001B65 B9 10 27 00 00
Этими действиями, мы заставляем программу запускаться не 100 раз как обычно, а 10 000 раз! Но тем неменее, по истечении 10 000 раз, прога перестанет работать. "Почему?" - спросите вы. А потому что! Посмотрим ещё раз на код:
10001B65 B9 10270000 MOV ECX,2710 ; Изменённое значение!
10001B6A . 68 88720110 PUSH verypdf.10017288 ; ASCII "PDF2TXT v2.9"
10001B6F 2BCE SUB ECX,ESI ; !!!!!!!!!!!!!!!!!!!!
10001B71 . 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
10001B75 . 51 PUSH ECX
10001B76 . 68 40720110 PUSH verypdf.10017240 ; ASCII "Your have %d times
10001B7B . 52 PUSH EDX
10001B7C . C78424 F000000>MOV DWORD PTR SS:[ESP+F0],2
10001B87 . E8 1DA40000 CALL verypdf.1000BFA9
10001B8C . 8B4424 1C MOV EAX,DWORD PTR SS:[ESP+1C]
10001B90 . 83C4 10 ADD ESP,10
10001B93 . 6A 30 PUSH 30 ; /Style =
10001B95 . 68 88730110 PUSH verypdf.10017388 ; |Title = "Software
10001B9A . 50 PUSH EAX ; |Text
10001B9B . 57 PUSH EDI ; |hOwner
10001B9C . FF15 3C330110 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
Смотрите на строку по адресу 10001B6F, там из ECX вычитается ESI. А как вы помните в ECX - находиться наше новое значение, в то время как в ESI - число настоящих запусков программы, то есть, например мы запустили программу 10 раз, тогда ESI, содержит значение A - 10 в хексе. Тут как бы счётчик:
1) Из ECX вычитается ESI
2) Выводиться сообщение с числом оставшихся запусков, то есть выводиться новое значение ECX!
Как бы это исправить? Конечно можно сделать так, чтобы в ESI, всегда было значение 0 (нуль), но это не дзенский метод, мы просто занопим сам счётчик, делаем:
---БЫЛО---
10001B6F 2BCE SUB ECX,ESI
---СТАЛО---
10001B6F 90 NOP
10001B70 90 NOP
Затем просто правим это в Hiew и наша прога работает ВЕЧНО! Потом можно с помощью ResHacker'а на этом окне, где просят ввести серийник, удалить все кнопки, кроме кнопки Try, удалить все поля ввода и написать чё-нить вроде:
Cracked by: Vasya-Cracker, special 4 CCCP, а кнопку Try, переименовать в OK!
Я прекрасно осознаю, что прогу можно было взломать просто вырубив проверку на валидный серийник, я просто хотел показать в этой статье, как можно манипулировать числом запусков программ. С тем же успехом это можно проделывать например с такими ограничениями:
+ Число открытых файлов
+ Число сохранений изменений
+ Число нажатий на кнопку
И таких программ, с такими защитами очень много!
Вот и всё! Все кто слушал - молодец!
Спасибо за внимание. Всем бб!
Но в этой проге есть косяк, его заметил hidden:
В незарегистренной версии стоит ограничение на 10 страниц, и вот как это исправить:
00410E9C 75 39 JNZ SHORT pdf2txt.00410ED7
00410E9E |. 83FF 0A CMP EDI,0A
00410EA1 |. 7C 08 JL SHORT pdf2txt.00410EAB
00410EA3 C74424 10 0A00>MOV DWORD PTR SS:[ESP+10],0A
00410EAB |> 8B15 FCB24200 MOV EDX,DWORD PTR DS:[42B2FC]
00410EB1 |. 6A 24 PUSH 24
00410EB3 |. 68 AC6C4200 PUSH pdf2txt.00426CAC ; ASCII "Purchase prompt"
00410EB8 |. 68 286C4200 PUSH pdf2txt.00426C28 ; ASCII "This is a trial version. It will can only extract the first ten pages from the pdf file. Would you like to purchase PDF2TXT online?"
00410EBD |. 52 PUSH EDX
00410EBE |. E8 6DE4FFFF CALL pdf2txt.0040F330
00410EC3 |. 83C4 10 ADD ESP,10
00410EC6 |. 83F8 06 CMP EAX,6
00410EC9 |. 75 0C JNZ SHORT pdf2txt.00410ED7
00410ECB |. 6A 01 PUSH 1
00410ECD |. 68 FC6B4200 PUSH pdf2txt.00426BFC ; ASCII "http://www.verypdf.com/pdf2txt/pdf2txt.htm"
00410ED2 |. E8 D9590000 CALL <JMP.&verypdf.#5>
00410ED7 |> 8B4424 10 MOV EAX,DWORD PTR SS:[ESP+10]
Функция проверки колва страниц находиться в главном модуле, то есть в файле pdf2txt.exe. Открываем его отладчиком, ищём строку:
This is a trial version. It will can only extract the first ten pages from the pdf file. Would you like to purchase PDF2TXT online?
И по адресу 00410E9C, вместо JNZ лепим JMP! Догадались что произойдёт? Прога просто проскочит проверку на 10 страниц и будет работать нормально.
Вот и всё!
Всё это актуально и для версии 3.2, только в 3.2 файлы запакованны UPX'ом! Распаковывайте:
upx.exe <filename.nn> -d
И Вперёд!
(ц) KindEcstasy