Ericky 发表于 2013-6-18 11:26

一个简单crackme的算法分析2013.06.18

本帖最后由 PoJie_小雨 于 2014-9-14 21:24 编辑

【文章标题】:一个简单crackme的算法分析2013.06.18
【文章作者】: xiaoyu
【作者邮箱】:
【下载地址】: http://pan.baidu.com/share/link?shareid=710222177&uk=892352529
【保护方式】: none
【使用工具】: PEiD,OllyDbg
【作者声明】: 主要记录自己的学习过程!欢迎交流学习
--------------------------------------------------------------------------------
【详细过程】
1.查壳
我们发现并没有壳
程序由Microsoft Visual C# v7.0 / Basic .NET编写:

2.使用K-analysis插件查看算法
发现为BASE64和MD5算法:

3.算法分析:
我们用OD载入:

不难发现,我们看见了熟悉的函数:00401027|.E8 D4090000   call <jmp.&user32.DialogBoxParamA>    ; \DialogBoxParamA
先让程序跑起来
发现输入name and serial 之后:
“check”按钮点击,并未有任何反应

那该怎么办?
这里 我们可以试试:GetDlgItemTextA这个函数
bp GetDlgItemTextA
我们发现 程序被断下来了:
我们在段首下断点:

让程序跑起来,发现断下来了
F8单步走:(发现这两条是取了用户名)
00401124 |. E8 E3080000 call <jmp.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
00401129 |. 68 A2324000 push kiToKGNm.004032A2 ; 取用户名
我们继续F8分析:
00401134|.E8 67070000   call kiToKGNm.004018A0                ;算法CALL
我们进入算法CALL分析:

可以看到他是以ebp来几次的 每次以3个字节来计算:
把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
具体算法请大家百度 ,我不细说了
注意存放地址:004032A2
00401139|.68 A2324000   push kiToKGNm.004032A2                ; /StringToAdd = "eGlhb3l1"
0040113E|.68 D4324000   push kiToKGNm.004032D4                ; |ConcatString = ""
00401143|.E8 A0080000   call <jmp.&kernel32.lstrcatA>         ; \lstrcatA
00401148|.68 3E324000   push kiToKGNm.0040323E                ; /StringToAdd = "NTE0MDA4MjhOVEUwTURBNE=="
0040114D|.68 D4324000   push kiToKGNm.004032D4                ; |ConcatString = ""
00401152|.E8 91080000   call <jmp.&kernel32.lstrcatA>         ; \lstrcatA
发现name被压栈
调用了2次字符串相加的函数:lstrcatA
00401157|.68 D4324000   push kiToKGNm.004032D4                ; /String = "eGlhb3l1NTE0MDA4MjhOVEUwTURBNE==";将相加结果 存入栈中
继续F8:
0040115C|.E8 93080000   call <jmp.&kernel32.lstrlenA>         ; \lstrlenA
这里的CALL 实际上是一个判断“eGlhb3l1NTE0MDA4MjhOVEUwTURBNE==”长度的子程序
长度存入了EAX
00401161|.A3 A0314000   mov dword ptr ds:,eax;长度保存
继续F8:
00401166|.E8 3D060000   call kiToKGNm.004017A8                ;MD5算法CALL
进入CALL后 我们看见了:
MD5算法结果是分成4段的:

0040118D|.53            push ebx                              ; /<%X> = F59D4EF1
很明显,这里其实是将4段MD5值相加和值入栈
下面来到关键句:
004011A0|.C605 3C334000>mov   byte ptr , 2D
2D其实就是“-”字符的ASCII码值
byte ptr , 和值的“第五位”
所以上面的意思就是将和值的第五位字母用符号“-”替换
这个就是验证码了
然后2者比较:

算法就分析得差不多了

MD5的算法CALL 中 有变化,并不是直接算的MD5值的4段相加
而是稍微有变化
如有兴趣,请读者自己研究
最后附上注册机:








jingdor 发表于 2013-6-18 11:30

学习学习,lz好样的!

Ericky 发表于 2013-6-18 11:34

jingdor 发表于 2013-6-18 11:30 static/image/common/back.gif
学习学习,lz好样的!

貌似都不敢兴趣算法。。

ljtnine 发表于 2013-6-18 11:37

感谢分享,研究一下

Ericky 发表于 2013-6-18 11:38

ljtnine 发表于 2013-6-18 11:37 static/image/common/back.gif
感谢分享,研究一下

好的 加油

淡然出尘 发表于 2013-6-18 12:05

楼主狠犀利啊..貌似.net的文件很难破的

Ericky 发表于 2013-6-18 12:06

淡然出尘 发表于 2013-6-18 12:05 static/image/common/back.gif
楼主狠犀利啊..貌似.net的文件很难破的

只是大家接触得少。。而且我这个也是比较容易的了·

淡然出尘 发表于 2013-6-18 12:10

已加你QQ了 今后多多交流哈
我也是大三的 但是专业苦逼..

Ericky 发表于 2013-6-18 13:15

淡然出尘 发表于 2013-6-18 12:10
已加你QQ了 今后多多交流哈
我也是大三的 但是专业苦逼..

你怎么有我qq。。。你什么专业。。

小雨细无声 发表于 2013-6-18 20:17

晕,今天的热心和爱币都贡献出去了,感谢大神!
页: [1] 2
查看完整版本: 一个简单crackme的算法分析2013.06.18