收藏 分享(赏)

一个经典的CrackMe算法分析.doc

上传人:scg750829 文档编号:8099579 上传时间:2019-06-08 格式:DOC 页数:11 大小:226.50KB
下载 相关 举报
一个经典的CrackMe算法分析.doc_第1页
第1页 / 共11页
一个经典的CrackMe算法分析.doc_第2页
第2页 / 共11页
一个经典的CrackMe算法分析.doc_第3页
第3页 / 共11页
一个经典的CrackMe算法分析.doc_第4页
第4页 / 共11页
一个经典的CrackMe算法分析.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、一个经典的 CrackMe 算法分析-文/KYO前天一个朋友说他下了一个 crackme,有两个关键地方没有分析出来,就发给我看了看。我跟了几个小时终于弄明白了。感觉他的算法写的挺好的,现写出来给各位参考,希望大家能共同进步。先打开看一下界面并随便注册一个帐号试试效果,看是否能弹出什么关键字符串。如下图:原来是看雪学院出的精品啊。添上用户名和密码,点击 check 没有任何反映,看来不能用查找关键字符的方法分析了。*这里插播个广告,黑友们请无视,只是为朋友的网站能被搜索引擎收录,多加点流量。http:/返利网,淘你喜欢,淘宝返利,淘宝返现购物。*接着看一下这个 crackme 有没有加壳吧。用

2、 peid 加载如下图:可以看到没有加壳,所用的编程语言为 win32 汇编。再使用 PEID 的插件 Krypto ANALyzer 查看,这个 crackme 并没有使用经典的加密算法。这下对我来说是最喜欢的。因为汇编语言分析起来最省力了,我想大部分玩破解的会和我有同样的感觉。接下来正式进入正题,用 OD 加载,然后 F9 运行程序,添写上面的注册名和密码,接着使用万能断点,程序就被断在这里。从模块-user32 可以看到这是系统领空,不是我们来的地方,删除这个断点,然后ALT+F9 回到这里。这里就是程序领空,我在 00401185 这里先下个断再说。*这里插播个广告,黑友们请无视,只是

3、为朋友的网站能被搜索引擎收录,多加点流量。http:/返利网,淘你喜欢,淘宝返利,淘宝返现购物。*先粗略的看一下程序代码再说,一直往下看,发现需要经过 5 个验证才能最终走到这里从上图 GOOD JOB,MAN! 这里可以看到,程序要能顺利走到 0040137E,就会注册成功。那么我现在就慢慢来跟。首先看下面这段,也就是第一个验证。00401185 |. 83F8 04 CMP EAX,4 ;取用户名长度跟 4 比较,小于 4 则跳向失败00401188 |. 73 05 JNB SHORT CrackMe_.0040118F0040118A |. E9 11020000 JMP CrackM

4、e_.004013A00040118F | A3 8F354000 MOV DWORD PTR DS:40358F,EAX00401194 |. 68 FF000000 PUSH 0FF ; /Count = FF (255.)00401199 |. 68 93354000 PUSH CrackMe_.00403593 ; |Buffer = CrackMe_.004035930040119E |. 68 ED030000 PUSH 3ED ; |ControlID = 3ED (1005.)004011A3 |. FF75 08 PUSH DWORD PTR SS:EBP+8 ; |hWnd

5、004011A6 |. E8 47020000 CALL ; GetDlgItemTextA ;得到密码的长度004011AB |. BA 1B344000 MOV EDX,CrackMe_.0040341B004011B0 |. 8902 MOV DWORD PTR DS:EDX,EAX004011B2 |. E8 49FEFFFF CALL CrackMe_.00401000004011B7 |. 8D1D 1B344000 LEA EBX,DWORD PTR DS:40341B;密码的长度放到 ebx 里面004011BD |. E8 78FEFFFF CALL CrackMe_.004

