Ранг: 4.1 (гость), 1thx Активность: 0=0 Статус: Участник
Создано: 29 ноября 2009 01:13 · Поправил: Amidosha · Личное сообщение · #1
Здраствуйте, уважаемые пользователи данного ресурса, кто может мне объяснить сею генерацию серийника в данном крекми, ни как не врублюсь, что-то, спасибо, крекми предлагается.
Code:
LEAEAX,DWORDPTRSS:[EBP-4]- На мой взгляд тут кладется не правильный серийник
CALL cracme_b.00404D40- вызов генерации как я думаю
MOVEDX,DWORDPTRSS:[EBP-4]
MOVZXEDX,BYTEPTRDS:[EDX+EBX-1]
SUBEDX,12
MOVBYTEPTRDS:[EAX+EBX-1],DL
INCEBX
CMPEBX,9- количество знаков правильного серийника, может я и не прав
JNZSHORT cracme_b.0046EE19- выход из под программы генерации
Amidosha пишет: На мой взгляд тут кладется не правильный серийник тут берутся символы от твоего серийника пару строчек ниже строка "+g\`SY++" прибавляешь к каждому символу 0x12 получаешь серийник "=ynrek=="
crackme где то откопал на просторах интернета, а еще вопросик, где вы в коде нашли указание на то что к каждому +g\`SY++ символу, прибавляется 0x12 и по чему именно это.
CMP EBX,9 - количество знаков правильного серийника, может я и не прав, оказывается был не прав.
Вот как я понял правильный серийник =ynrek== На примере хотя бы двух символов правильного серийника, напишите если не трудно, как именно они высчитываются, то есть полуачется =y например, ни как не допру, или не мое это или читать еще надо что нить. спасибо
0046EE2Cmovbyteptrds:[eax+ebx-1],dl; записали в память по адресу eax+ebx-1 один символ
; посчитанного ключа
0046EE30incebx; следующий символ
все происходит здесь
Code:
0046EE19leaeax,dwordptrss:[ebp-4]
0046EE1Ccall00404D40; cracme_.00404D40
0046EE21movedx,dwordptrss:[ebp-4]
0046EE24movzxedx,byteptrds:[edx+ebx-1]
0046EE29subedx,12
0046EE2Cmovbyteptrds:[eax+ebx-1],dl
0046EE30incebx
0046EE31cmpebx,9
0046EE34jnzshort0046EE19; cracme_.0046EE19
Вводим "123456" и становимся на адрес 0x0046EE21
Code:
0046EE21movedx,dwordptrss:[ebp-4]
Stack ss:[0012FBA0]=00B1CA00,(ASCII "123456")
edx=00B1CA00,(ASCII "123456")
В EDX занесли строку "123456"
Шагаем далее
Code:
0046EE24movzxedx,byteptrds:[edx+ebx-1]
ds:[00B1C910]=31('1')
edx=00B1C910,(ASCII "123456")
В EDX (его младшую половину DL который 8 байт) занесли значение ASCII символа "1" = 0x31
основное действо
Code:
0046EE29subedx,12
отняли от DL 0x12,т.е. первый символ=0x31 - 0x12 = 0x0000001F
Останавливайся на каждой операции и смотри в какую сторону поменялись регистры/стек после исполнения каждой строки кода и выполняй все что здесь описано. Основная часть выше, потом передается управление на процедуру сравнения, которая сравнивает каждый символ введенного ключа - 0x12 со строкой "+g\`SY++" - логично предположить, что если провести обратную операцию над строкой "+g\`SY++" то получится правильный ключ
compact пишет: но как проверяется сразу не очевидно. Так для того и пишут crackme Если бы в них всё было очевидно, в чём тогда смысл? 004011F0 Процедура проверки, распечатай и изучай!
Isaev пишет: Так для того и пишут crackme Если бы в них всё было очевидно, в чём тогда смысл? Если Вы нашли время написать это, то, возможно, ответите и на мои вопросы.
Правильно ли я понял, что адреса на логин и пароль хранятся в регистрах ebx и eax? Как понять, куда перейдет jmp off_4013D4[esi*4], если в конце листинга находится:
Code:
.text:004013D4 off_4013D4 ddoffset loc_40122C
.text:004013D4ddoffset loc_401235 ; jump table for switch statement
спасибо) На сколько я понял, там указатель стека (esp), смещенный на 8, а потом (перед cases) вычли еще единичку. Но дело в том, что этот esi меняется со временем, и отследить, куда надо прыгать, у меня пока не выходит (кажется, что очень много вариантов нужно пересмотреть, обфускация какая-то).