160个crackme 持续更新(1\2\3\4\6)

最近感觉自己啥都不会吧,就算会也就是点皮毛,还是练的太少了,从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:

按照爆破的流程来分析好了……头大,就跟着那个流程走一遍好了,偷个懒,就不分析了,反正最骚的就是,这个程序是根据你输入的注册码来逆推的用户名对不对,最后还要穷举爆破……

猜你喜欢

转载自blog.csdn.net/qq_42192672/article/details/84201180