前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CrackMe破解之Delphi

CrackMe破解之Delphi

作者头像
安恒网络空间安全讲武堂
发布2018-08-17 17:47:29
1.7K0
发布2018-08-17 17:47:29
举报

刚开始学逆向,先学了OD的使用,学了个大概之后就开始了实践,边学习边实践,破解一些crackme,因为是刚开始入门,所以有些算法还是不理解,无法逆向出算法,但是爆破,去nag是没问题的,这里有个crackme,试着破解并逆向它的算法。

这是个crackme程序,程序详细信息以及运行情况如下:

是个Delphi写的程序,无壳,程序要求把"OK"和"Cancella"按钮隐藏掉,以便看到 logo; 因为这是Delphi写的程序,所以用专业Delphi反编译工具Dark分析一下

以上代码先检查Cancella按钮是否隐藏,如果是就将ok按钮激活,否则检查用户名和密码是否匹配,匹配就激活按钮,否则禁用,关键call的代码如下:

00442E04  /.  55            push ebp               ;  用户名改变函数 
00442E05  |.  8BEC          mov ebp,esp                              
00442E07  |.  6A 00         push 0x0                                 
00442E09  |.  6A 00         push 0x0
00442E0B  |.  53            push ebx
00442E0C  |.  8BD8          mov ebx,eax
00442E0E  |.  33C0          xor eax,eax
00442E10  |.  55            push ebp
00442E11  |.  68 9B2E4400   push aLoNg3x_.00442E9B
00442E16  |.  64:FF30       push dword ptr fs:[eax]
00442E19  |.  64:8920       mov dword ptr fs:[eax],esp
00442E1C  |.  8B83 D0020000 mov eax,dword ptr ds:[ebx+0x2D0]
00442E22  |.  8078 47 00    cmp byte ptr ds:[eax+0x47],0x0  ;右边按钮是否隐藏,0为隐                                                       
00442E26  |.  75 0F         jnz short aLoNg3x_.00442E37
00442E28  |.  B2 01         mov dl,0x1
00442E2A  |.  8B83 CC020000 mov eax,dword ptr ds:[ebx+0x2CC]         ;  ok按钮的ID
00442E30  |.  8B08          mov ecx,dword ptr ds:[eax]               
00442E32  |.  FF51 60       call dword ptr ds:[ecx+0x60]    ;激活按钮
00442E35  |.  EB 49         jmp short aLoNg3x_.00442E80  ;若隐藏了,直接激活左边按钮
00442E37  |>  8D55 FC       lea edx,[local.1]
00442E3A  |.  8B83 E0020000 mov eax,dword ptr ds:[ebx+0x2E0]
00442E40  |.  E8 7B04FEFF   call aLoNg3x_.004232C0
00442E45  |.  8B45 FC       mov eax,[local.1]
00442E48  |.  50            push eax
00442E49  |.  8D55 F8       lea edx,[local.2]
00442E4C  |.  8B83 DC020000 mov eax,dword ptr ds:[ebx+0x2DC]
00442E52  |.  E8 6904FEFF   call aLoNg3x_.004232C0
00442E57  |.  8B45 F8       mov eax,[local.2]       ;  输入的用户名
00442E5A  |.  5A            pop edx                                
00442E5B  |.  E8 DCFBFFFF   call aLoNg3x_.00442A3C;用户名密码匹配比较
00442E60  |.  84C0          test al,al
00442E62  |.  74 0F         je short aLoNg3x_.00442E73   ;匹配就激活
00442E64  |.  B2 01         mov dl,0x1
00442E66  |.  8B83 CC020000 mov eax,dword ptr ds:[ebx+0x2CC]
00442E6C  |.  8B08          mov ecx,dword ptr ds:[eax]               
00442E6E  |.  FF51 60       call dword ptr ds:[ecx+0x60]    ;激活按钮
00442E71  |.  EB 0D         jmp short aLoNg3x_.00442E80
00442E73  |>  33D2          xor edx,edx
00442E75  |.  8B83 CC020000 mov eax,dword ptr ds:[ebx+0x2CC]         ;  按钮ID
00442E7B  |.  8B08          mov ecx,dword ptr ds:[eax]               
00442E7D  |.  FF51 60       call dword ptr ds:[ecx+0x60]    ;禁用按钮
00442E80  |>  33C0          xor eax,eax
00442E82  |.  5A            pop edx                                 
00442E83  |.  59            pop ecx                                
00442E84  |.  59            pop ecx                                 
00442E85  |.  64:8910       mov dword ptr fs:[eax],edx
00442E88  |.  68 A22E4400   push aLoNg3x_.00442EA2
00442E8D  |>  8D45 F8       lea eax,[local.2]
00442E90  |.  BA 02000000   mov edx,0x2
00442E95  |.  E8 4209FCFF   call aLoNg3x_.004037DC
00442E9A  \.  C3            retn
00442E9B   .^ E9 D803FCFF   jmp aLoNg3x_.00403278
00442EA0   .^ EB EB         jmp short aLoNg3x_.00442E8D
00442EA2   .  5B            pop ebx                                  
00442EA3   .  59            pop ecx                                  
00442EA4   .  59            pop ecx                                  
00442EA5   .  5D            pop ebp                                  
00442EA6   .  C3            retn

