【文章标题】: 新手的一次 Crackme
【文章作者】: 天涯浪人
【作者邮箱】: TianYaLangRenA@163.com
【软件名称】: Crackme#1.exe
【下载地址】: 不好意思,忘了在哪找的了,好像是在 CrackME 上找的,不过现在又找不着了
【加壳方式】: 无
【保护方式】: 不懂,应该算是一些跳转吧
【编写语言】: 汇编
【使用工具】: OllyDbg,IDA Pro
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
szName 用来接收输入的名字
szSerial 用来接收输入的序列号
func_translate(char *); 用来将输入的序列号由ASCII码形式转换成数值形式,例如:func_translate("123abc")==0xcba321(字节顺序的变化),还有 func_tralslate(char *) 只转换'0'~'9'和'A'~'E'(包括'0','9','A','E','A'和'E'必须为大写,且索引(以0开始)必须为2,5或8),否则错误.
func_calc(char,char,char,char);用计算输入的名字和序列号, 并且szName每一个字符对应 szSerial 三个字符, 例如:func(szName[i],szSerial[i*3],szSerial[i*3+1],szSerial[i*3+2]); ,并且只计算且必须计算 szSerial 的9个字符也就是说名字的前三个字符,不够或计算结果不相符则返回错误,多则忽略.
然后再用 szSerial 重新来接收一次序列号,然后检查是否在'0'~'9'和'A'~'D'(同样要为大写,但没有索引限制)之间,不在这个范围则返回错误,且将最后的 '\0' 字符改为 '#' 字符. 所以szSerial只能在'0'~'9'和'A'~'D'之间(并不是象上面的 'A'~'Z'),否则错误.
然后再根据 szSerial 查表跳转,大体规则为 szSerial 的字符个数应该是双数,且第一个应该和倒数第一个(不是指'\0'字符)相同,第二个应该和倒数第二个相同,以此类推,如果满足条件,将跳到显示 "Good work" 对话框的地方,否则错误对话窗口过程返回.
在显示 "Good work" 时程序为 szText 和 szCaption 解码且动态写入 szText 和 szCaption 的地址,然后再把 szText 和 szCaption 还原,然后返回.
func_calc(char,char,char,char); 为:
xor edi, edi
.text:004010B9 BA 00 00 00 00 mov edx, 0
.text:004010BE 52 push edx
.text:004010BF
.text:004010BF @@repeat: ; CODE XREF: DialogFunc+E6j
.text:004010BF 0F B6 9F 1B 30 40+ movzx ebx, (szSerial+1)[edi]
.text:004010C6 0F B6 8F 1A 30 40+ movzx ecx, szSerial[edi]
.text:004010CD 8B F1 mov esi, ecx
.text:004010CF 6B C3 03 imul eax, ebx, 3
.text:004010D2 03 F0 add esi, eax
.text:004010D4 8B C3 mov eax, ebx
.text:004010D6 F7 E3 mul ebx
.text:004010D8 03 F0 add esi, eax
.text:004010DA 8B C1 mov eax, ecx
.text:004010DC F7 E1 mul ecx
.text:004010DE 03 F0 add esi, eax
.text:004010E0 0F AF D9 imul ebx, ecx
.text:004010E3 6B DB 02 imul ebx, 2
.text:004010E6 03 F3 add esi, ebx
.text:004010E8 8B C6 mov eax, esi
.text:004010EA BA 02 00 00 00 mov edx, 2
.text:004010EF F6 F2 div dl
.text:004010F1 6B C0 0E imul eax, 14
.text:004010F4 02 87 1C 30 40 00 add al, (szSerial+2)[edi]
.text:004010FA 5A pop edx
.text:004010FB 3A 82 07 30 40 00 cmp al, szName[edx]
.text:00401101 75 46 jnz short @@ret1_popa
.text:00401103 83 C7 03 add edi, 3
.text:00401106 83 FF 09 cmp edi, 9
.text:00401109 74 04 jz short @@done
.text:0040110B 42 inc edx ; int
.text:0040110C 52 push edx
.text:0040110D EB B0 jmp short @@repeat
查表跳转时,一共有四个表,入口为第四个表:
# jmp_#_1 R Table_4
N jmp_N_1 L Table_1
# jmp_#_2 L Table_1
# jmp_N_2 - exit_fail
# jmp_#_3 L Table_2
N jmp_N_3 R Table_3
# jmp_#_4 - exit_done
# jmp_N_4 R Table_3
L , R 和 - 代表指向 szSerial 的指针变化, R 为加, L 为减, - 为没动作.
第一列的 # 和 N 为将当前指向的字符换成什么, # 为用 '#' 替换当前字符, N 为用原来的字符
jmp_X_Y 表示当用当前字符查表时, X 表示当前字符为 '#', Y 为当前处在哪个表, Table_Z 为要跳转的表.
在 jmp_N_4 时当 jmp_#_2 的判断字符写为当前字符,其它的判断字符全和当前字符相等
只有在 jmp_N_4 和 jmp_#_2 时才改变字符串(jmp_N_4 把最左边不是 '#' 号的改为 '#', jmp_#_2 改最后一个),当字符串全部被改为 '#' 时成功
还有用 C 写一小段代码来算注册码,方法很笨,不过不笨的不会,但不过算出的只是 szSerial 的前九个,得自己补上后面的,要对称啊^_^
第一次写,不对和不足之处,还请指出,我会非常非常非常感谢
--------------------------------------------------------------------------------
【经验总结】
耐心,经验(如果您不像我一样的话,应该会有这一点儿,因为俺菜鸟儿),运气.
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年07月06日 18:51:04
昨天走急,把C代码忘了 ,补上
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!