首页
社区
课程
招聘
[原创]Crack之初体验-第三课
发表于: 2011-12-11 05:48 64492

[原创]Crack之初体验-第三课

2011-12-11 05:48
64492

Crack之初体验系列--第一课==第二课
=========================================

00401045  |.  6A 30         PUSH 30                               ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
00401047  |.  68 00604000   PUSH crackme2.00406000                ; |crackme2
0040104C  |.  68 7A604000   PUSH crackme2.0040607A                ; |what the hell are you doing in my app with a debugger?
00401051  |.  6A 00         PUSH 0                                ; |hOwner = NULL
00401053  |.  E8 9C030000   CALL <JMP.&user32.MessageBoxA>        ; \MessageBoxA
00401058  |.  6A 00         PUSH 0                                ; /ExitCode = 0
0040105A  \.  E8 A7030000   CALL <JMP.&kernel32.ExitProcess>      ; \ExitProcess
00401246  |.  68 B1604000   PUSH crackme2.004060B1                ; /                                       nameless
0040124B  |.  68 B6624000   PUSH crackme2.004062B6                ; |String1 = ""
00401250  |.  E8 DB010000   CALL <JMP.&kernel32.lstrcmpA>         ; \lstrcmpA这儿是比较函数
00401255      75 16         JNZ SHORT crackme2.0040126D               ;这儿根据比较结果进行相应的跳转
00401257  |.  6A 00         PUSH 0                                ; /Style = MB_OK|MB_APPLMODAL
00401259  |.  68 00604000   PUSH crackme2.00406000                ; |crackme2
0040125E  |.  68 3D604000   PUSH crackme2.0040603D                ; |valid serial - now write a keygen!这儿是验证成功时执行的代码,其实就是弹出一个对话框
00401263  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]             ; |hOwner
00401266  |.  E8 89010000   CALL <JMP.&user32.MessageBoxA>        ; \MessageBoxA
0040126B  |.  EB 14         JMP SHORT crackme2.00401281
0040126D  |>  6A 10         PUSH 10                               ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
0040126F  |.  68 00604000   PUSH crackme2.00406000                ; |crackme2
00401274  |.  68 60604000   PUSH crackme2.00406060                ; |wrong serial - try again!这儿是验证失败
00401279  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]             ; |hOwner
0040127C  |.  E8 73010000   CALL <JMP.&user32.MessageBoxA>        ; \MessageBoxA
00401281  |>  5B            POP EBX
00401282  |.  5E            POP ESI
00401283  |.  5F            POP EDI
00401284  |.  C9            LEAVE
00401285  \.  C2 0400       RETN 4
004011C3  |.  68 84624000   |PUSH crackme2.00406284               ; |Buffer = crackme2.00406284
004011C8  |.  6A 01         |PUSH 1                               ; |ControlID = 1
004011CA  |.  FF75 08       |PUSH DWORD PTR SS:[EBP+8]            ; |hWnd
004011CD  |.  E8 16020000   |CALL <JMP.&user32.GetDlgItemTextA>   ; \GetDlgItemTextA
004011D2  |.  64:8B15 18000>|MOV EDX,DWORD PTR FS:[18]
004011D9  |.  8B52 30       |MOV EDX,DWORD PTR DS:[EDX+30]
004011DC  |.  0FB652 02     |MOVZX EDX,BYTE PTR DS:[EDX+2]
004011E0  |.  83F8 00       |CMP EAX,0
004011E3  |.  7F 11         |JG SHORT crackme2.004011F6
004011C3  |.  68 84624000   |PUSH crackme2.00406284               ; |Buffer = crackme2.00406284
004011E0  |.  83F8 00       |CMP EAX,0
004011E3  |.  7F 11         |JG SHORT crackme2.004011F6
004011F6  |> \8D35 84624000 LEA ESI,DWORD PTR DS:[406284]  ;将存放name的缓冲区地址传给ESI
004011FC  |.  33C9          XOR ECX,ECX    ;清空ECX
004011FE  |>  0FBE06        /MOVSX EAX,BYTE PTR DS:[ESI]  ;将name的第一个字符放进EAX中        循环体开始
00401201  |.  8BD8          |MOV EBX,EAX          ;这中间这段就是对name的每个字符进行处理
00401203  |.  2BF2          |SUB ESI,EDX
00401205  |.  C1E0 04       |SHL EAX,4
00401208  |.  C1EB 05       |SHR EBX,5
0040120B  |.  33C3          |XOR EAX,EBX
0040120D  |.  83C0 26       |ADD EAX,26
00401210  |.  33C1          |XOR EAX,ECX
00401212  |.  03C8          |ADD ECX,EAX
00401214  |.  46            |INC ESI                    ;将指针移向name的下一个字符
00401215  |.  803E 00       |CMP BYTE PTR DS:[ESI],0      ;判断是否为空,是则说明name中得每个字符都处理过了,否则跳到开头继续处理下一个字符
00401218  |.^ 75 E4         \JNZ SHORT crackme2.004011FE  ;循环体结束
0040121A  |.  B8 EF0D0C00   MOV EAX,0C0DEF
0040121F  |.  2BC1          SUB EAX,ECX
00401221  |.  0FAFC0        IMUL EAX,EAX

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (89)
雪    币: 66
活跃值: (1880)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
强,凌晨两点还在搞,向LZ学习。
2011-12-11 07:52
0
雪    币: 210
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好文章,楼主威武!像楼主这样技术高人品好的值的表扬!
2011-12-11 10:12
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
菜鸟来支持 下,再学习
2011-12-11 10:40
0
雪    币: 124
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
“然后后面就是对计算出来的结果进行格式化处理,具体格式是:
最后将CM2,A,C连解成注册码,一组可行的注册码:CM2-C-A
比如:name:iloveswu       serial:CM2-4879-9072D264