用户名的长度要大于5,然后根据下面的一套规则计算出一个值保存在ebx中,然后ebx-密码=0x29A就可以激活ok按钮。

接下来看右边的按钮单击事件,代码如下:

00442A3C  /$  55            push ebp                      关键call 
00442A3D  |.  8BEC          mov ebp,esp
00442A3F  |.  83C4 F8       add esp,-0x8
00442A42  |.  53            push ebx
00442A43  |.  56            push esi
00442A44  |.  8955 F8       mov [local.2],edx
00442A47  |.  8945 FC       mov [local.1],eax
00442A4A  |.  8B45 FC       mov eax,[local.1]
00442A4D  |.  E8 9611FCFF   call aLoNg3x_.00403BE8
00442A52  |.  8B45 F8       mov eax,[local.2]               ;  密码
00442A55  |.  E8 8E11FCFF   call aLoNg3x_.00403BE8
00442A5A  |.  33C0          xor eax,eax
00442A5C  |.  55            push ebp
00442A5D  |.  68 E52A4400   push aLoNg3x_.00442AE5
00442A62  |.  64:FF30       push dword ptr fs:[eax]
00442A65  |.  64:8920       mov dword ptr fs:[eax],esp
00442A68  |.  8B45 FC       mov eax,[local.1]           ;  用户名
00442A6B  |.  E8 C40FFCFF   call aLoNg3x_.00403A34     ;  用户名长度
00442A70  |.  83F8 05       cmp eax,0x5                ;  要大于5
00442A73  |.  7E 53         jle short aLoNg3x_.00442AC8
00442A75  |.  8B45 FC       mov eax,[local.1]              ;  用户名
00442A78  |.  E8 B70FFCFF   call aLoNg3x_.00403A34         ;  长度
00442A7D  |.  8BD8          mov ebx,eax                     
00442A7F  |.  8B45 FC       mov eax,[local.1]             ;  用户名
00442A82  |.  E8 AD0FFCFF   call aLoNg3x_.00403A34          
00442A87  |.  8BD0          mov edx,eax                              
00442A89  |.  4A            dec edx
00442A8A  |.  85D2          test edx,edx             ;  长度大于1
00442A8C  |.  7E 20         jle short aLoNg3x_.00442AAE
00442A8E  |.  B8 01000000   mov eax,0x1                    
00442A93  |>  8B4D FC       /mov ecx,[local.1]                       
00442A96  |.  0FB64C01 FF   |movzx ecx,byte ptr ds:[ecx+eax-0x1]
00442A9B  |.  8B75 FC       |mov esi,[local.1]         ;  用户名
00442A9E  |.  0FB63406      |movzx esi,byte ptr ds:[esi+eax]
00442AA2  |.  0FAFCE        |imul ecx,esi
00442AA5  |.  0FAFC8        |imul ecx,eax
00442AA8  |.  03D9          |add ebx,ecx          ;  user32.767A78F4
00442AAA  |.  40            |inc eax
00442AAB  |.  4A            |dec edx
00442AAC  |.^ 75 E5         \jnz short aLoNg3x_.00442A93
00442AAE  |>  8B45 F8       mov eax,[local.2]         ;  密码
00442AB1  |.  E8 BA4BFCFF   call aLoNg3x_.00407670    密码转十六进制
00442AB6  |.  2BD8          sub ebx,eax
00442AB8  |.  81FB 9A020000 cmp ebx,0x29A                            
00442ABE  |.  75 04         jnz short aLoNg3x_.00442AC4
00442AC0  |.  B3 01         mov bl,0x1
00442AC2  |.  EB 06         jmp short aLoNg3x_.00442ACA              
00442AC4  |>  33DB          xor ebx,ebx                              
00442AC6  |.  EB 02         jmp short aLoNg3x_.00442ACA
00442AC8  |>  33DB          xor ebx,ebx                              
00442ACA  |>  33C0          xor eax,eax
00442ACC  |.  5A            pop edx                                  
00442ACD  |.  59            pop ecx                                  
00442ACE  |.  59            pop ecx                                  
00442ACF  |.  64:8910       mov dword ptr fs:[eax],edx
00442AD2  |.  68 EC2A4400   push aLoNg3x_.00442AEC
00442AD7  |>  8D45 F8       lea eax,[local.2]
00442ADA  |.  BA 02000000   mov edx,0x2
00442ADF  |.  E8 F80CFCFF   call aLoNg3x_.004037DC
00442AE4  \.  C3            retn
00442AE5   .^ E9 8E07FCFF   jmp aLoNg3x_.00403278
00442AEA   .^ EB EB         jmp short aLoNg3x_.00442AD7
00442AEC   .  8BC3          mov eax,ebx            ebx不为0
00442AEE   .  5E            pop esi                                  
00442AEF   .  5B            pop ebx                                  
00442AF0   .  59            pop ecx                                  
00442AF1   .  59            pop ecx                                  
00442AF2   .  5D            pop ebp                                  
00442AF3   .  C3            retn

