> ## Content Index
> Fetch the complete content index at: https://blog.hacking.pub/llms.txt
> Use this file to discover other available public pages before exploring further.

# crackme 一只老虎
- URL: https://blog.hacking.pub/2017/06/28/crackme-yi-zhi-lao-hu/
- Published: 2017-06-28T10:16:00.000Z
- Updated: 2019-02-18T08:07:59.000Z
- Author: chainhelen
- Tags: 逆向, 逆向工程, crackme, 看雪, 练手

#### 环境

看雪论坛的附件，其中序列号的[第二题](http://pan.baidu.com/s/1bo61h5H?ref=blog.hacking.pub)  
IDA PRO 破解版 Version 6.8.150423 (64-bit)

#### 入口

首先输入任意字符串注册`注册名 : qianhailong ; 注册码 : longlong`

![crackme一只老虎1.png](https://blog.hacking.pub/qiniu/crackme%20%E4%B8%80%E5%8F%AA%E8%80%81%E8%99%8E/crackme%E4%B8%80%E5%8F%AA%E8%80%81%E8%99%8E1.png)

点击注册，显然因为输入有问题错误而没有任何弹窗  
拖入IDA PRO，断点调试，首先需要找到入口

思路一，尝试寻找类似`GetDlgItemTextA`获取字符串的导入函数 ，并没有什么发现，只有可疑的`GetWindowTextA、GetWindowTextW、GetKeyNameTextA`  
先此几处下断点，此时看到的现象是多种事件行为都会触发这几个函数，例如`click、 focus等`，难以调试

思路二，寻找关键字符串，`view -> open subviews -> strings` 或者 热键`shift+F12`，然而也没有什么线索，还有几处中文乱码不清楚是什么

思路三，点击事件，在`Functions windows`过滤`click`关键字，果然有所发现

如下图，其中有三个按钮点击事件函数，这时候双击左侧`_TForm1_Button3Click`，会发现右侧对应代码含有关键词`Close`，此时可以大胆猜测跟程序一一对应，`Button3`对应`推出`，那么`Button1` 对应`注册`

下完断点，点击`注册`，验证完毕

#### 代码流程

有了上一次经验，代码大体流程看的非常快，上叙断点下完后，函数前面初始化比较繁琐，先直接跳过  
到下图所示第一个分支

![crackme一只老虎6.png](https://blog.hacking.pub/qiniu/crackme%20%E4%B8%80%E5%8F%AA%E8%80%81%E8%99%8E/crackme%E4%B8%80%E5%8F%AA%E8%80%81%E8%99%8E6.png)

`1处`代码下面如果接左侧分支，直接到底就结束了，并不是我们期望的；  
反推更期望进入右侧分支，继续反推期望倒数两行`cmp eax 0Ah; jl loc——48c844`，期望`eax >= 0Ah`；  
反推`call unknown_libname_70`执行结果`eax`满足`eax >= 0Ah`；  
在`call处`下断点，鼠标查看先前的`eax`值为字符串`qianhailong`的地址；  
执行结果后，`eax`的值变成了`0B(h)`，很明显是返回了`注册名的长度`，要求`注册名的长度 >= 0Ah`；

这里重命名一下`unknown_libname_70`为`getStrLenToEax`，另外也可以发现改程序是`delphi`写的

类似上面的分析，下面几处流程都是`注册名、注册码的长度要求`，要求暂简记为`0A(h) <= NLen <= 10(h) 11(h) <= MLen <= 16(h)`  
可知目前注册码的长度`longlong`不满足题意

#### 重新输入

重新输入注册码`longlonglonglonglong`，继续断点重试  
流程比较繁琐，点断继续一直找字符串比较的地方

![crackme一只老虎7.png](https://blog.hacking.pub/qiniu/crackme%20%E4%B8%80%E5%8F%AA%E8%80%81%E8%99%8E/crackme%E4%B8%80%E5%8F%AA%E8%80%81%E8%99%8E7.png)

上图`3处`代码中的函数签名含有关键词`strcmp`，并且往下有两个分支，一个是弹出`MessageBox`再结束，一个是直接结束

断点下在`jnz short loc_48C803`，在`Hex View-1`中右键选中`Synchroize with ID View-RIP`，可见该处代码的二进制字符，如下

![crackme一只老虎9.png](https://blog.hacking.pub/qiniu/crackme%20%E4%B8%80%E5%8F%AA%E8%80%81%E8%99%8E/crackme%E4%B8%80%E5%8F%AA%E8%80%81%E8%99%8E9.png)

`jnz`对应的机器码为`75`,按住`F2`进入编辑状态修改为`74`(对应机器码为`jz`)

修改完一定要再次按下`F2`保存!!!  
修改完一定要再次按下`F2`保存!!!  
修改完一定要再次按下`F2`保存!!!

当然也可以直接改`ZF寄存器`，如果可得到如下界面

![crackme一只老虎12.png](https://blog.hacking.pub/qiniu/crackme%20%E4%B8%80%E5%8F%AA%E8%80%81%E8%99%8E/crackme%E4%B8%80%E5%8F%AA%E8%80%81%E8%99%8E12.png)

#### 注册机

这次我没有去认真单点调试去求加密的每一个步骤，采用直接改二进制的方式，所以这一次没有写注册机  
上述方式只会保存在IDA pro数据库，不会改变程序本身  
如果要求改程序本身，需要借助其他程序  
`nodepad++`需要借助插件HexEditor.dll，`插件 -> Hex-Editor -> View in Hex`(另外也可以使用`ultraedit`)

![crackme一只老虎13.png](https://blog.hacking.pub/qiniu/crackme%20%E4%B8%80%E5%8F%AA%E8%80%81%E8%99%8E/crackme%E4%B8%80%E5%8F%AA%E8%80%81%E8%99%8E13.png)