---
上面的Serial后面的几位是怎么算出来的? 没怎么看明白。谢谢
2011-12-11 11:02
0
雪    币: 697
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
哈哈,坐等下集,
2011-12-11 11:12
0
雪    币: 216
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
同LS                                                                   ~
2011-12-11 11:37
0
雪    币: 124
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
下载下来自己测试了一吧,直接nop可以直接过,然后另外实验了一下找注册码,我这虽然找到了注册码,但是怎么重新开程序验证的时候提示错误?
上传的附件:
2011-12-11 13:20
0
雪    币: 231
活跃值: (75)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
9
用luohualiushui算出来的注册码是:CM2-55B739-FC26C964啊,你检查一下是不是哪儿出错了。
2011-12-11 16:25
0
雪    币: 57
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
强烈要求版主 加精!!!此贴必火!!太精彩了!!!
楼主加油!!!
2011-12-11 16:33
0
雪    币: 231
活跃值: (75)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
11
这是前人做的教程:http://bbs.pediy.com/showthread.php?threadid=32925
先去看看,还是没看明白的话就说明你对汇编代码还不是很熟悉啊,恶补一下知识
我说一下关键的几步吧
004011FE  |>  0FBE06        /MOVSX EAX,BYTE PTR DS:[ESI]  ;将name的第一个字符放进EAX中        循环体开始
00401201  |.  8BD8          |MOV EBX,EAX          ;这中间这段就是对name的每个字符进行处理
00401203  |.  2BF2          |SUB ESI,EDX
00401205  |.  C1E0 04       |SHL EAX,4
00401208  |.  C1EB 05       |SHR EBX,5
0040120B  |.  33C3          |XOR EAX,EBX
0040120D  |.  83C0 26       |ADD EAX,26
00401210  |.  33C1          |XOR EAX,ECX
00401212  |.  03C8          |ADD ECX,EAX
00401214  |.  46            |INC ESI                    ;将指针移向name的下一个字符
00401215  |.  803E 00       |CMP BYTE PTR DS:[ESI],0      ;判断是否为空,是则说明name中得每个字符都处理过了,否则跳到开头继续处理下一个字符
00401218  |.^ 75 E4         \JNZ SHORT crackme2.004011FE  ;循环体结束


如上所示,第一句看不懂没关系,只要知道那是把name的一个字符放进EAX就是了。

将用户名每位取出ascii码值计算,设每位为x,C为ecx的值

     A=shl(x)
B=shr(x)
     A=A XOR B
A=A+26
A=A XOR C
C=C+A
然后在用户名长度之内进行循环计算
     A=0C0DEF
A=A-C
A=A*A

两个合起来看就是这样的:

