![]() |
eXeL@B —› Вопросы новичков —› Проблема после распаковки (аспр) |
Посл.ответ | Сообщение |
|
Создано: 07 июля 2007 15:21 · Личное сообщение · #1 У меня маленкая проблема после того как я распаковал HexCmp. Импорт вроде хороший, но когда я запускаю программу то получаеца краш в _init_exit_proc на адресе 4а7ffa. Почему краш в этой функтии? Это же код генерированный борландом.. :S ![]() ![]() |
|
Создано: 07 июля 2007 15:22 · Личное сообщение · #2 |
|
Создано: 08 июля 2007 10:51 · Личное сообщение · #3 |
|
Создано: 08 июля 2007 14:35 · Личное сообщение · #4 Sturgeon: Раскажи как ты сделал ![]() Я делаю вот так: Запускаю прогу в оли и считаю 27 "Access violation at 0000...". Ставлю бряк на секции кода и потом шифт-ф9 чтобы попасть на OEP (401000) Делаю дамп из оли без реконструкции импорта Запускаю ImpRec и реконстрыирую импорт (смотри аттач) Прикручиваю импорт в виде новой секции и запускаю программу Краш на адресе 4а8008. В твоей версии этого краша конечно нет. Я попробовал анулировать блок после 4d4600 но тогда у меня краш на c10a03. Я тоже заметил что ты поменял информацию на 4bb4dc и 4bb598 - почему? ![]() ![]() |
|
Создано: 08 июля 2007 15:18 · Поправил: Sturgeon · Личное сообщение · #5 Да, я смотрел твой дамп из первого поста. Прога падает на обращении к несуществующим адресам. Почему так происходит я не знаю, потому что чайник еще. Есть небольшая заморочка со снятием дампа. Сам недавно узнал. Обычно это с Дельфовыми прогами бывает, но вот тебе тоже повезло ![]() [url=http://www.exelab.ru/pro/faq.php?pg=1828 ]http://www.exelab.ru/pro/faq.php?pg=1828 [/url] Попробуй поковыряйся. Если не получится потом напишешь, где и что не получается. Расскажу. Сразу писать тутор не хочу, потому что это неспортивно ![]() P.S. Да! Чуть не забыл. Когда восстанавлиываешь импорт, то используй плагин ASProtect 1.22.dll. ASPR_1.23-ImpREC_Plugin.dll хотя и поновее, но он в данной ситуации не справляется. У меня тоже сначала были праблы. ![]() |
|
Создано: 08 июля 2007 18:13 · Поправил: pixl · Личное сообщение · #6 |
|
Создано: 08 июля 2007 18:36 · Личное сообщение · #7 00B028CC 5B POP EBX ; 00B15A04 00B028CD ^ EB CE JMP SHORT 00B0289D 00B028CF 61 POPAD <- Ты здесь 00B028D0 E8 3A000000 CALL 00B0290F <- ВХОДИ В ЭТУ ФУНКЦИЮ 00B028D5 68 DE28B000 PUSH 0B028DE 00B028DA FF0424 INC DWORD PTR SS:[ESP] 00B028DD C3 RETN Ты стоишь на адресе 00B028D0 (у тебя может быть другой адрес). Теперь ты входишь ВНУТРЬ функции CALL 00B0290F (ф7). Скролишь потихоньку вниз и увидишь такой код: 00B0297B 60 PUSHAD 00B0297C 68 2453B000 PUSH 0B05324 00B02981 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C] 00B02984 FF35 7869B000 PUSH DWORD PTR DS:[B06978] ; HexCmp_o.00400000 00B0298A FF10 CALL DWORD PTR DS:[EAX] 00B0298C 61 POPAD Вот на этот POPAD ставишь бряк. Здесь же дампишь и восстанавливаешь импорт. Вот можешь почитать: http://www.exelab.ru/f/action=vthread&topic=9048&forum=5&p age=-1 Это я недавно тоже парился с аспром. З.Ы. После распаковки есть еще одна хитрая заморочка. Потом расскажу. И взломать HexCmp у меня кстати не получается. Очень сложно для меня. ![]() |
|
Создано: 08 июля 2007 18:40 · Личное сообщение · #8 |
|
Создано: 08 июля 2007 18:51 · Личное сообщение · #9 |
|
Создано: 08 июля 2007 19:56 · Личное сообщение · #10 |
|
Создано: 08 июля 2007 20:51 · Поправил: Sturgeon · Личное сообщение · #11 После того ка ты снял дамп и восстановил импорт прога перестала выдавть сообщение об ошибке. Но и не запускается. Сначала я думал, что там есть проверка на контрольную сумму или размер файла. Я сделал вот как. Открыл распакованную прогу в Оле. Поставил бряк на ExitProcess Брякнулся здесь: 004B52EF \. E8864E0000 CALL <JMP.&kernel32.ExitProcess> ; \ExitProcess В стек посмотрел откуда вызывается эта процедура. (Должна быть такая строчка) 0012FF84 |004B4701 RETURN to cmp.004B4701 from cmp.004B52E8 Перешел по адресу 004B4701. Чуть выше вызов этой самой процедуры с выходом. 004B46FC |. E8 E70B0000 CALL r55555_.004B52E8 Поставил на него бряк. Еще чуть выше есть условный переход, который перепрыгивает эту функцию. Поставил на него бряк тоже. Вышел еще на пару процедур вверх. Адреса возврата смотрел в стеке. 004B471C и 004B55CC Скролишь экран вверх и смотришь где начало функции PUSH EBP MOV EBP,ESP ADD ESP,-0C Ставишь на начало функции бряк. Когда дойдешь до адреса 004B55CC и найдешь начало функции (по адресу 004B5474), увидишь, что переход на эту функцию осуществляется офигенно длнинным прыжком с адреса 00401054. Поскольку переход этот безусловный, то можно считать, что место ошибки мы локализовали. Ставим еще один бряк бряк на этот адрес. И перезапускаем прогу. Сразу скажу, что все попытки менять переходы ничем не закончились, и прога все также не запускадась. Тогда я избрал другую тактику. Перезапустил пргу. (Бряки не убирай они еще будут нужны), а рядом открыл в отладчике оригинальную запакованную прогу. Ну дальше, в принципе понятно. Трассируем в соседних окнах оригинальную и распакованную прогу и сравниваем, где будут отличия. Если подробнее, то это было так: В запакованной проге доходим до ОЕР (401000) и расставляем те же бряки, что и в нашей распакованной проге. Тоесть брякаемся на длинном прыжке 00401054 и начинаем трассировать. Увидишь, что по адресу 004B55C0 в оригинальной проге запустится окно, а в распакованной проге нет. Вот тут-то собака и зарыта. Перезапускаем обе проги и брякаемся по адресу 004B55C0. Входи в функцию. Трассируем внитри функции по Ф8 и видим, что в запакованной проге условный переход по адресу 004041F1 не выполняется, а в распакованной проге - выполняется. Будем искать причину, почему такая разница. Вот этот кусочек кода: 004041EA . CMP DWORD PTR DS:[4BB598],0 Здесь команда сравнения 004041F1 . JE SHORT HexCmp_o.004041F9 Собственно, интересующий нас переход 004041F3 . CALL DWORD PTR DS:[4BB598] Вызов окна программы То есть из кода понятно, что после того как значение в ячейке 4BB598 сравнивается с нулем происходит или не происходит старт программы. Посмотрим чему это значение равно в оригинальной и распакованной проге. Перезапускаем опять обе проги. Это в последний раз. Брякаемся по адресу 004041EA и смотрим, что лежит в вышеупомянутой ячейке в одной и другой проге. В распакованной проге ноль, а в оригинальной число 004039EC. Похоже на каой-то адрес. В принципе это и есть адрес, потому что двумя строчками ниже идет вызов функции по этому адресу 004041F3.CALL DWORD PTR DS:[4BB598] То есть, на самом деле, выполняется CALL 004039EC Остается только в распакованной проге в ячейки по адресу 4BB598 вписать значение 004039EC. Сделать это можно в любом хекс-редакторе, только не забывай писать задом наперед. Уфф... Умаялся столько писать ![]() Со взломом чего-то не получается ![]() ![]() |
|
Создано: 08 июля 2007 21:28 · Поправил: pixl · Личное сообщение · #12 Спасибо за такой длинный ответ ![]() ![]() |
|
Создано: 08 июля 2007 21:40 · Поправил: Sturgeon · Личное сообщение · #13 В принципе, может такое быть. Я, честно говоря, сглупил. Перевел системные часы вперед и хотел поймать где проверяется время использования. А теперь не могу запустить ни запакованную ни распакованную прогу. Так что мой дамп может быть и неликвидый вообще. Попробуй распаковать свой работающий файл. Если проверка завязана на сам аспр, то есть шанс, что после распаковки защита пропадет. Хотя бы ее триальная часть. ![]() |
|
Создано: 08 июля 2007 21:58 · Поправил: pixl · Личное сообщение · #14 |
|
Создано: 08 июля 2007 22:56 · Личное сообщение · #15 |
|
Создано: 08 июля 2007 23:06 · Личное сообщение · #16 pixl пишет: оригинал прыгает на 403d8c Может быть. Откуда я взял этот адрес я уже писал выше. Получилось так, что я возился с файлом уже просрочившим триал. Может быть там есть, что-то типа враппера. То есть вызываются похожие функции, а дальше код идет в совсем другом направлении. Попробую еще поковыряться завтра, а то на меня моя женщина уже ругается. Пошел исполнять псевдосупружеские обязанности. Это у меня лучше получается, чем аспротект снимать ![]() ![]() |
|
Создано: 09 июля 2007 11:17 · Личное сообщение · #17 Доброе утро ![]() Я вот тут поковырялся еще немного. Если прыгать на тот адрес, что ты дал, то заметно, что появляется окно программы, а потом исчезает. Где оно исчезает я вроде отловил. 004B46AE JNZ SHORT rrr65687.004B46CC 004B46B0 CMP DWORD PTR DS:[4D2440],0 004B46B7 JE SHORT rrr65687.004B46BF ; Если ноль, то нафиг 004B46B9 CALL DWORD PTR DS:[4D2440] 004B46BF CALL rrr65687.004B53D4 ; Закрывается программа 004B46C4 CALL DWORD PTR DS:[4D2444] ; rrr65687.004AFC2C Вот этот код интересный. Он похож на тот, что я приводил выше. То есть сравнивается значение в ячейке 4D2440, а дальше либо навылет, если оно равно нулю, либо выполняется переход на адрес, который там лежит. У меня (в просроченной программе) это значение равно нулю. Можешь посмотреть какое значение у тебя в этой ячейке? З.Ы. Жалко, что никто из "взрослых" не обращает внимания на этот топик. Сильно сложная защита для чайников ![]() ![]() |
|
Создано: 09 июля 2007 12:16 · Личное сообщение · #18 pixl Ты какой класс закончил? Второй или третий. Я в твоем посте pixl пишет:Спасибо за такой длинный ответ...... насчитал 17 орфографических ошибок ![]() Sturgeon пишет: Сильно сложная защита для чайников В любом туторе для чайников пишут: "теперь посмотрим ссылки на строки" А ты посмотрел? Если бы посмотрел, увидел бы 00408901 MOV EDX, 004BCE71 ; ASCII "Sorry, but your 15-day trial has expired! Please, register your copy." Чуть выше ссылка на эту строку. Перейди по ней и увидишь три условных джампа. Дальше думаю разберешься сам ![]() |
|
Создано: 09 июля 2007 12:37 · Поправил: Sturgeon · Личное сообщение · #19 Вот ведь... crc1 Конечно смотрел строки. И нашел даже целых четыре! И переходы видел. Я ступил в том, что немного неправильно поправил адрес в дампе. (Это можно почитать выше). И у меня вместо нормального Эбаута вылезала "пустышка". И, естественно, правка всех этих переходов ничего не давала. А после того, как я исправил адрес на более правильный, я уже и не лез в эти строки, потому что думал, что все намного сложнее ![]() Уже в который раз хочу выразить искреннюю благодарность и признательность crc1 за помощь и разъяснения! P.S. Вроде без ошибок все написал;) ![]() |
|
Создано: 09 июля 2007 22:18 · Личное сообщение · #20 crc1 пишет: Ты какой класс закончил? Второй или третий. Я в твоем посте pixl пишет:Спасибо за такой длинный ответ...... насчитал 17 орфографических ошибок 12 я закончил. Есле бе ты по русски лет восем не говорил то мы бе посмотрели сколко у тебя ошибок было ;) Извените за все ошибки, я пытаюсь писать как чисто как могу ![]() Спасибо за все ответы.. Наконецто я полностью ее распаковал и убрал етот наг. Программа конешно хреновая, но ввиде урока по распоковке хороша... Sturgeon: Почемуто у меня только твой дамп работает... в моем некоторые крашы... попробую все сначала сделать. Конечно сейчас у меня уже есть работающей дамп для сравнения ![]() ![]() |
|
Создано: 09 июля 2007 23:48 · Личное сообщение · #21 |
|
Создано: 10 июля 2007 00:28 · Поправил: pixl · Личное сообщение · #22 Ок, посмотри на адрес 4бб4е8, сдес я думал что ты чтото поменял, потомучто информациа на этом адресе отличается в моем дампе. Я поставил мемори бряк на этих четырех баитах и запустил дамп. Брякнулся на 41д602. Решил поменять число на этих баитах на 10, чтобы обое джампа не прыголи ни куда. Нажимаю ф9 и вижу что у меня 16 дней триала. Оказивается эти 4 байта на 4бб4е8 репрезентируют сколько дней триала у тебя осталось. Это важно исправить чтобы у тебя окно не скрывалось. Теперь на наг. Запускаю программу и поевляется наг. Паузирую программу и нажимаю алт ф9 чтобы дойти до кода программы. Выхожу на каком нибуть адресе в программе (может быть любой адрес) и ищу какуюнебуть петлю каторая сидит на наге. Для этого я иду с ф8 в оле и к концу выхожу на петле каторая находится на 4614с5. Ставлю бряк после петли и нажимаю ок на наге. Брякыюсь после петли и иду с ф8.. На 461539 пропадает наг.. иду далше с ф8. В конце концов выхожу на 408883. Ставлю бряк на вызове и перезагружаю программу. Пробою аннулировать вызов и жму ф9. Ура!! нет нага! Интересно что я отвечаю сам на мой вопрос.. хотя без ваших ответов я бы навернека сейчас сидел на стадии распаковки ![]() ![]() |
|
Создано: 10 июля 2007 07:56 · Поправил: crc1 · Личное сообщение · #23 Sturgeon пишет: Слушай, а наг как нашел и убрал Вот три условных джампа, про которые я писал выше 00408266 TEST CL, CL
В переменную [4BB4E4] AsProtect пишет кол-во триальных дней. Ты снял дамп когда триал кончился, т.е. в переменной [4BB4E4] было FFFFFFFF, поэтому и дамп твой закрывается pixl Извиняй, не хотел обидеть ![]() ![]() |
|
Создано: 10 июля 2007 11:18 · Личное сообщение · #24 Все понятно. А я все джампы взял и занопил. Поэтому имел проблемы. Кстати, таких мест вроде два? pixlМетод похож на туторы от Лены;) И еще один вопрос. Если вы снимаете дамп с рабочй проги, то есть у которой еще не кончился триал, естьли там проблемы с пропавшим адресом? Ну, то есть надо ли будет вручную забивать адрес перехода? ![]() |
|
Создано: 10 июля 2007 15:08 · Личное сообщение · #25 |
|
Создано: 10 июля 2007 22:30 · Личное сообщение · #26 |
![]() |
eXeL@B —› Вопросы новичков —› Проблема после распаковки (аспр) |