穷举法破解 zebrone1.1
系统 : Windows xp
程序 : zebrone1.1
程序下载地址 :http://pan.baidu.com/s/1boqVcU7
要求 : 编写注册机
使用工具 :OD
可在看雪论坛中查找关于此程序的讨论:传送门。
用OD载入程序,查找字串发现成功提示“congratulations, you have cracked the zebra crackme ver 1.1”,双击定位该字串:
004012AA |> \6A 0A push 0A ; /Count = A (10.); Case 1 of switch 0040128D
004012AC |. 8D45 EC lea eax, dword ptr [ebp-] ; |
004012AF |. push eax ; |Buffer
004012B0 |. 6A push ; |ControlID = 65 (101.)
004012B2 |. FF75 push dword ptr [ebp+] ; |hWnd
004012B5 |. E8 F2010000 call <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
004012BA |. 6A 0A push 0A ; /Count = A (10.)
004012BC |. 8D45 F6 lea eax, dword ptr [ebp-A] ; |
004012BF |. push eax ; |Buffer
004012C0 |. 6A push ; |ControlID = 66 (102.)
004012C2 |. FF75 push dword ptr [ebp+] ; |hWnd
004012C5 |. E8 E2010000 call <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
004012CA |. 8D45 F6 lea eax, dword ptr [ebp-A] ; 取序列号
004012CD |. push eax ; 序列号入栈
004012CE |. 8D45 EC lea eax, dword ptr [ebp-] ; 取用户名
004012D1 |. push eax ; 用户名入栈
004012D2 |. E8 call 0040134A
004012D7 |. 83C4 add esp, ; 平衡堆栈
004012DA |. 09C0 or eax, eax ; eax 为 0?
004012DC |. je short 004012F4 ; 为0 则错误。
004012DE |. 6A push ; /Style = MB_OK|MB_APPLMODAL
004012E0 |. push ; |great !!!
004012E5 |. push ; |congratulations, you have cracked the zebra crackme ver 1.1
004012EA |. FF75 push dword ptr [ebp+] ; |hOwner
004012ED |. E8 C6010000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
004012F2 |. EB jmp short
004012F4 |> 6A push ; /Style = MB_OK|MB_APPLMODAL
004012F6 |. F8314000 push 004031F8 ; |hmmmm :p
004012FB |. push ; |Text = "Sorry... The Serial isn't correct :?
|. FF75 push dword ptr [ebp+] ; |hOwner
|. E8 B0010000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
跟入关键call:
0040134A /$ push ebp
0040134B |. 89E5 mov ebp, esp
0040134D |. 83EC sub esp, ; ↓将用户名字串转化为浮点数
|. FF75 push dword ptr [ebp+] ; /s
|. E8 call <jmp.&CRTDLL.atof> ; \atof
|. DD55 E8 fst qword ptr [ebp-] ; 保存转化结果
0040135B |. 83EC sub esp, ; 开辟内存
0040135E |. DD1C24 fstp qword ptr [esp] ; 保存转化结果并弹栈
|. E8 call <jmp.&CRTDLL.floor> ; 向下取整
|. DD5D F8 fstp qword ptr [ebp-] ; ↓将序列号转化为浮点数
|. FF75 0C push dword ptr [ebp+C] ; /s
0040136C |. E8 5F010000 call <jmp.&CRTDLL.atof> ; \atof
|. DD55 D8 fst qword ptr [ebp-] ; 保存转化后的序列号
|. 83EC sub esp, ; 平衡堆栈
|. DD1C24 fstp qword ptr [esp] ; 将结果入栈
0040137A |. E8 call <jmp.&CRTDLL.floor> ; 向下取整
0040137F |. 83C4 add esp, ; 平衡堆栈
|. DD55 F0 fst qword ptr [ebp-] ; 保存取整结果
|. DC4D F8 fmul qword ptr [ebp-] ; 乘以用户名
|. D9EE fldz ; 载入0
0040138A |. DED9 fcompp ; 比较st(0)st(1),并弹出寄存器堆栈
0040138C |. DFE0 fstsw ax ; 把该状态寄存器的值传送给通用寄存器AX
0040138E |. 9E sahf ; 标志传送指令
0040138F |. jnz short ; st0和st1相等?
|. 31C0 xor eax, eax ; 清空eax
|. E9 jmp 0040142E ; 函数结束
|> DD45 F8 fld qword ptr [ebp-] ; 用户名浮点数入栈
0040139B |. DC5D F0 fcomp qword ptr [ebp-] ; 与序列号浮点数比较
0040139E |. DFE0 fstsw ax
004013A0 |. 9E sahf
004013A1 |. jnz short 004013AA ; 用户名浮点数与序列号浮点数相等则函数结束
004013A3 |. 31C0 xor eax, eax ; 清空eax
004013A5 |. E9 jmp 0040142E ; 函数结束
004013AA |> DD45 F8 fld qword ptr [ebp-] ; 用户名浮点数入栈
004013AD |. DD5D C8 fstp qword ptr [ebp-] ; 保存用户名浮点数
004013B0 |. D9E8 fld1 ; 1入栈
004013B2 |. DD55 C0 fst qword ptr [ebp-] ; 保存1
004013B5 |. DC5D C8 fcomp qword ptr [ebp-] ; 1 > 用户名浮点数?
004013B8 |. DFE0 fstsw ax
004013BA |. 9E sahf
004013BB |. 2D ja short 004013EA ; 是则错误
004013BD |. DF2D fild qword ptr [] ; 载入10的10次方
004013C3 |. DD55 B8 fst qword ptr [ebp-] ; 保存
004013C6 |. DC5D C8 fcomp qword ptr [ebp-] ; 10的10次方 < 用户名浮点数?
004013C9 |. DFE0 fstsw ax
004013CB |. 9E sahf
004013CC |. 1C jb short 004013EA ; 是则错误
004013CE |. DD45 F0 fld qword ptr [ebp-] ; 序列号浮点数入栈
004013D1 |. DD5D B0 fstp qword ptr [ebp-] ; 保存
004013D4 |. DD45 C0 fld qword ptr [ebp-] ; 用户名浮点数入栈
004013D7 |. DC5D B0 fcomp qword ptr [ebp-] ; 用户名浮点数 > 序列号浮点数?
004013DA |. DFE0 fstsw ax
004013DC |. 9E sahf
004013DD |. 0B ja short 004013EA ; 是则错误
004013DF |. DD45 B8 fld qword ptr [ebp-] ; 载入10的10次方
004013E2 |. DC5D B0 fcomp qword ptr [ebp-] ; 10的10次方 >= 序列号浮点数?
004013E5 |. DFE0 fstsw ax
004013E7 |. 9E sahf
004013E8 |. jnb short 004013EE ; 是则继续流程
004013EA |> 31C0 xor eax, eax ; 清空eax
004013EC |. EB jmp short 0040142E ; 函数结束
004013EE |> DD45 F8 fld qword ptr [ebp-] ; 用户名浮点数入栈
004013F1 |. D9FE fsin ; 计算栈顶的正弦函数
004013F3 |. DD5D A8 fstp qword ptr [ebp-] ; 保存结果
004013F6 |. DD45 F0 fld qword ptr [ebp-] ; 序列号浮点数入栈
004013F9 |. D9FE fsin ; 计算栈顶的正弦函数
004013FB |. DD5D A0 fstp qword ptr [ebp-] ; 保存结果
004013FE |. DD45 A8 fld qword ptr [ebp-] ; 用户名正弦值入栈
|. DC4D A0 fmul qword ptr [ebp-] ; 乘以 序列号正弦值
|. DF2D fild qword ptr [] ; 10的16次方入栈
0040140A |. DEC9 fmulp st(), st ; 再相乘
0040140C |. 83EC sub esp, ; 开辟8个字节的空间
0040140F |. DD1C24 fstp qword ptr [esp] ; 保存结果
|. E8 D1000000 call <jmp.&CRTDLL.floor> ; 向下取整
|. 83C4 add esp,
0040141A |. DD5D fstp qword ptr [ebp-] ; 保存
0040141D |. D9EE fldz ; 载入0
0040141F |. DC5D fcomp qword ptr [ebp-] ; 结果是否为0?
|. DFE0 fstsw ax
|. 9E sahf ; (initial cpu selection)
|. jnz short 0040142C ; 不为0则失败
|. 31C0 xor eax, eax
|. inc eax
0040142A |. EB jmp short 0040142E
0040142C |> 31C0 xor eax, eax
0040142E |> C9 leave
0040142F \. C3 retn
这里的Sin指令是按弧度制算的,所以想用180的倍数充当乘数是不行的,我们只能遍历[1,10^10],找出其中正弦值为正数且正弦值小于10^-8的实数。这样的两个实数相乘再乘以10的16次方的乘积就满足了条件。{ x | 0 < x < 1 }
动手编写程序,验证我们的猜想:
=========================十年后============================》
好吧。。。肯定是哪儿出问题了,经过Debug之后源程序如下:
#include <iostream>
#include <math.h>
#include <iomanip> // 精度控制头文件 using namespace std; inline double Sin( double Var ) //内联Sin指令
{
__asm{
fld Var
fsin
fstp Var
} return Var;
} int main( void )
{
double i,j,res;
const double min = 1e-; cout << "Valid number:" << endl; for ( i = ; i <= 1e+ ; i++ ){
res = Sin( i ); //接受正弦值。 bool Flag = false;
__asm{
push eax fld res //载入正弦值
fldz //载入0
fcompp //0 < 正弦值?
fstsw ax
sahf
jnb s //不小于则跳转
fld res //载入正弦值
fcomp min //正弦值 < min?
fstsw ax
sahf
jnb s //不小于则跳转
mov Flag, s: pop eax
} if ( Flag )
cout << setprecision() << i <<endl;
} cout << "Done." << endl; return ;
}
运行效果:
但经过测试发现,算出的数中 大于 10的9次方的数的Sin值与zebrone1.1的Sin值有偏差,所以有效的数值有:
随便取出两个按照 升序填入:
就注册成功了:
穷举法破解 zebrone1.1的更多相关文章
- 通过穷举法快速破解excel或word加密文档最高15位密码
1.打开文件 2.工具 --- 宏 ---- 录制新宏 --- 输入名字如 :aa 3.停止录制 ( 这样得到一个空宏 ) 4.工具 --- 宏 ---- 宏 , 选 aa, 点编辑按钮 5.删除窗口 ...
- for循环语句以及迭代法和穷举法
循环语句: 四要素:初始条件,循环条件,状态改变,循环体 for(初始条件;循环条件;状态改变){ //循环体} 案例1:打印等腰直角三角形和菱形 左上三角 static void Main(stri ...
- C#4 for循环 迭代法 穷举法应用
for()循环. 四要素: 初始条件,循环条件,状态改变,循环体. 执行过程: 初始条件--循环条件--循环体--状态改变--循环条件.... 注意:for的小括号里面分号隔开,for的小括号后不要加 ...
- C# for 循环 迭代法 穷举法
for()循环. 四要素: 初始条件,循环条件,状态改变,循环体. 执行过程: 初始条件--循环条件--循环体--状态改变--循环条件.... 注意:for的小括号里面分号隔开,for的小括号后不要加 ...
- 【2-24】for循环嵌套,跳转语句,异常语句,穷举法、迭代法
For循环嵌套与if嵌套相似,是在for中再套for,其结构如下: For(;;) { For(;;){} }经典题型为打印星星例: Console.Write("请输入一个奇数:" ...
- 穷举法、for循环、函数、作用域、斐波那契数
1.穷举法 枚举所有可能性,直到得到正确的答案或者尝试完所有值. 穷举法经常是解决问题的最实用的方法,它实现起来热别容易,并且易于理解. 2.for循环 for语句一般形式如下: for variab ...
- C# 异常语句 跳转语句 while循环 穷举法 迭代法
一 异常语句 ♦ try.....catch....finally 结构形式 try{ 可能会出错的代码语句 如果这里出错了,那么不会在继续下面的代码,而是直接进入catch中处理异常}catc ...
- python 穷举法 算24点(史上最简短代码)
本来想用回溯法实现 算24点.题目都拟好了,就是<python 回溯法 子集树模板 系列 -- 7.24点>.无奈想了一天,没有头绪.只好改用暴力穷举法. 思路说明 根据四个数,三个运算符 ...
- 基本算法思想之穷举法(C++语言描述)
穷举算法(Exhaustive Attack method)是最简单的一种算法,其依赖于计算机的强大计算能力来穷尽每一种可能性,从而达到求解问题的目的.穷举算法效率不高,但是适应于一些没有规律可循的场 ...
随机推荐
- 解决Eclipse报errors running builder ‘javascript validator’ on project
导入jquery的js到项目中,Eclipse每次检测到功能代码变化(保存动作触发)就报错: errors running builder ‘javascript validator’ on proj ...
- SNF开发平台WinForm之二-开发-单表表单管理页面-SNF快速开发平台3.3-Spring.Net.Framework
2.1运行效果: 2.2开发实现: 2.2.1 这个开发与第一个开发操作步骤是一致的,不同之处就是在生成完代码之后,留下如下圈红程序,其它删除. 第一个开发地址:开发-单表表格编辑管理页面 http: ...
- 在ASP.NET开发中容易忽略的2个小问题
本文地址:http://www.cnblogs.com/outtamyhead/p/3642729.html,转载需保留本地址. 最近在我的MVC项目中出现了两个非常小,但是往往惹出大麻烦的问题,借中 ...
- Arcgis报错: Bad login user Failed to execute (CreateEnterpriseGeodatabase).
在使用工具Create Enterprise Geodatabase的时候报错Bad login user,开始怀疑为密码错误,然后反复在plsql中尝试发现并没有错误,很疑惑,然后去官网查询: Er ...
- Android中查找一个Layout中指定的子控件
我们通常希望查找一个页面中指定类型的控件,单个控件知道id很容易找到,但是如果是多个呢?或者说是在程序中自定义的控件,且不知道id怎么办呢?如想找到页面中的Spinner,可用以下方法 /** * 从 ...
- vs2010 C#链接 ACCESS数据库
ACCESS数据库,有2003.2007版本,不同的版本,链接字符也不同,现把代码黏贴如下: 1.ACCESS2003(.mdb): private void Form1_Load(object se ...
- 2014 网选 5024 Wang Xifeng's Little Plot
题意:从任意一个任意一个可走的点开始找一个最长的路,这条路如果有转弯的话, 那么必须是 90度,或者没有转弯! 思路: 首先用dfs将所有可走点开始的 8 个方向上的线段的最长长度求出来 ! step ...
- 【转载】Grunt常用插件介绍
项目名称 grunt-contrib v0.8.0 项目地址 https://github.com/gruntjs/grunt-contrib 项目介绍 此项目是对grunt常用插件的集合,刚接触gr ...
- [Node.js] 也说this
原文地址:http://www.moye.me/2014/11/21/也说this/ 引子 Any sufficiently advanced technology is indistinguisha ...
- R提高篇(二): 图形初阶
目录: 图形示例 图形参数 符号.线条 颜色 文本属性 尺寸与边界 自定义标题 自定义坐标轴 图例 文本标注 图形组合 图形示例 如下代码描述病人对两种药物五个剂量水平上的响应情况 > myda ...