新手破解练习Crackme160之111 - zebrone

  1. 脱壳
    用PEiD通用脱壳插件脱壳成功~
     

  2. 暴力破解
    OD载入脱壳后程序, 搜索关键词~ 定位到成功位置004012E5, 上面的关键跳004012DC直接nop掉, 保存成功~
     

  3. 正常破解
    由上一步可知关键算法在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
上面随便选取其中两个即可验证通过~ (不能相同的数哈_)

 
 
 
这是160个软件part1
这是160个软件part2

1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载

新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~

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

posted @ 2024-07-16 10:06  hankerstudio  阅读(4)  评论(0)    收藏  举报