新CrackMe160之109 - Jony - crackme

Delphi的程序,Dos界面,IDR查看源码:

 EntryPoint
 004084B8    push       ebp
 004084B9    mov        ebp,esp
 004084BB    add        esp,0FFFFFFE0
 004084BE    push       ebx
 004084BF    xor        eax,eax
 004084C1    mov        dword ptr [ebp-14],eax
 004084C4    mov        dword ptr [ebp-20],eax
 004084C7    mov        eax,[004093B0]; ^IsConsole:Boolean
 004084CC    mov        byte ptr [eax],1
 004084CF    mov        eax,408478
 004084D4    call       @InitExe
 004084D9    mov        ebx,dword ptr ds:[409304]; ^Output:Text
 004084DF    xor        eax,eax
 004084E1    push       ebp
 004084E2    push       4086CF
 004084E7    push       dword ptr fs:[eax]
 004084EA    mov        dword ptr fs:[eax],esp
 004084ED    mov        eax,ebx
 004084EF    mov        edx,4086E4; '---------------------------'
 004084F4    call       @Write0Bool
 004084F9    call       @WriteLn
 004084FE    call       @_IOTest
 00408503    mov        eax,ebx
 00408505    mov        edx,408708; '  俺的第一个CrackMe'
 0040850A    call       @Write0Bool
 0040850F    call       @WriteLn
 00408514    call       @_IOTest
 00408519    mov        eax,ebx
 0040851B    mov        edx,408724; '  作者:Jony[E.S.T]'
 00408520    call       @Write0Bool
 00408525    call       @WriteLn
 0040852A    call       @_IOTest
 0040852F    mov        eax,ebx
 00408531    mov        edx,408740; '  示例:user/123'
 00408536    call       @Write0Bool
 0040853B    call       @WriteLn
 00408540    call       @_IOTest
 00408545    mov        eax,ebx
 00408547    mov        edx,4086E4; '---------------------------'
 0040854C    call       @Write0Bool
 00408551    call       @WriteLn
 00408556    call       @_IOTest
 0040855B    mov        eax,ebx
 0040855D    mov        edx,40875C; '请输入您的用户名:'
 00408562    call       @Write0Bool
 00408567    call       @WriteLn
 0040856C    call       @_IOTest
 00408571    mov        edx,40A798; gvar_0040A798:AnsiString
 00408576    mov        eax,[00409370]; ^Input:Text
 0040857B    call       @ReadLString
 00408580    mov        eax,[00409370]; ^Input:Text
 00408585    call       @ReadLn
 0040858A    call       @_IOTest
 0040858F    mov        eax,[0040A798]; gvar_0040A798:AnsiString
 00408594    call       @LStrLen
 00408599    cmp        eax,2
>0040859C    jge        004085D7
 0040859E    mov        eax,ebx
 004085A0    mov        edx,408778; '用户名不能少于两位!'
 004085A5    call       @Write0Bool
 004085AA    call       @WriteLn
 004085AF    call       @_IOTest
 004085B4    mov        edx,40A798; gvar_0040A798:AnsiString
 004085B9    mov        eax,[00409370]; ^Input:Text
 004085BE    call       @ReadLString
 004085C3    mov        eax,[00409370]; ^Input:Text
 004085C8    call       @ReadLn
 004085CD    call       @_IOTest
>004085D2    jmp        004086B1
 004085D7    mov        eax,ebx
 004085D9    mov        edx,408798; '请输入您的注册码:'
 004085DE    call       @Write0Bool
 004085E3    call       @WriteLn
 004085E8    call       @_IOTest
 004085ED    mov        edx,40A79C; gvar_0040A79C:AnsiString
 004085F2    mov        eax,[00409370]; ^Input:Text
 004085F7    call       @ReadLString
 004085FC    mov        eax,[00409370]; ^Input:Text
 00408601    call       @ReadLn
 00408606    call       @_IOTest
 0040860B    lea        eax,[ebp-14]
 0040860E    push       eax
 0040860F    lea        edx,[ebp-20]
 00408612    mov        eax,[0040A798]; gvar_0040A798:AnsiString
 00408617    call       00408388                                  ; 关键算法
 0040861C    mov        eax,dword ptr [ebp-20]
 0040861F    movzx      eax,byte ptr [eax]
 00408622    mov        dword ptr [ebp-1C],eax
 00408625    mov        byte ptr [ebp-18],0
 00408629    lea        edx,[ebp-1C]
 0040862C    xor        ecx,ecx
 0040862E    mov        eax,4087B4; '%d'                          ; 结果转数字
 00408633    call       Format
 00408638    mov        edx,dword ptr [ebp-14]
 0040863B    mov        eax,[0040A79C]; gvar_0040A79C:AnsiString
 00408640    call       @LStrCmp                                  ; 关键对比
>00408645    jne        0040867D
 00408647    mov        eax,ebx
 00408649    mov        edx,4087C0; '恭喜您,注册成功!'
 0040864E    call       @Write0Bool
 00408653    call       @WriteLn
 00408658    call       @_IOTest
 0040865D    mov        edx,40A7A0; gvar_0040A7A0:AnsiString
 00408662    mov        eax,[00409370]; ^Input:Text
 00408667    call       @ReadLString
 0040866C    mov        eax,[00409370]; ^Input:Text
 00408671    call       @ReadLn
 00408676    call       @_IOTest
