JPEG Optimizer 1.x - 4.x Инструменты: W32Dasm - хорошая штука! Руки прямые - отличые вещи, часто нужны. Могз - рулезный интструмент, помогает во всех ситуациях. Nuts - чтобы заряжать могз(смотри выше)! Музыка: Interlude#5 Ссылки: http://www.xat.com Я был зол... нет, не так, я был уставшим. Да, точно, после 4-hours coding session... Я был реально уставшим и подумал мысль... "А может поломать чего?" Мысль думалась туго. После совладания с собой, я собой всё же овладел и принялся искать софт для взлома. Открыв свой почтовый клиент я стал смотреть письма которые пришли мне на ящик. Я обычно просто скачиваю все письма поздно вечером, а читаю их уже утром или днём. Итак, узрел там письмецо от одного моего друга, который тоже собрался заняться взломом, но он совсем новичок и спрашивал у меня совета. Совет я ему дал, но вот тут вспомнил, что у меня его диск. Это я к тому веду, что о проге этой я не знал ваааще никогда, но вот, покопавшись на этом диске, я нашёл чудо программерской мысли - JPEG Optimizer. Да, забыл сказать - друг мой псих, он очень любит собирать разные версии одной и той же программы и потом делать такой вот маааленький архив. Вот и JPEG Opt. там был в разных вариантах. Но я же не могу, как нормальные люди, мне обязательно нужно выпендриться, вот и сейчас я решил проверить ЗАЩИТУ временем. Т.е. я взял разные версии проги и просто сломал обе, а потом сделал вывод. Поехали! Первая версия, которая была там JPEG Opt. 1.2 for Windows 95. запускаем её. хм, убогое окно, ничего особенного, ваааще ничего. Жмём Register, вводим какую-нибудь Лажу - 123321. Записываем сообщение. Пихаем прогу Dasm'y. Жмём String Refs. И ищем там наше сообщение. Нашли, но покопавшись немного в коде мы не находим ничего особенного. Да, само-собой вверху есть "cmp", "je", но если мы их изменим, мы просто заставим выскакивать сообщение о том. что всё хорошо, но вот регистрация защитана не будет. Сел я и призадумался, ну не может там быть слишком сильной защиты, прога написана даааавно. Пораскинув мозгами(что-то слишком часто я стал раскидывать мозгами где попало) я открыл String Refs снова. Тупо пересматриваю строки и БАЦ! "LastOpen" "Nag256" <-- Ух ты, как интересно. =) "-NAN" Жмякнул по и строке оказался в коде, но жмякнув еще раз я оказался в другом месте. Т.е. если вы несколько раз кликаете на строке, то вам показывают все места, где упоминается "nag256". Нас интересует последнее. Т.е. нам нужно третье упоминание. Ладно, не грузитесь, после всех перелётов мы должны оказаться тут. * Possible StringData Ref from Data Obj ->"Nag256" | :00403B62 BA60F24600 mov edx, 0046F260 :00403B67 8D4588 lea eax, dword ptr [ebp-78] :00403B6A E811C70300 call 00440280 :00403B6F FF4580 inc [ebp-80] :00403B72 8B10 mov edx, dword ptr [eax] :00403B74 8B8D60FFFFFF mov ecx, dword ptr [ebp+FFFFFF60] :00403B7A 8B814C020000 mov eax, dword ptr [ecx+0000024C] :00403B80 B901000000 mov ecx, 00000001 :00403B85 E8FAEF0400 call 00452B84 :00403B8A FF4D80 dec [ebp-80] :00403B8D 8D4588 lea eax, dword ptr [ebp-78] :00403B90 BA02000000 mov edx, 00000002 :00403B95 E846C90300 call 004404E0 Листаем вниз. Видим.(Лист длинный, поэтому я его сократил, смотрите на адреса) Нужное я отметил. :00403C31 0FBE01 movsx eax, byte ptr [ecx] :00403C34 83F84A cmp eax, 0000004A <--- хм, иииинтересненько! =) :00403C37 0F85A6000000 jne 00403CE3 :00403C3D 33D2 xor edx, edx ---Skiped by NightCat--- :00403C60 0FBE4101 movsx eax, byte ptr [ecx+01] :00403C64 83F84F cmp eax, 0000004F <--- тоже ничаво. =) :00403C67 8D45F8 lea eax, dword ptr [ebp-08] :00403C6A 0F94C2 sete dl ---Skiped by NightCat--- :00403C92 0FBE5002 movsx edx, byte ptr [eax+02] :00403C96 83FA31 cmp edx, 00000031 <--- третий :00403C99 7548 jne 00403CE3 :00403C9B 833B00 cmp dword ptr [ebx], 00000000 :00403CAA 0FBE4103 movsx eax, byte ptr [ecx+03] :00403CAE 83F836 cmp eax, 00000036 <--- четвёртый :00403CB1 7530 jne 00403CE3 :00403CB3 833B00 cmp dword ptr [ebx], 00000000 ---Skiped by NightCat--- :00403CC2 0FBE4204 movsx eax, byte ptr [edx+04] :00403CC6 83F833 cmp eax, 00000033 <--- пятый :00403CC9 7518 jne 00403CE3 :00403CCB 833B00 cmp dword ptr [ebx], 00000000 ---Skiped by NightCat--- :00403CDA 0FBE4105 movsx eax, byte ptr [ecx+05] :00403CDE 83F838 cmp eax, 00000038 <--- шестой :00403CE1 7404 je 00403CE7 Как вы видите у нас тут присутствуют шесть проверок. Соститав их мы получим кол-во символов в пароле. У нас 6 проверок, значит и символов в пароле 6. Это уже что-то. Но самое интересное скрывается в тех самых цыферках. =) -------- 0000004A 0000004F 00000031 00000036 00000033 00000038 -------- Переводим из Hex'a в String и получаем - "JO1638". Это и есть наш код. Вводим его в окне регистрации и всё заработало. =) Но мне сего стало мало и я решил проверить, а изменилась ли защита в новых версиях. Последняя версия была 4.* с чем-то. Готов спорить, что и в новых версиях защита точно такая же. =) Загружаем последнюю версию JPEG Opt. Лезем в окно регистраии и вводим всё, что угодно. Вылетает наш родной наг. Загружаем Dasm. String Refs. Ищем наш любимый наг. Ага, вот тут нужно остановиться, как я писал выше, нам нужно на самое последнее упоминание Nag. Поэтому числа не скажу, смотрите сами, зависит от версии. В версии 4.0 нужно 8 раз кликнуть. Вылетаем тут: * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00404782(U) | :004047A5 66C78568FFFFFF6401 mov word ptr [ebp+FFFFFF68], 0164 * Possible StringData Ref from Data Obj ->"Nag16" | :004047AE BA45C64700 mov edx, 0047C645 :004047B3 8D4580 lea eax, dword ptr [ebp-80] :004047B6 E8597B0400 call 0044C314 :004047BB FF8574FFFFFF inc dword ptr [ebp+FFFFFF74] :004047C1 8B10 mov edx, dword ptr [eax] :004047C3 8B8D50FFFFFF mov ecx, dword ptr [ebp+FFFFFF50] :004047C9 41 inc ecx :004047CA 8B8554FFFFFF mov eax, dword ptr [ebp+FFFFFF54] :004047D0 8B8008030000 mov eax, dword ptr [eax+00000308] ---Skiped by NightCat--- * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004047F7(U) | :004047FE 51 push ecx :004047FF E810590200 call 0042A114 <--- ага, call, это нам нужно. :00404804 59 pop ecx :00404805 84C0 test al, al <--- сравнение :00404807 7533 jne 0040483C <--- прыгаем к сообщению о неверной регистрации :00404809 6A00 push 00000000 ---Skiped by NightCat--- идём то тому адрему, который стоит в call. Т.е. call 0042A114 - сюда! =) * Referenced by a CALL at Addresses: |:004047FF , :00429581 | :0042A114 55 push ebp :0042A115 8BEC mov ebp, esp :0042A117 83C4F4 add esp, FFFFFFF4 :0042A11A 53 push ebx :0042A11B 8B4508 mov eax, dword ptr [ebp+08] :0042A11E 8D5DF4 lea ebx, dword ptr [ebp-0C] :0042A121 8A10 mov dl, byte ptr [eax] :0042A123 8813 mov byte ptr [ebx], dl ---Skiped By NightCat--- :0042A155 C6430900 mov [ebx+09], 00 :0042A159 0FBE03 movsx eax, byte ptr [ebx] :0042A15C 50 push eax :0042A15D E8228C0400 call 00472D84 :0042A162 59 pop ecx :0042A163 83F84A cmp eax, 0000004A <--- как видите, тоже самое. :0042A166 7559 jne 0042A1C1 :0042A168 0FBE5301 movsx edx, byte ptr [ebx+01] :0042A16C 52 push edx :0042A16D E8128C0400 call 00472D84 :0042A172 59 pop ecx :0042A173 83F853 cmp eax, 00000053 <--- второй :0042A176 7549 jne 0042A1C1 :0042A178 0FBE4B02 movsx ecx, byte ptr [ebx+02] :0042A17C 83F924 cmp ecx, 00000024 <--- третий :0042A17F 7540 jne 0042A1C1 :0042A181 0FBE4303 movsx eax, byte ptr [ebx+03] :0042A185 83F832 cmp eax, 00000032 <--- 4-й :0042A188 7537 jne 0042A1C1 :0042A18A 0FBE5304 movsx edx, byte ptr [ebx+04] :0042A18E 83FA38 cmp edx, 00000038 <--- пятый :0042A191 752E jne 0042A1C1 :0042A193 0FBE4B05 movsx ecx, byte ptr [ebx+05] :0042A197 83F939 cmp ecx, 00000039 <--- шестой :0042A19A 7525 jne 0042A1C1 :0042A19C 0FBE4306 movsx eax, byte ptr [ebx+06] :0042A1A0 83F832 cmp eax, 00000032 <--- седьмой :0042A1A3 751C jne 0042A1C1 :0042A1A5 0FBE5307 movsx edx, byte ptr [ebx+07] :0042A1A9 83FA31 cmp edx, 00000031 <--- восьмой :0042A1AC 7513 jne 0042A1C1 :0042A1AE C70554A448001443FC69 mov dword ptr [0048A454], 69FC4314 Сами видите, всё осталось не тронутым, а прошла куча времени. =( Просто считаем. -------- 0000004A 00000053 00000024 00000032 00000038 00000039 00000032 00000031 -------- | | | JS$28921 - это наш сериал. Всё до ужаса просто. =( Этот способ с мелкими различиями работает на всех версиях. =) Уважаемые программисты JPEG Optimizer. Прога у вас конечно неплохая и иногда сильно помогает, но вот защита,.. да и просить за неё такие деньги. Хех, это неправильно. Поэтому задуматесь. А теперь вы, родные мои студенты и абитуриенты БГУиРа. Подумайте и вы, если вы хотите написать коммерческий продукт, или просто защитить свою прогу, то не делайте так. =) Политех сакс, РТИ рулит! МЫ РУЛИИИМ! Это был NightCat, вы меня знаете. =) Аминь!