最近感觉自己啥都不会吧,就算会也就是点皮毛,还是练的太少了,从160个crackme开始
慢慢来吧,从简单的开始
1.Acid burn
OD动态调试一下,靠字符串定位打断点,如下
跟进这个函数可以看到明文密码
next
2.Afkayas.1
直接对着字符串打断点,爆破
试试看写一下注册机
因为这程序是用vb写的,就没法用IDA了,只能看一下汇编
先再次执行,搜索字符串下断点,然后网上翻,慢慢找注册码生成的函数部分
注册码在这部分往下
可以看见先取出了我们的第一个字母
然后在这里生成了一个数字,应该是对应我们的输入会生成数字
我们继续单步执行,在过程中8NC多次出现,目前还不知道是什么意思
这里密码和我们之前对应生成的数字都出现了,然后底下会有一个strcat函数,会在数字前面加上AKA,那这里应该是最后生成密码的部分,那生成密码的函数体就是在这一段区间里了
那我们从402412push name开始分析,分析在注释里
这里就已经是780368,那之后无非就是加上了一个AKA
keygen
s=input('your name:')
length=len(s)
a=ord(s[0])
length*=0x17CFB
a+=length
#print(a)
serial=''
serial+='AKA-'
serial+=str(a)
print(serial)
3.AfKayAs.2
这题一开始会有个nag窗口来耗费我们的时间,我们首先考虑怎么去掉它
在OD里可以看见,这个程序依然是一个vb程序,vb里面有个消除nag窗口的方法叫做4C法,很神奇……本来想用resource_hacker的,但貌似vb不行
刚开始push的是4067D4,在数据窗口中往后移动4c
数据窗口处的值是406868,再次跟踪过去
是不是觉得有重复段,这些段对应的就是加载窗口,每段的第24个字节对应的是加载的顺序,我们nag窗口的加载顺序换到后面去,就可以直接忽略掉它了,我们把01和00互换就OK了
怎么下断点就不说了,我是靠字符串的,暂停的效果我觉得差不多
爆破的话,找到这个关键语句就够了
看一下怎么实现注册机
代码量真的挺大的,只能慢慢分析了,一层接一层,慢慢调试到如下所示,开始分析
然后接下来一段和2的分析差不多
然后接下来继续说慢慢调试,看看有没有别的计算
4082E6的时候我们之前的‘711224’又出现了
可以看到在40832D之后,711224变成了71126,我认为是有关系的,不然之前的一顿操作不是一点用都没有么
这里首先要学习一些汇编语句了,我自己会变语句储存量比较小的
FLD是Intel的指令集协处理器的汇编指令,FLD 指令用于把浮点数字传送入和传送出FPU寄存器
我们分析完后注释如下
其实就是+2
继续分析,在4083F2又出现了711226
这段操作其实就是*3-2,继续分析
第三段应该是实在4084D4,2133676又出现了
这一段就是-(-15),图上注释原先做了,懒得改了,呜呜呜呜
keygen
s=input('your name:')
a=ord(s[0])
length=len(s)
length*=0x15B38
length+=a
print(length)
length+=2
print(length)
length*=3
print(length)
length-=2
print(length)
length+=15
print('your serial:%d'%length)
4.ajj
这题是2000年的,介绍如下
没有确定键,一头雾水
无壳,Delphi
在OD里靠字符串定位
然后慢慢往上找跳转和判断语句,爆破还是比较轻松的
结果如下
emmmm,朱茵可还行
接下来分析一下注册机咋弄
之前已经定位过了爆破口,那注册吧的判断也在那块函数体中,翻到最近的push ebp/mov ebp,esp开始分析,如下
这个程序刚开始有个分析可以直接试出来,程序的用户名只能输入12个字符,但注册码长度无限,继续分析
00457FB8 /. 55 push ebp
00457FB9 |. 8BEC mov ebp,esp
00457FBB |. B9 04000000 mov ecx,0x4 ; 循环4次,不知道要干嘛……
00457FC0 |> 6A 00 /push 0x0
00457FC2 |. 6A 00 |push 0x0
00457FC4 |. 49 |dec ecx
00457FC5 |.^ 75 F9 \jnz short CKme.00457FC0
00457FC7 |. 51 push ecx
00457FC8 |. 53 push ebx
00457FC9 |. 56 push esi
00457FCA |. 8BF0 mov esi,eax ; CKme.0045802B
00457FCC |. 33C0 xor eax,eax ; CKme.0045802B
00457FCE |. 55 push ebp
00457FCF |. 68 FD804500 push CKme.004580FD
00457FD4 |. 64:FF30 push dword ptr fs:[eax]
00457FD7 |. 64:8920 mov dword ptr fs:[eax],esp
00457FDA |. 33DB xor ebx,ebx
00457FDC |> 8D55 F4 /lea edx,[local.3]
00457FDF |. 8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
00457FE5 |. E8 5EB3FCFF |call CKme.00423348
00457FEA |. 8B45 F4 |mov eax,[local.3] ; 用户名压入eax
00457FED |. E8 8ABBFAFF |call CKme.00403B7C
00457FF2 |. 83C0 1E |add eax,0x1E
00457FF5 |. 8D55 F8 |lea edx,[local.2]
00457FF8 |. E8 07FBFAFF |call CKme.00407B04
00457FFD |. FF75 F8 |push [local.2] ; 42
00458000 |. 8D55 F0 |lea edx,[local.4]
00458003 |. 8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
00458009 |. E8 3AB3FCFF |call CKme.00423348
0045800E |. FF75 F0 |push [local.4] ; 压入用户名
00458011 |. 8D55 EC |lea edx,[local.5]
00458014 |. 8BC3 |mov eax,ebx
00458016 |. E8 E9FAFAFF |call CKme.00407B04
0045801B |. FF75 EC |push [local.5] ; 0
0045801E |. 8D45 FC |lea eax,[local.1]
00458021 |. BA 03000000 |mov edx,0x3
00458026 |. E8 11BCFAFF |call CKme.00403C3C
0045802B |. 43 |inc ebx ; ebx+=19
0045802C |. 83FB 13 |cmp ebx,0x13
0045802F |.^ 75 AB \jnz short CKme.00457FDC
00458031 |. 81BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x85
0045803B |. 75 76 jnz short CKme.004580B3
一头雾水,不知道要干嘛……看了一下堆栈如下
很神奇,就把字符串拼了一下,最后判断了一下,失败是必然的,这咋注册的……
往上看看,顺便按照别的字符串搜一下,还有一大堆像黑头之类的
这个很值得怀疑,莫名其妙有个字符串叫chkcode,如果是耍我们的,那只能说混淆做得太好了,跟踪一下,地址不清楚的话
dede一下,如下
地址在457C40,跟过去,重新运行程序,断在该处
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]
00457C6C |. 83C6 05 add esi,0x5
00457C6F |. FFB3 10030000 push dword ptr ds:[ebx+0x310] ; 黑头Sun Bird
00457C75 |. 8D55 F8 lea edx,[local.2]
00457C78 |. 8BC6 mov eax,esi
00457C7A |. E8 85FEFAFF call CKme.00407B04
00457C7F |. FF75 F8 push [local.2] ; 17
00457C82 |. FFB3 14030000 push dword ptr ds:[ebx+0x314] ; desloffc-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] ; 调用用户名
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] ; 黑头Sun Bird17dseloffc-012-OKwoaixiaoyuyu
emmmm,最后生成了这么个字符串
执行一下程序,这的确是正确的字符串,除了数字17,彼得都是内存中有的字符串和我们输入的用户名,那我们只要分析出17怎么来的就好了
可以看到前面有一个取字符串长度再加5的操作,17就是这么来的(汉字占两个字符)
keygen
s=input("Input your name(length<=12):")
key1='黑头Sun Bird'
key2=str(len(s)+5)
key3='desloffc-012-OK'
key4=s
print('your serial:%s' %(key1+key2+key3+key4))
6.aLoNg3x.1
打开这个crackme之后,我们无法输入密码,看一下about help
可以说要求是很多了,两个按钮被隐藏就会让logo显现出来
查一下壳,无壳,用dede看一下事件
NomeChange和CodeChange应该就是用户名和注册码输入的事件,可以找到相应的地址,在里面还可以看见窗口信息
可以看见Name的最大长度只能为10
这里可以看见OK按钮是不可按的,控件的事件基本属性都可以直接看到,还是很方便的
对所有控件地址下断点然后在OD里进行调试
这里有个要注意的是,我在程序里刚输入一个字符,就跳转到NomeChange断点处了,说明在输入时就开始判断了,所以自己想要的用户名只能复制黏贴(我是xiaoyuyu,密码:11111)
NomeChange这一段没分析出什么重要的,只知道压入了用户名,但是在442E26这个跳转,会使得OK键的属性无法载入(dede里可以分析出来的),所以我们nop掉,然后继续单步调试,OK键的灰化被我们取消了
然后F9数目密码继续调试,有一个发现就是dede里是有注释的,可以一边调试一边看,所有的注释都指向了这一段要干的事什么,只有一段是没分析出来的,如下
事出反常必有妖,打个断点留着以后分析,先继续调试,在442CB2处有个判断语句,如果不nop,会导致OK键再次灰化
然后在dede的注释中,可以清晰的看到有许多关于OK键的语句,如下
估计都是关于控件属性的,试过之后果然如此啊,有三处,全部都要nop掉判断语句
把这些全部nop之后就可以使得程序的OK键彻底可用了,真的是服了,分析的时候累死,怎么这么多关于控件的,吐槽一下
此时经过这几个nop之后OK键没有被灰化,继续单步执行发现又跳回了判断密码是否正确的函数开始,保存一下吧,一共四个nop
然后对OK键打断点,点击OK键,继续分析,想办法让按钮消失
上来先是一段对与Cancella按钮的判断,我们先试着把和它相关的跳转都nop掉,貌似是对Cancella控件属性的改变,如下
单步向下发现是OnClick按钮不见了,成功了一半,在Cancella控件处打断点,并用同样的方式爆破,然后就OK了,累死我了
keygen:
按照爆破的流程来分析好了……头大,就跟着那个流程走一遍好了,偷个懒,就不分析了,反正最骚的就是,这个程序是根据你输入的注册码来逆推的用户名对不对,最后还要穷举爆破……