6、0103A004011C2 |. 3D F716602F CMP EAX,2F6016F7 ;返回值 eax 跟 2F6016F7 比较,不相等则跳向失败004011C7 |. 0F85 D3010000 JNZ CrackMe_.004013A0我用刚才添的 kyo327 密码: 1234567 走到 004011C7 时是跳向失败的。下面分析下看为什么没有通过验证。从上面这一小段可以看到 CALL CrackMe_.00401000 和 CALL CrackMe_.0040103A 是个关键地方。现在 F7 分别进去看看这两个 CALL 的东西。从这段代码看出,这个跟用户名密码都没有任何关

7、系,他是一个单独的计算了 100h 个DWORD 的数放在了 ds:ecx*4+403017中,就相当于一个字符表。当然 ecx 就是从 100h 一直递减到 0 的。这个暂时还没有什么用,先不用管。再看 CALL CrackMe_.0040103A 是干什么用的。这段代码更简单。首先 ebx 里面存的数是上面传过来的,这里也就是密码的长度。程序作用就是取 ebx 里的字符的 16 进制。因为我注册的密码为 7,16 进制就是 37h,(ds:(0FF XOR 37)*4+40301B) XOR 00FFFFFF cmp not (2f6016f7)我粗略的可以表达成上面的算式。这下这个验证有

