这个是多次尝试得到的表然后对应破解的,
对汇编不太熟悉,下面的理解可能有误,希望大神指出
打开提示输入序列号,尝试几次后发现
输入长度大于17 时程序直接退出
开始分析
拖入IDA中
打开后,找到main函数
可以看到刚才程序里的please input那些
这是自己的一些理解,最后还是要靠动态调试出来的
.text:00401009 push ebp
.text:0040100A push esi
.text:0040100B push edi
.text:0040100C mov esi, offset a437261636b4d65 ; "437261636b4d654a757374466f7246756e"
.text:00401011 lea edi, [esp+70h+var_24]
.text:00401015 rep movsd
.text:00401017 movsw
.text:00401019 movsb
.text:0040101A
.text:0040101A loc_40101A: ; CODE XREF: _main+F6j
.text:0040101A ; _main+108j
.text:0040101A mov ecx, 8
.text:0040101F xor eax, eax
.text:00401021 lea edi, [esp+70h+var_48]
.text:00401025 push offset aPleaseInputYou ; "please input your serial:"
.text:0040102A rep stosd
.text:0040102C stosw
.text:0040102E stosb
.text:0040102F call sub_40134B
.text:00401034 lea eax, [esp+74h+var_5C]
.text:00401038 push eax
.text:00401039 push offset aS ; "%s"
.text:0040103E call _scanf
.text:00401043 lea edi, [esp+7Ch+var_5C]
.text:00401047 or ecx, 0FFFFFFFFh
.text:0040104A xor eax, eax
.text:0040104C add esp, 0Ch
.text:0040104F repne scasb
.text:00401051 not ecx
.text:00401053 dec ecx
.text:00401054 cmp ecx, 11h ; 11h,就是hex值为11,对应10进制为17,就是输入时的那个
.text:00401057 ja loc_40110D ; jump if above,如果ecx大于17就跳转到loc_xxx那个位置
.text:0040105D xor ebx, ebx
.text:0040105F
.text:0040105F loc_40105F: ; CODE XREF: _main+AEj
.text:0040105F mov al, [esp+ebx+70h+var_5C] ; 这里应该就是计算的算法,不过这里不会分析。。。。,不过还是按照自己理解注释一下
.text:00401063 test al, al ; 上面这个mov al,[esp+ebs+70h+var_5C]就是取出输入字符的第几个字符,那个ebx的值一开始是0,之后会循环一次就+1
.text:00401065 jz short loc_4010B0 ; 上面那个tset判断获取到的字符是否到了尾巴,jz结果为零时,就到下面那个地址
.text:00401067 movsx ecx, al ; :带符号扩展传送指令,al就是刚才的字符,就是付给ecx,然后下面push吧
.text:0040106A push ecx ; 第一个参数?
.text:0040106B lea edx, [esp+74h+var_5E]
.text:0040106F push offset asc_408044 ; 第一个参数 %x
.text:00401074 push edx ; char *,ida自动提示是char*了,这个最后的push应该就是第一个参数
.text:00401075 call _sprintf ; 调用sprintf参数,我们知道sprintf是sprintf(char*,格式,参数,所以怀疑push是一个个参数
.text:0040107A lea edi, [esp+7Ch+var_5E]
.text:0040107E or ecx, 0FFFFFFFFh
.text:00401081 xor eax, eax
.text:00401083 add esp, 0Ch
.text:00401086 repne scasb
.text:00401088 not ecx
.text:0040108A sub edi, ecx
.text:0040108C lea edx, [esp+70h+var_48]
.text:00401090 mov esi, edi
.text:00401092 mov ebp, ecx
.text:00401094 mov edi, edx
.text:00401096 or ecx, 0FFFFFFFFh
.text:00401099 repne scasb
.text:0040109B mov ecx, ebp
.text:0040109D dec edi
.text:0040109E shr ecx, 2
.text:004010A1 rep movsd
.text:004010A3 mov ecx, ebp
.text:004010A5 and ecx, 3
.text:004010A8 inc ebx
.text:004010A9 cmp ebx, 11h ; 这里还有个判断,应该是作为循环条件的
.text:004010AC rep movsb
.text:004010AE jl short loc_40105F ; jump less, ebs小于17时就跳到上面,达到循环的效果
.text:004010B0
.text:004010B0 loc_4010B0: ; CODE XREF: _main+65j
.text:004010B0 lea esi, [esp+70h+var_24] ; 这里又是一段,这两句lea是处理后的,下面对比用的
.text:004010B4 lea eax, [esp+70h+var_48]
.text:004010B8
.text:004010B8 loc_4010B8: ; CODE XREF: _main+DAj
.text:004010B8 mov dl, [eax]
.text:004010BA mov bl, [esi]
.text:004010BC mov cl, dl
.text:004010BE cmp dl, bl
.text:004010C0 jnz short loc_4010E0
.text:004010C2 test cl, cl
.text:004010C4 jz short loc_4010DC
.text:004010C6 mov dl, [eax+1]
.text:004010C9 mov bl, [esi+1]
.text:004010CC mov cl, dl
.text:004010CE cmp dl, bl
.text:004010D0 jnz short loc_4010E0
.text:004010D2 add eax, 2
.text:004010D5 add esi, 2
.text:004010D8 test cl, cl
.text:004010DA jnz short loc_4010B8
.text:004010DC
.text:004010DC loc_4010DC: ; CODE XREF: _main+C4j
.text:004010DC xor eax, eax
.text:004010DE jmp short loc_4010E5
.text:004010E0 ; ---------------------------------------------------------------------------
.text:004010E0
调试开始,点Debugger,然后选择win32平台那个
调试窗口
在几个可疑的地方断点(上面那个循环也断了)
乱输入注册码,看看
17个1
可以在General register窗口里看到寄存器的值,循环那个断点对应循环了17次
到断点时,
循环时的
那个作为edx的第一个参数,在那对应的是RDX寄存器鼠标放上去可以看到值,或者双击进入
判断之后的代码
.text:004010B8 loc_4010B8: ; CODE XREF: _main+DAj
.text:004010B8 mov dl, [eax]
.text:004010BA mov bl, [esi]
.text:004010BC mov cl, dl
.text:004010BE cmp dl, bl
.text:004010C0 jnz short loc_4010E0
.text:004010C2 test cl, cl
.text:004010C4 jz short loc_4010DC
.text:004010C6 mov dl, [eax+1]
.text:004010C9 mov bl, [esi+1]
.text:004010CC mov cl, dl
.text:004010CE cmp dl, bl
.text:004010D0 jnz short loc_4010E0
.text:004010D2 add eax, 2
.text:004010D5 add esi, 2
.text:004010D8 test cl, cl
.text:004010DA jnz short loc_4010B8
.text:004010DC
.text:004010DC loc_4010DC: ; CODE XREF: _main+C4j
.text:004010DC xor eax, eax
.text:004010DE jmp short loc_4010E5
.text:004010E0 ; ---------------------------------------------------------------------------
.text:004010E0
.text:004010E0 loc_4010E0: ; CODE XREF: _main+C0j
.text:004010E0 ; _main+D0j
.text:004010E0 sbb eax, eax
.text:004010E2 sbb eax, 0FFFFFFFFh
.text:004010E5
.text:004010E5 loc_4010E5: ; CODE XREF: _main+DEj
.text:004010E5 test eax, eax ; 想要test的结果是0,那么eax就要是0
.text:004010E7 jnz short loc_4010FB ; jump no zero 当上面的test结果是0时就输出成功
.text:004010E9 push offset aSuccess ; 这里是成功时的
.text:004010EE call sub_40134B
.text:004010F3 add esp, 4
.text:004010F6 jmp loc_40101A
.text:004010FB ; ---------------------------------------------------------------------------
.text:004010FB
.text:004010FB loc_4010FB: ; CODE XREF: _main+E7j
.text:004010FB push offset aWrong ; "wrong!\n"
.text:00401100 call sub_40134B
.text:00401105 add esp, 4
.text:00401108 jmp loc_40101A
.text:0040110D ; ---------------------------------------------------------------------------
.text:0040110D
.text:0040110D loc_40110D: ; CODE XREF: _main+57j
.text:0040110D push offset aWrong ; "wrong!\n"
.text:00401112 call sub_40134B
.text:00401117 mov eax, stru_408090._cnt
.text:0040111C add esp, 4
.text:0040111F dec eax
.text:00401120 pop edi
.text:00401121 pop esi
.text:00401122 pop ebp
.text:00401123 mov stru_408090._cnt, eax
.text:00401128 pop ebx
.text:00401129 js short loc_401135
.text:0040112B inc stru_408090._ptr
.text:00401131 add esp, 60h
.text:00401134 retn
当输入17个1时eax对应的是,34个这个,可以推测,1对应的是3 1,
然后输入1234那些测试发现每个都有对应的,接下来就是暴力把表对应出来,目标是0-9,a-z,A-Z,写了个python,每17个输出一个,然后放到程序里输出对应的,得到ida里复制来的,再解析
0 3 , 0 1 3 , 1 2 3 , 2 3 3 , 3 4 3 , 4 5 3 , 5 6 3 , 6 7 3 , 7 8 3 , 8 9 3 , 9 A 4 , 1 B 4 , 2 C 4 , 3 D 4 , 4 E 4 , 5 F 4 , 6 G 4 , 7 H 4 , 8 I 4 , 9 J 4 , a K 4 , b L 4 , c M 4 , d N 4 , e O 4 , f P 5 , 0 Q 5 , 1 R 5 , 2 S 5 , 3 T 5 , 4 U 5 , 5 V 5 , 6 W 5 , 7 X 5 , 8 Y 5 , 9 Z 5 , a a 6 , 1 b 6 , 2 c 6 , 3 d 6 , 4 e 6 , 5 f 6 , 6 g 6 , 7 h 6 , 8 i 6 , 9 j 6 , a k 6 , b l 6 , c m 6 , d n 6 , e o 6 , f p 7 , 0 q 7 , 1 r 7 , 2 s 7 , 3 t 7 , 4 u 7 , 5 v 7 , 6 w 7 , 7 x 7 , 8 y 7 , 9 z 7 , a " 2 , 2
然后解析esi寄存器的那个"437261636b4d654a757374466f7246756e"
最后输出为CrackMeJustForFun,一看就是肯定是他了,毕竟是一句自己看得懂的句子,输进去,success!
写的比较乱,毕竟自己也是新手
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2018-6-17 22:43
被格式化法编辑
,原因: 加个代码框