以下代码检查用户名与密码是否满足条件,如果满足就隐藏Cencela按钮并且激活OK按钮;

00442AF4  /$  55            push ebp                                 
00442AF5  |.  8BEC          mov ebp,esp
00442AF7  |.  83C4 F8       add esp,-0x8
00442AFA  |.  53            push ebx
00442AFB  |.  56            push esi
00442AFC  |.  8955 F8       mov [local.2],edx
00442AFF  |.  8945 FC       mov [local.1],eax
00442B02  |.  8B45 FC       mov eax,[local.1]
00442B05  |.  E8 DE10FCFF   call aLoNg3x_.00403BE8
00442B0A  |.  33C0          xor eax,eax
00442B0C  |.  55            push ebp
00442B0D  |.  68 902B4400   push aLoNg3x_.00442B90
00442B12  |.  64:FF30       push dword ptr fs:[eax]
00442B15  |.  64:8920       mov dword ptr fs:[eax],esp
00442B18  |.  8B45 FC       mov eax,[local.1]
00442B1B  |.  E8 140FFCFF   call aLoNg3x_.00403A34        ;用户名长度
00442B20  |.  83F8 05       cmp eax,0x5           ;用户名长度要大于5
00442B23  |.  7E 53         jle short aLoNg3x_.00442B78
00442B25  |.  8B45 FC       mov eax,[local.1]
00442B28  |.  0FB640 04     movzx eax,byte ptr ds:[eax+0x4]  ;用户名第五个字符串ASCII码
00442B2C  |.  B9 07000000   mov ecx,0x7                  ;  ecx=7
00442B31  |.  33D2          xor edx,edx
00442B33  |.  F7F1          div ecx                 ;eax =eax /ecx
00442B35  |.  8BC2          mov eax,edx
00442B37  |.  83C0 02       add eax,0x2
00442B3A  |.  E8 E1FEFFFF   call aLoNg3x_.00442A20
00442B3F  |.  8BF0          mov esi,eax
00442B41  |.  33DB          xor ebx,ebx
00442B43  |.  8B45 FC       mov eax,[local.1]                        
00442B46  |.  E8 E90EFCFF   call aLoNg3x_.00403A34                   
00442B4B  |.  85C0          test eax,eax
00442B4D  |.  7E 16         jle short aLoNg3x_.00442B65
00442B4F  |.  BA 01000000   mov edx,0x1
00442B54  |>  8B4D FC       /mov ecx,[local.1]
00442B57  |.  0FB64C11 FF   |movzx ecx,byte ptr ds:[ecx+edx-0x1]
00442B5C  |.  0FAFCE        |imul ecx,esi
00442B5F  |.  03D9          |add ebx,ecx                             
00442B61  |.  42            |inc edx
00442B62  |.  48            |dec eax
00442B63  |.^ 75 EF         \jnz short aLoNg3x_.00442B54
00442B65  |>  2B5D F8       sub ebx,[local.2]             ;ebx-密码
00442B68  |.  81FB 697A0000 cmp ebx,0x7A69                           
00442B6E  |.  75 04         jnz short aLoNg3x_.00442B74              
00442B70  |.  B3 01         mov bl,0x1
00442B72  |.  EB 06         jmp short aLoNg3x_.00442B7A
00442B74  |>  33DB          xor ebx,ebx
00442B76  |.  EB 02         jmp short aLoNg3x_.00442B7A
00442B78  |>  33DB          xor ebx,ebx
00442B7A  |>  33C0          xor eax,eax
00442B7C  |.  5A            pop edx                                  
00442B7D  |.  59            pop ecx                                  
00442B7E  |.  59            pop ecx                                  
00442B7F  |.  64:8910       mov dword ptr fs:[eax],edx
00442B82  |.  68 972B4400   push aLoNg3x_.00442B97
00442B87  |>  8D45 FC       lea eax,[local.1]
00442B8A  |.  E8 290CFCFF   call aLoNg3x_.004037B8
00442B8F  \.  C3            retn
00442B90   .^ E9 E306FCFF   jmp aLoNg3x_.00403278
00442B95   .^ EB F0         jmp short aLoNg3x_.00442B87
00442B97   .  8BC3          mov eax,ebx
00442B99   .  5E            pop esi                                  
00442B9A   .  5B            pop ebx                                  
00442B9B   .  59            pop ecx                                  
00442B9C   .  59            pop ecx                                  
00442B9D   .  5D            pop ebp                                  
00442B9E   .  C3            retn

