首页
社区
课程
招聘
新手的一次 Crackme
发表于: 2006-8-5 18:51 5333

新手的一次 Crackme

2006-8-5 18:51
5333

【文章标题】: 新手的一次 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代码忘了 ,补上


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 110
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习,朋友厉害
2006-8-5 18:57
0
雪    币: 191
活跃值: (205)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
3
不错,支持一下!
2006-8-5 19:28
0
雪    币: 338
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
分析的确实不错!!
2006-8-5 23:43
0
游客
登录 | 注册 方可回帖
返回
//