能力值:
( LV2,RANK:10 )
|
-
-
2 楼
强,凌晨两点还在搞,向LZ学习。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
好文章,楼主威武!像楼主这样技术高人品好的值的表扬!
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
菜鸟来支持 下 ,再学习
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
“然后后面就是对计算出来的结果进行格式化处理,具体格式是:
最后将CM2,A,C连解成注册码,一组可行的注册码:CM2-C-A
比如:name:iloveswu serial:CM2-4879-9072D264
”
---
上面的Serial后面的几位是怎么算出来的? 没怎么看明白。谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
哈哈,坐等下集,
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
同LS ~
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
下载下来自己测试了一吧,直接nop可以直接过,然后另外实验了一下找注册码,我这虽然找到了注册码,但是怎么重新开程序验证的时候提示错误?
|
能力值:
( LV9,RANK:140 )
|
-
-
9 楼
用luohualiushui算出来的注册码是:CM2-55B739-FC26C964啊,你检查一下是不是哪儿出错了。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
强烈要求版主 加精!!!此贴必火!!太精彩了!!!
楼主加油!!!
|
能力值:
( 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和两个处理好的字符串用“-”连接起来就是了,具体的算法等大家有相应的知识了再来分析吧,昨晚也太累了,所以这儿就一笔带过了,没明白不要紧,我们下节课还要讲的
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
也就是说你的第一次的注册码的计算是根据那一段算法来的,是吗 ? 人工计算的 ?
第二个我看是设置跳转,然后设断电,但是我按照楼主的方法,设断后,OD 中无限制running啊....求解,本人这块非常新~~~~~~~~~~~~~谢谢拉!~~~
|
能力值:
( LV9,RANK:140 )
|
-
-
13 楼
呵呵,第一次我没有人工算,我是用第二种方法得到的,但是算法都知道了那还有什么难的呢?
第二个的关键是将入口处的CALL地址改到00401060,也就是改成CALL crackme2.00401060,然后在lstrcmpA函数上下断点,就可以拦截到正确的注册码了
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
谢谢啦,按照这个方式得到了,luohualiushui的paswd应该是CM2-55B739-FC26C964,
另外我第一个没有设置call跳转到401060也可以generate到正常的序列号啊,什么情况。。。
|
能力值:
( LV9,RANK:140 )
|
-
-
15 楼
我就奇怪了,你开始将CALL改了,你还说OD无限running,然后第二次又说没改也可以拦截到,这什么情况啊,似乎搞反了。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
第一次没有抓图,所以也不晓得是什么情况,第二次,我把第一行的地址没有换,直接设置bp,也可以抓到密码啊。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
强悍的没话说,努力学习中
|
能力值:
( LV9,RANK:140 )
|
-
-
18 楼
你不是用的OD ??
我用OD载入后直接F9的话就是这个对话框啊!
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
[QUOTE=四波;1028722]你不是用的OD ??
我用OD载入后直接F9的话就是这个对话框啊!
[/QUOTE]
不晓得啊,我刚又跑了一遍,没有设置,直接设置断点,就跑到答案了,不晓得什么情况,我从昨天开始跑这个crackme,都没有跳出那个对话框过啊。
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
感谢精彩分享!非常详细!
|
能力值:
( LV9,RANK:140 )
|
-
-
21 楼
不清楚,我这机器上如果不改代码在OD里直接F9永远都只能弹出那个what the hell....对话框,你再把没改过的程序在OD里一直F8试试?看是不是会跳到后面的代码去
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
一样的,坚决不跳窗口,哈哈
|
能力值:
( LV9,RANK:140 )
|
-
-
23 楼
你做个视频我看看,我还不信了,有这么怪的事。。。。
|
能力值:
( LV7,RANK:100 )
|
-
-
24 楼
越来越深入,越来越精彩啊!
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
擦...我WIN7的系统不能打开这个程序?
用管理员身份运行都不可以?
|
|
|