将ebx与密码作差看是否等于0x7A69,如果是就可以实现右侧按钮单击时隐藏了,如下:

下一步隐藏"OK"按钮就可以了,检查条件的关键CALL如下:

00442BA0  /$  55            push ebp                               
00442BA1  |.  8BEC          mov ebp,esp
00442BA3  |.  6A 00         push 0x0
00442BA5  |.  6A 00         push 0x0
00442BA7  |.  6A 00         push 0x0
00442BA9  |.  53            push ebx
00442BAA  |.  56            push esi
00442BAB  |.  8BF2          mov esi,edx
00442BAD  |.  8945 FC       mov [local.1],eax
00442BB0  |.  8B45 FC       mov eax,[local.1]
00442BB3  |.  E8 3010FCFF   call aLoNg3x_.00403BE8
00442BB8  |.  33C0          xor eax,eax
00442BBA  |.  55            push ebp
00442BBB  |.  68 672C4400   push aLoNg3x_.00442C67
00442BC0  |.  64:FF30       push dword ptr fs:[eax]
00442BC3  |.  64:8920       mov dword ptr fs:[eax],esp
00442BC6  |.  33DB          xor ebx,ebx
00442BC8  |.  8D55 F8       lea edx,[local.2]
00442BCB  |.  8BC6          mov eax,esi
00442BCD  |.  E8 6E4AFCFF   call aLoNg3x_.00407640
00442BD2  |.  8D45 F4       lea eax,[local.3]
00442BD5  |.  8B55 F8       mov edx,[local.2]                 ;密码
00442BD8  |.  E8 730CFCFF   call aLoNg3x_.00403850
00442BDD  |.  8B45 F8       mov eax,[local.2]                        
00442BE0  |.  E8 4F0EFCFF   call aLoNg3x_.00403A34         ;密码长度
00442BE5  |.  83F8 05       cmp eax,0x5
00442BE8  |.  7E 60         jle short aLoNg3x_.00442C4A       不能跳
00442BEA  |.  8B45 F8       mov eax,[local.2]
00442BED  |.  E8 420EFCFF   call aLoNg3x_.00403A34
00442BF2  |.  8BF0          mov esi,eax
00442BF4  |.  83FE 01       cmp esi,0x1
00442BF7  |.  7C 2F         jl short aLoNg3x_.00442C28
00442BF9  |>  8D45 F4       /lea eax,[local.3]
00442BFC  |.  E8 0310FCFF   |call aLoNg3x_.00403C04
00442C01  |.  8D4430 FF     |lea eax,dword ptr ds:[eax+esi-0x1]
00442C05  |.  50            |push eax
00442C06  |.  8B45 F8       |mov eax,[local.2]
00442C09  |.  0FB64430 FF   |movzx eax,byte ptr ds:[eax+esi-0x1]
00442C0E  |.  F7E8          |imul eax
00442C10  |.  0FBFC0        |movsx eax,ax
00442C13  |.  F7EE          |imul esi
00442C15  |.  B9 19000000   |mov ecx,0x19
00442C1A  |.  99            |cdq
00442C1B  |.  F7F9          |idiv ecx
00442C1D  |.  83C2 41       |add edx,0x41
00442C20  |.  58            |pop eax
00442C21  |.  8810          |mov byte ptr ds:[eax],dl
00442C23  |.  4E            |dec esi
00442C24  |.  85F6          |test esi,esi
00442C26  |.^ 75 D1         \jnz short aLoNg3x_.00442BF9
00442C28  |>  8B45 F4       mov eax,[local.3]           可变字符串
00442C2B  |.  8B55 FC       mov edx,[local.1]                 用户名
00442C2E  |.  E8 110FFCFF   call aLoNg3x_.00403B44
00442C33  |.  75 17         jnz short aLoNg3x_.00442C4C
00442C35  |.  8B45 FC       mov eax,[local.1]
00442C38  |.  8B55 F4       mov edx,[local.3]
00442C3B  |.  E8 040FFCFF   call aLoNg3x_.00403B44         关键call
00442C40  |.  75 04         jnz short aLoNg3x_.00442C46              
00442C42  |.  B3 01         mov bl,0x1
00442C44  |.  EB 06         jmp short aLoNg3x_.00442C4C              
00442C46  |>  33DB          xor ebx,ebx
00442C48  |.  EB 02         jmp short aLoNg3x_.00442C4C
00442C4A  |>  33DB          xor ebx,ebx
00442C4C  |>  33C0          xor eax,eax
00442C4E  |.  5A            pop edx
00442C4F  |.  59            pop ecx
00442C50  |.  59            pop ecx
00442C51  |.  64:8910       mov dword ptr fs:[eax],edx
00442C54  |.  68 6E2C4400   push aLoNg3x_.00442C6E
00442C59  |>  8D45 F4       lea eax,[local.3]
00442C5C  |.  BA 03000000   mov edx,0x3
00442C61  |.  E8 760BFCFF   call aLoNg3x_.004037DC
00442C66  \.  C3            retn
00442C67   .^ E9 0C06FCFF   jmp aLoNg3x_.00403278
00442C6C   .^ EB EB         jmp short aLoNg3x_.00442C59
00442C6E   .  8BC3          mov eax,ebx
00442C70   .  5E            pop esi
00442C71   .  5B            pop ebx
00442C72   .  8BE5          mov esp,ebp
00442C74   .  5D            pop ebp
00442C75   .  C3            retn

从这个代码里可以看到,在后面有一个和某个字符串对比的call,如果用户名是这个字符串就可以通过了,而这个字符串是上面的循环中根据密码字符串计算得到,因此只要输入的用户名和密码对应就可以了。

到此程序破解完毕,虽然成功了,但是有些地方还是模糊,不能很流畅的去分析程序,需要多接触一些算法,多做题,多实践

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 恒星EDU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档