新手破解练习Crackme160之111 - zebrone
-
脱壳
用PEiD通用脱壳插件脱壳成功~
-
暴力破解
OD载入脱壳后程序, 搜索关键词~ 定位到成功位置004012E5, 上面的关键跳004012DC直接nop掉, 保存成功~
-
正常破解
由上一步可知关键算法在004012D2处, 我们F7进入具体分析, 里面好多汇编的专业方法词, 需要慢慢分析了~(汇编只会一丢丢, 专业点的就看不懂了), 一个个词查百度吧, 只能这样了~ 我们把对应代码复制出来分析:
0040134A /$ 55 push ebp
0040134B |. 89E5 mov ebp,esp
0040134D |. 83EC 68 sub esp,0x68
00401350 |. FF75 08 push [arg.1] ; /s = "54321"
00401353 |. E8 78010000 call <jmp.&CRTDLL.atof> ; \atof 转浮点数 num1
00401358 |. DD55 E8 fst qword ptr ss:[ebp-0x18]
0040135B |. 83EC 08 sub esp,0x8
0040135E |. DD1C24 fstp qword ptr ss:[esp]
00401361 |. E8 82010000 call <jmp.&CRTDLL.floor>
00401366 |. DD5D F8 fstp qword ptr ss:[ebp-0x8] ; num1存起来
00401369 |. FF75 0C push [arg.2] ; /s = "12345"
0040136C |. E8 5F010000 call <jmp.&CRTDLL.atof> ; \atof 转浮点数 num2
00401371 |. DD55 D8 fst qword ptr ss:[ebp-0x28]
00401374 |. 83EC 08 sub esp,0x8
00401377 |. DD1C24 fstp qword ptr ss:[esp]
0040137A |. E8 69010000 call <jmp.&CRTDLL.floor>
0040137F |. 83C4 18 add esp,0x18
00401382 |. DD55 F0 fst qword ptr ss:[ebp-0x10] ; num2存起来
00401385 |. DC4D F8 fmul qword ptr ss:[ebp-0x8] ; num3 = num2 * num1
00401388 |. D9EE fldz
0040138A |. DED9 fcompp ; num3 ?= 0 比较
0040138C |. DFE0 fstsw ax
0040138E |. 9E sahf
0040138F |. 75 07 jnz short zebrone_.00401398 ; 等于0则失败
00401391 |. 31C0 xor eax,eax
00401393 |. E9 96000000 jmp zebrone_.0040142E
00401398 |> DD45 F8 fld qword ptr ss:[ebp-0x8]
0040139B |. DC5D F0 fcomp qword ptr ss:[ebp-0x10] ; num1 ?= num2
0040139E |. DFE0 fstsw ax
004013A0 |. 9E sahf
004013A1 |. 75 07 jnz short zebrone_.004013AA ; 相等则失败
004013A3 |. 31C0 xor eax,eax
004013A5 |. E9 84000000 jmp zebrone_.0040142E
004013AA |> DD45 F8 fld qword ptr ss:[ebp-0x8] ; num1
004013AD |. DD5D C8 fstp qword ptr ss:[ebp-0x38] ; num1
004013B0 |. D9E8 fld1
004013B2 |. DD55 C0 fst qword ptr ss:[ebp-0x40] ; 1.0
004013B5 |. DC5D C8 fcomp qword ptr ss:[ebp-0x38] ; 1.0 ?> num1比较
004013B8 |. DFE0 fstsw ax
004013BA |. 9E sahf
004013BB |. 77 2D ja short zebrone_.004013EA ; 大于则跳转失败, num1需要大于1.0
004013BD |. DF2D 38304000 fild qword ptr ds:[0x403038]
004013C3 |. DD55 B8 fst qword ptr ss:[ebp-0x48] ; 10000000000.0
004013C6 |. DC5D C8 fcomp qword ptr ss:[ebp-0x38] ; 与 num1 比较
004013C9 |. DFE0 fstsw ax
004013CB |. 9E sahf
004013CC |. 72 1C jb short zebrone_.004013EA ; 小于则跳转失败, 即 num1 不能大于 10000000000.0
004013CE |. DD45 F0 fld qword ptr ss:[ebp-0x10] ; num2
004013D1 |. DD5D B0 fstp qword ptr ss:[ebp-0x50] ; num2
004013D4 |. DD45 C0 fld qword ptr ss:[ebp-0x40] ; 1.0
004013D7 |. DC5D B0 fcomp qword ptr ss:[ebp-0x50] ; 1.0 ?> num2
004013DA |. DFE0 fstsw ax
004013DC |. 9E sahf
004013DD |. 77 0B ja short zebrone_.004013EA ; 大于则跳失败, 所以num2也得大于1.0
004013DF |. DD45 B8 fld qword ptr ss:[ebp-0x48]
004013E2 |. DC5D B0 fcomp qword ptr ss:[ebp-0x50] ; 同理 num2 要小于 10000000000.0
004013E5 |. DFE0 fstsw ax
004013E7 |. 9E sahf
004013E8 |. 73 04 jnb short zebrone_.004013EE
004013EA |> 31C0 xor eax,eax
004013EC |. EB 40 jmp short zebrone_.0040142E
004013EE |> DD45 F8 fld qword ptr ss:[ebp-0x8] ; num1
004013F1 |. D9FE fsin ; sin(num1)
004013F3 |. DD5D A8 fstp qword ptr ss:[ebp-0x58] ; sin1值
004013F6 |. DD45 F0 fld qword ptr ss:[ebp-0x10] ; num2
004013F9 |. D9FE fsin ; sin(num2)
004013FB |. DD5D A0 fstp qword ptr ss:[ebp-0x60] ; sin2值
004013FE |. DD45 A8 fld qword ptr ss:[ebp-0x58] ; sin1值
00401401 |. DC4D A0 fmul qword ptr ss:[ebp-0x60] ; sin3 = sin1 * sin2
00401404 |. DF2D 30304000 fild qword ptr ds:[0x403030] ; 10^16
0040140A |. DEC9 fmulp st(1),st ; sin4 = sin3 * 10^16
0040140C |. 83EC 08 sub esp,0x8
0040140F |. DD1C24 fstp qword ptr ss:[esp]
00401412 |. E8 D1000000 call <jmp.&CRTDLL.floor> ; sin5 = sin4向下取整
00401417 |. 83C4 08 add esp,0x8
0040141A |. DD5D 98 fstp qword ptr ss:[ebp-0x68] ; sin5
0040141D |. D9EE fldz
0040141F |. DC5D 98 fcomp qword ptr ss:[ebp-0x68] ; 0.0 与 sin5 比较
00401422 |. DFE0 fstsw ax
00401424 |. 9E sahf
00401425 |. 75 05 jnz short zebrone_.0040142C ; 相等则成功, sin5需要等于0, 即sin4得0~1之间
00401427 |. 31C0 xor eax,eax
00401429 |. 40 inc eax ; 成功则返回1
0040142A |. EB 02 jmp short zebrone_.0040142E
0040142C |> 31C0 xor eax,eax ; 失败则返回0
0040142E |> C9 leave
0040142F \. C3 retn
上面代码基本上一行行分析完了(上面有个坑需要注意, 输入数不得大于10^10, 但我们输入10位数时, 获取文本值时, 只会取到前9位, 也就是值永远不可能超过10位, 只能是9位, 所以输入数只能1~10^9之间), 不懂的命令全是百度的, 分析完得看怎么反算回去了~
#include <stdio.h>
#include <math.h>
int main() {
for(long long num1=0; num1<1e9; num1++){
double a = sin(num1);
if((a >= 1e-8) || (a <= 0)) continue; //我们规定两个数都比1e-8小就行了, 这里先不考虑负数
printf("%lld\n", num1);
}
getchar();getchar();
return 0;
}
需要运行好几十秒才能出结果~ 如果要把所有答案都找出来, 可能需要好几个小时吧?两个循环, 上面代码运行结果如下
245850922
411557987
657408909
823115974
上面随便选取其中两个即可验证通过~ (不能相同的数哈_)
1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~