004011F6 |> \8D35 84624000 LEA ESI,DWORD PTR DS:[406284] ;将存放name的缓冲区地址传给ESI
004011FC |. 33C9 XOR ECX,ECX ;清空ECX
004011FE |> 0FBE06 /MOVSX EAX,BYTE PTR DS:[ESI] ;将name的第一个字符放进EAX中 将用户名每位取出ascii码值计算,循环体开始
00401201 |. 8BD8 |MOV EBX,EAX ;把EAX中得字符复制一份到EBX
00401203 |. 2BF2 |SUB ESI,EDX
00401205 |. C1E0 04 |SHL EAX,4 ;A=shl(x)
00401208 |. C1EB 05 |SHR EBX,5 ;B=shr(x)
0040120B |. 33C3 |XOR EAX,EBX ;A=A XOR B
0040120D |. 83C0 26 |ADD EAX,26 ; A=A+26
00401210 |. 33C1 |XOR EAX,ECX ; A=A XOR C
00401212 |. 03C8 |ADD ECX,EAX ; C=C+A
00401214 |. 46 |INC ESI ;将指针移向name的下一个字符
00401215 |. 803E 00 |CMP BYTE PTR DS:[ESI],0 ;判断是否为空,是则说明name中得每个字符都处理过了,否则跳到开头继续处理下一个字符
00401218 |.^ 75 E4 \JNZ SHORT crackme2.004011FE ;循环体结束
0040121A |. B8 EF0D0C00 MOV EAX,0C0DEF ;A=0C0DEF
0040121F |. 2BC1 SUB EAX,ECX ;A=A-C
00401221 |. 0FAFC0 IMUL EAX,EAX ;A=A*A
最后将CM2,A,C连接成注册码,格式是:CM2-C-A


这儿如果实在看不懂也没事,只要明白程序把name拿进来处理,处理完后把CM2和两个处理好的字符串用“-”连接起来就是了,具体的算法等大家有相应的知识了再来分析吧,昨晚也太累了,所以这儿就一笔带过了,没明白不要紧,我们下节课还要讲的
2011-12-11 16:42
0
雪    币: 124
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
也就是说你的第一次的注册码的计算是根据那一段算法来的,是吗 ? 人工计算的 ?

第二个我看是设置跳转,然后设断电,但是我按照楼主的方法,设断后,OD 中无限制running啊....求解,本人这块非常新~~~~~~~~~~~~~谢谢拉!~~~
2011-12-11 21:00
0
雪    币: 231
活跃值: (75)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
13
呵呵,第一次我没有人工算,我是用第二种方法得到的,但是算法都知道了那还有什么难的呢?

第二个的关键是将入口处的CALL地址改到00401060,也就是改成CALL crackme2.00401060,然后在lstrcmpA函数上下断点,就可以拦截到正确的注册码了
2011-12-11 22:36
0
雪    币: 124
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢啦,按照这个方式得到了,luohualiushui的paswd应该是CM2-55B739-FC26C964,
另外我第一个没有设置call跳转到401060也可以generate到正常的序列号啊,什么情况。。。
2011-12-11 23:14
0
雪    币: 231
活跃值: (75)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
15
我就奇怪了,你开始将CALL改了,你还说OD无限running,然后第二次又说没改也可以拦截到,这什么情况啊,似乎搞反了。。。。
2011-12-12 09:56
0
雪    币: 124
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
第一次没有抓图,所以也不晓得是什么情况,第二次,我把第一行的地址没有换,直接设置bp,也可以抓到密码啊。。。
2011-12-12 12:31
0
雪    币: 226
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
强悍的没话说,努力学习中
2011-12-12 14:47
0
雪    币: 231
活跃值: (75)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
18
你不是用的OD ??
我用OD载入后直接F9的话就是这个对话框啊!
2011-12-12 18:21
0
雪    币: 124
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
[QUOTE=四波;1028722]你不是用的OD ??
我用OD载入后直接F9的话就是这个对话框啊!
[/QUOTE]

不晓得啊,我刚又跑了一遍,没有设置,直接设置断点,就跑到答案了,不晓得什么情况,我从昨天开始跑这个crackme,都没有跳出那个对话框过啊。
上传的附件:
  • 1.gif (190.19kb,210次下载)
2011-12-12 18:59
0
雪    币: 13621
活跃值: (3957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
感谢精彩分享!非常详细!
2011-12-12 19:53
0
雪    币: 231
活跃值: (75)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
21
不清楚,我这机器上如果不改代码在OD里直接F9永远都只能弹出那个what the hell....对话框,你再把没改过的程序在OD里一直F8试试?看是不是会跳到后面的代码去
2011-12-12 21:58
0
雪    币: 124
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
一样的,坚决不跳窗口,哈哈
2011-12-12 22:06
0
雪    币: 231
活跃值: (75)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
23
你做个视频我看看,我还不信了,有这么怪的事。。。。
2011-12-12 22:51
0
雪    币: 35
活跃值: (139)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
24
越来越深入,越来越精彩啊!
2011-12-13 02:34
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
擦...我WIN7的系统不能打开这个程序?
用管理员身份运行都不可以?
2011-12-13 10:42
0
游客
登录 | 注册 方可回帖
返回
//