Доделка ImageDupeless 1.05Сразу скажу что это изврат необыкновенный... Многие вещи просто не поддаются логике. Вопервых почему нельзя юзать больше чем 1000 картинок в галерее? автору в лом было юзать динамические массивы? Почему можно увеличивать только первые пять картинок в галерее? Это вобще не поддается обьяснению... Жаба что ли автора давит, что кто-то посмотрит больше чем на пять картинок. Потом в ограничениях написано "не все параметры можно менять". Да прога такая сырая, что на некоторых кнопках даже надписей нету. Естественно тут не поменяешь... И самое прикольное! У него на сайте все пункты скачивания на зываются "Закачать", типа Upload??? Типа сам допиши и залей мне - я как раз прогу поюзаю... Я просто в шоке... Ладно побурчали и хватит. Ща мозги вправим... Инструменты: Softice, Windasm или Ida, Hex редактор. Ограничение в 1000 картинок... хмм. Берем ida или Windasm и ищем 3F8 (это 1000 десятичными). Подход конечно не очень хороший, но смотреть прогу я начал на работе , а айса у мя там не было. Мы найдем несколько мест со сравнениями и несколько push. Естественно нам интересны сравнения. Первые два адреса со сравненем - это 40EF60 и 40EF98. Ставим bpx на эти адреса. Нажимаем в проге "Создать галерею из каталога". И после того как нажмем "Начать" мы попадем в айс по адресу 40EF98 там у нас идет: .text:0040EF98 cmp eax, 3E8h .text:0040EF9D jle short loc_40EFAF .text:0040EF9F push 3E8hТипа если меньше 1000 картинок - идем дальше, если больше то все равно обработаем только 1000. Ну тут все ясно надо только чтоб jle прыгнул. Патчим как кому нравится. И все дела.
Теперь о увеличении картинок... .text:00413A9A call ?DoModal@CDialog@@UAEHXZ ; CDialog::DoModal(void)Вот так аж. Теперь листаем в айсе наверх и смотрим где же начало этой процедуры. А начало вот тут: .text:004137E0 push 0FFFFFFFFh .text:004137E2 push offset loc_4832E7 .text:004137E7 mov eax, large fs:0 .text:004137ED push eax .text:004137EE mov large fs:0, espТеперь стави брейк поинт на какой-нить а дрес из этого кусочка и кликаем снова. Айс сработает как раз в начале процедуры а теперь давайте смотреть чо делается... Идем... идем... идем... И вот интересное место: .text:004138B3 mov edx, [esp+20h] .text:004138B7 or ebp, 0FFFFFFFFh .text:004138BA lea eax, [ecx+esi] .text:004138BD lea eax, [eax+eax*4] .text:004138C0 cmp edx, eax .text:004138C2 jge short loc_4138C9 .text:004138C4 mov ebp, 4 - 4!!! .text:004138C9 .text:004138C9 loc_4138C9: ; CODE XREF: .text:004138C2j .text:004138C9 lea ebx, [ecx+esi] .text:004138CC sub eax, ebx .text:004138CE cmp edx, eax .text:004138D0 jge short loc_4138D7 .text:004138D2 mov ebp, 3 - 3!!! .text:004138D7 .text:004138D7 loc_4138D7: ; CODE XREF: .text:004138D0j .text:004138D7 lea ebx, [ecx+esi] .text:004138DA sub eax, ebx .text:004138DC cmp edx, eax .text:004138DE jge short loc_4138E5 .text:004138E0 mov ebp, 2 - 2!!! .text:004138E5 .text:004138E5 loc_4138E5: ; CODE XREF: .text:004138DEj .text:004138E5 lea ebx, [ecx+esi] .text:004138E8 sub eax, ebx .text:004138EA cmp edx, eax .text:004138EC jge short loc_4138F3 .text:004138EE mov ebp, 1 - 1!!! .text:004138F3 .text:004138F3 loc_4138F3: ; CODE XREF: .text:004138ECj .text:004138F3 add ecx, esi .text:004138F5 sub eax, ecx .text:004138F7 cmp edx, eax .text:004138F9 jge short loc_4138FD .text:004138FB xor ebp, ebp - Пуск :))) !!! .text:004138FDБред какой-то... чо-то вычитается а потом в ebp остается какое-то число... от 0 до 4. Опа! так это жеж и есть номер картинки... Теперь давайте разиеремся что вычитается. Как мы видим. Постоянно идет cmp edx, eax. А потом в из eax постоянно вычитается ecx... Для начала посмотрим что попадает в EDX перед этими сравнениями... .text:004138B3 mov edx, [esp+20h]Ничего не говорит... делаем d esp+20h. И запускаем снова. Пройдем от начала процедуры и посмотрим откуда это данные в [esp+20h] берутся. Идем... и вот! Как говорит на это место IDA: .text:0041385D mov [esp+2Ch], edx .text:00413861 call ds:DPtoLP ; Converts device coordinates .text:00413861 ; into logical coordinatesТо есть! Просто берутся координаты курсора! А потом просто вычисляется номер картинки тупым вычитанием размера каждой картинки (они идут по 160 пикселов т.е. A0, в еcx как раз было A0!). А потом в ebp заносится номер картинки через такую тупую систему сравнений (видать пытался запутать). Ну что ж, поможем автору. Оптимизируем его прогу таким вот образом :)... по адресу 4138B3: mov eax, edx ; В EDX лежит координата курсора xor edx, edx ; очистка перед делением mov ecx, a0 div ecx ; делим на 160 mov ebp, eax ; в EAX лежит целая часть, т.е. номер картинки. jmp 41390A ; перепрыгиваем оставшиеся куски этой порнографии...Все! Кто сильно хочет - может доделать еще чтоб можно было кликать на рисунки а не на эту узкую полосочку... Проверка идет тут же, в этой процедуре сверху. P.S. Чувак, открой FTP я тебе прогу закачаю, прям как ты предлагал на сайте :)))))))))
|