还是下定决心好好做一波crackme
逆向的新手,写个博客记录一下自己的学习经历和crack思路
---------------------------------------------------华丽丽的分割线-------------------------------------------------
0X00 首先查壳,观察到没有壳并且是delphi语言编写的
还是打开软件,可是发现并没有确认按钮。。
鼠标移动到文本框当中发现提示:注册成功时会在下面出现一张照片。
先简单猜测一下程序的执行流程,既然没有确认按钮,那么可能对于某一个name
当输入serial的时候会进行判断是否符合正确的结果,符合的话输出照片,不符合的话进入死循环。
好的那么接下来就要开始搞了。
0X01 接着考虑爆破程序。
第一点考虑的就是既然没有加壳那么很有可能能搜索到字符串,于是OD中搜索
嗯,发现了关键的语句,跟进以后找到了关键代码。
接着下断点,根据刚才的猜测,输入name后在输入serial、点击下面图片时触发了断点
接着改变标志位绕过判断,最终出现了照片
这样爆破就完成了。
0X02 那么我们怎么样知道正确的serial呢?
由于对Delphi不熟悉,因此网上查了一下大佬们在逆Delphi时的各种姿势。
发现了一个很好用的工具Dede,于是下载下来然后拖入程序进行分析。
发现过程窗口里面有chkcode事件,这就很有可能是我们要找的计算序列号的函数了,查看RVA是00457C40
那么在OD当中 ctrl+G 找到这个位置
嗯,看了一下逻辑没有什么问题
00457C40 /. 55 push ebp
00457C41 |. 8BEC mov ebp,esp
00457C43 |. 51 push ecx
00457C44 |. B9 05000000 mov ecx,0x5
00457C49 |> 6A 00 /push 0x0
00457C4B |. 6A 00 |push 0x0
00457C4D |. 49 |dec ecx
00457C4E |.^ 75 F9 \jnz short CKme.00457C49 ; 循环了5次,并没有看出来意义是什么。。
00457C50 |. 51 push ecx
00457C51 |. 874D FC xchg [local.1],ecx
00457C54 |. 53 push ebx
00457C55 |. 56 push esi
00457C56 |. 8BD8 mov ebx,eax
00457C58 |. 33C0 xor eax,eax
00457C5A |. 55 push ebp
00457C5B |. 68 3D7E4500 push CKme.00457E3D
00457C60 |. 64:FF30 push dword ptr fs:[eax]
00457C63 |. 64:8920 mov dword ptr fs:[eax],esp
00457C66 |. 8BB3 F8020000 mov esi,dword ptr ds:[ebx+0x2F8] ; 经过分析,esi里存了name的长度
00457C6C |. 83C6 05 add esi,0x5 ; esi+5
00457C6F |. FFB3 10030000 push dword ptr ds:[ebx+0x310]
00457C75 |. 8D55 F8 lea edx,[local.2]
00457C78 |. 8BC6 mov eax,esi
00457C7A |. E8 85FEFAFF call CKme.00407B04
00457C7F |. FF75 F8 push [local.2]
00457C82 |. FFB3 14030000 push dword ptr ds:[ebx+0x314] ; ascii dseloffc-012-OK
00457C88 |. 8D55 F4 lea edx,[local.3]
00457C8B |. 8B83 D4020000 mov eax,dword ptr ds:[ebx+0x2D4]
00457C91 |. E8 B2B6FCFF call CKme.00423348
00457C96 |. FF75 F4 push [local.3] ; ascii 111
00457C99 |. 8D83 18030000 lea eax,dword ptr ds:[ebx+0x318]
00457C9F |. BA 04000000 mov edx,0x4
00457CA4 |. E8 93BFFAFF call CKme.00403C3C
00457CA9 |. 33D2 xor edx,edx
00457CAB |. 8B83 F4020000 mov eax,dword ptr ds:[ebx+0x2F4]
00457CB1 |. E8 AAB5FCFF call CKme.00423260
00457CB6 |. 8B93 18030000 mov edx,dword ptr ds:[ebx+0x318] ; ascii 黑头Sun Bird8dseloffc-012-OK111
00457CBC |. 8B83 F4020000 mov eax,dword ptr ds:[ebx+0x2F4]
00457CC2 |. E8 B1B6FCFF call CKme.00423378
这里就是分析之后的结果,先计算name的长度,然后加5,之后与指定字符串进行拼接,最后结尾接上name。
这样keygen编写就很简单了
#coding:gb18030
def keygen(name):
serial=len(name)+5
serial='黑头Sun Bird'+str(serial)+'dseloffc-012-OK'+name
print serial
name=raw_input('please input the name: ')
keygen(name)
随便生成一个正确的name/serial组合
name:111
serial:黑头Sun Bird8dseloffc-012-OK111
最终破解完成