>0040867B    jmp        004086B1
 0040867D    mov        eax,ebx
 0040867F    mov        edx,4087DC; '继续努力!'
 00408684    call       @Write0Bool
 00408689    call       @WriteLn
 0040868E    call       @_IOTest
 00408693    mov        edx,40A798; gvar_0040A798:AnsiString
 00408698    mov        eax,[00409370]; ^Input:Text
 0040869D    call       @ReadLString
 004086A2    mov        eax,[00409370]; ^Input:Text
 004086A7    call       @ReadLn
 004086AC    call       @_IOTest
 004086B1    xor        eax,eax
 004086B3    pop        edx
 004086B4    pop        ecx
 004086B5    pop        ecx
 004086B6    mov        dword ptr fs:[eax],edx
 004086B9    push       4086D6
 004086BE    lea        eax,[ebp-20]
 004086C1    call       @LStrClr
 004086C6    lea        eax,[ebp-14]
 004086C9    call       @LStrClr
 004086CE    ret
<004086CF    jmp        @HandleFinally
<004086D4    jmp        004086BE
 004086D6    pop        ebx
 004086D7    call       @Halt0

关键算法:

 CrackMe::sub_00408388
 00408388    push       ebp
 00408389    mov        ebp,esp
 0040838B    add        esp,0FFFFFFF4
 0040838E    push       ebx
 0040838F    push       esi
 00408390    push       edi
 00408391    xor        ecx,ecx
 00408393    mov        dword ptr [ebp-0C],ecx
 00408396    mov        dword ptr [ebp-8],edx
 00408399    mov        dword ptr [ebp-4],eax
 0040839C    mov        eax,dword ptr [ebp-4]
 0040839F    call       @LStrAddRef
 004083A4    xor        eax,eax
 004083A6    push       ebp
 004083A7    push       408441
 004083AC    push       dword ptr fs:[eax]
 004083AF    mov        dword ptr fs:[eax],esp
 004083B2    mov        eax,dword ptr [ebp-4]
 004083B5    call       @LStrToPChar
 004083BA    call       StrLen
 004083BF    mov        ebx,eax
 004083C1    shr        ebx,1
 004083C3    dec        ebx
 004083C4    mov        eax,dword ptr [ebp-8]
 004083C7    call       @LStrClr
 004083CC    mov        edi,ebx
 004083CE    test       edi,edi
>004083D0    jl         00408423
 004083D2    inc        edi
 004083D3    xor        esi,esi
 004083D5    mov        eax,dword ptr [ebp-4]
 004083D8    call       @LStrToPChar
 004083DD    mov        edx,esi
 004083DF    xor        edx,2
 004083E2    mov        bl,byte ptr [eax+edx]   ; 取第3位
 004083E5    mov        eax,dword ptr [ebp-4]
 004083E8    call       @LStrToPChar
 004083ED    mov        edx,esi
 004083EF    xor        edx,2
 004083F2    mov        al,byte ptr [eax+edx-1] ; 取第2位
 004083F6    or         bl,al
 004083F8    mov        eax,dword ptr [ebp-4]
 004083FB    call       @LStrToPChar
 00408400    call       StrLen                  ; 取长度
 00408405    add        bl,al                   ; 结果 = (第3位 or 第2位) + len, 再转10进制
 00408407    lea        eax,[ebp-0C]
 0040840A    mov        edx,ebx
 0040840C    call       @LStrFromChar
 00408411    mov        edx,dword ptr [ebp-0C]
 00408414    mov        eax,dword ptr [ebp-8]
 00408417    call       @LStrCat
 0040841C    mov        eax,dword ptr [ebp-8]
 0040841F    inc        esi
 00408420    dec        edi
<00408421    jne        004083D5
 00408423    xor        eax,eax
 00408425    pop        edx
 00408426    pop        ecx
 00408427    pop        ecx
 00408428    mov        dword ptr fs:[eax],edx
 0040842B    push       408448
 00408430    lea        eax,[ebp-0C]
 00408433    call       @LStrClr
 00408438    lea        eax,[ebp-4]
 0040843B    call       @LStrClr
 00408440    ret
<00408441    jmp        @HandleFinally
<00408446    jmp        00408430
 00408448    pop        edi
 00408449    pop        esi
 0040844A    pop        ebx
 0040844B    mov        esp,ebp
 0040844D    pop        ebp
 0040844E    ret

所以用户名最少要3位, 算法中可知,只会用到第2,3位,与及用户名长度

#include <stdio.h>
#include <string.h>

int main() {
	char user[15] = {0};
	printf("用户名: ");
	scanf("%s", user); getchar(); //消耗掉多输入的\n 
	int i,len = strlen(user), sum = 0;
	if(len<3){
		printf("用户名3位以上");
		getchar(); return; 
	}
	sum = (user[2] | user[1]) + len;
	printf("系列号: %d\n", sum);
	getchar(); return 0;
}

运行示例:
用户名: CrackMe
系列号: 122

 
 
本节高手录制的视频,点击前往查看

 
 
 
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载

下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~
OD界面布局

posted @ 2024-12-30 14:32  hankerstudio  阅读(9)  评论(0)    收藏  举报