8、着落了。只要他们比较相等就可以通过这个验证。显然是一个检查密码长度的验证。当然也有人会说我密码长度从 1 开始试起,呵呵,这样也行。更简单的,暴了他更省事,直接把 JNZ CrackMe_.004013A0 改为 JZ CrackMe_.004013A0 就 OK 了。不过我这里还是分析下算法,这样也有助于我们学习。从我写出那个算式来看,ds:ecx*4+403017和(ds:(0FF XOR 37)*4+40301B) 是对应的因为 ds:(ecx+1*4+403017=ds: ecx*4+40301B所以这里只需要把 CALL CrackMe_.00401000 里所构造的字符表打印出来,

9、然后找到对应关系即可。我写了一个小程序来实现。代码很简单,我写出来给大家作为参考。前面的代码头就不写了。.dataszFileName db 字符表.txt,0.data?kyo327 dd ?szbuffer1 db 64 dup(?)hFile dd ?dwTemp dd ?fangzifu dd ?geshu1 dd ?.constszbuffer2 db “第%08x 个数为:%08x“,0dh,0ah,0.codestart:invoke CreateFile,offset szFileName,GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAY

10、S,FILE_ATTRIBUTE_NORMAL,0.if eax != INVALID_HANDLE_VALUEmov hFile,eax.endifxor eax,eax MOV EAX,0ff8cd558hXOR EAX,12345678hMOV kyo327,EAXMOV ECX,100hbh3: MOV EDX,kyo327 LEA EAX,DWORD PTR DS:ECX-1PUSH ECXMOV ECX,8bh2: SHR EAX,1JNB bh1XOR EAX,EDXbh1: DEC ECXJNZ bh2POP ECXmov geshu1,ecxmov fangzifu,EAXi

11、nvoke wsprintf,offset szbuffer1,offset szbuffer2,geshu1,fangzifuinvoke WriteFile,hFile,offset szbuffer1,sizeof szbuffer1,addr dwTemp,0DEC geshu1mov ecx,geshu1JNZ bh3invoke CloseHandle,hFileinvoke ExitProcess,NULLend start编译后通过后 双击程序,会在当前目录下生成一个 “字符表.txt” 。然后每一个值都会有一个对应的值。因为not (2f6016f7) XOR 00FFFFF

12、F=D06016F7。现在查表可得到 D06016F7 对应的数是 0E6. 然后(e6-1) xor 0ff= 1A.这样就得到密码的长度必须为 26 个字符。接下来继续跟 看第 2 个验证。从抓图可以看到最后还是调用了 CALL CrackMe_.00401000 和 CALL CrackMe_.0040103A.取密码的第 9 位和第 18 位放到 ebx 里,然后验证返回值 eax 是否和24c1465 相等。不过这次 EBX 里是两个字符,要麻烦多了。*这里插播个广告,黑友们请无视,只是为朋友的网站能被搜索引擎收录,多加点流量。http:/返利网,淘你喜欢,淘宝返利,淘宝返现购物。*

13、我在这里也郁闷了好久,终于想出一个办法如下:当第 9 位为 01h 到 0ffh 时求出所有的 eax,并让(not 242c1465) xor 所有的 eax 再打印一张字符表。然后这个字符表和上面那个字符表对比,如果找到有相同的 dword 字符就 OK了。这里我又写了小程序来实现,和上面那个程序差不多。这里我只写出关键部分,省得土豆说我有骗稿费只嫌,呵呵。mov geshu1,ecxmov fangzifu,EAXxor fangzifu,00ffffffhshr fangzifu,8xor fangzifu,0dbd3eb9ah编译后又生成一张字符表,通过对比得出这张表的第 d3 个字

14、符和上张表的 2b 个字符是对应的。并且对应的 dword 字符是 dbbbc9d6.这样的话 not 242c1465=dbd3eb9a. dbbbc9d6 xor dbd3eb9a=0068224c0068224c 左移 8 位等于 68224c00 因为右移的时候可能有余数忽略了。所以68224c00 xor 00ffffff=68ddb3ff 后面两位 ff 可能是错的。现在只需要查找表一里面是否有 68ddb3 即可。经查找后找到是 68ddb3f8 再 xor 回去可以得到 al=07因此这次大功告成。联立方程如下:设第 9 个字符 16 进制为 x 第 18 个字符 16 进制为

15、 y(X xor 0ff)+1=d3(y xor 07)+1=2b这样就可求出 x=2d y=2d 转换后得到第 9 个字符和第 18 个字符均为”-“ 字符。接下来继续跟看第 3 个验证。这个验证是取密码前 8 位,前八位必须要在字符 0-9 或者 A-F 之间,并且把字符的 16进制转换成字符,然后把用户名的字符放入 ebx 里,调用 call 004013a0 得出一个数跟前八为比较看是否相等。相等的话则通过验证。这个就简单多了,因为这次 EBX 里的数是已知的,就是我输入的用户名。这个让程序自己来算,最后用户名是 kyo327 的话值为37969166。那么密码前八位也就是 37969

16、166.下面看第 4 个验证这个验证也很简单。取密码的第 10 位到 18 位。也是必须要在字符 0-9 或者 A-F 之间,并且把字符的 16 进制转换成字符,然后把把前八位当成 ebx, (这里也就是 37969166)作运算 算出一个值 跟 10 到 18 位比较。这个还是让程序自己算得到第 10 位到 18 位为E09C3708。再看最后一个验证这个也很简单。把中间 8 位当成 EBX 做运算 算出一个值存到 ebp-8 里。这里是 a4e4e879然后ebp-8 xor 前八位 就等于最后八位= 9372791F到现在为止,就得到了密码。用户名:kyo327 密码:37969166-

17、E09C3708-9372791F可以看到,check 变灰了 而标题那里也显示了 GOOD JOB,MAN!说明已经注册成功了。算法就分析到这,文中两个程序已打包放入光盘。写注册机的话也很简单,只要写的时候先确定一下第 9 位和第 18 位是”- “,并且密码字符个数为 26.然后套用 call 004013a0 里面的代码,写起来应该很轻松的,我就不写了,留给大家来玩吧。不过如果不确定前面我说的两个限制去写注册机,我认为应该非常困难,最起码我是没能力写出来。我感觉象是用穷举的办法来找的。另外这个算法我觉得写的非常好,分析它花了我星期六晚上不睡觉一直搞到半夜 3 点钟,把我累坏了。反而用那些经典的加密算法我觉得会简单点的,至少我不用去 F7 进去,然后看结果再和那些密码工具算出来的值比较一下就 OK 了。如果这个程序中 EBX 里的值是未知数的个数大于 3 个,我想难度会大很多,我是不能保证是否能跟出注册码的。如果各位读者知道跟那两个 call 的简单的思路不妨告诉我,我感激不禁。*这里插播个广告,黑友们请无视,只是为朋友的网站能被搜索引擎收录,多加点流量。http:/返利网,淘你喜欢,淘宝返利,淘宝返现购物。*

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报