一米丶阳光 发表于 2019-10-22 18:08

160CrackMe之002(Afkayas.1)

本帖最后由 一米丶阳光 于 2019-10-23 11:28 编辑

### 0x1 环境与工具
*吾爱破解虚拟机2.0
*PEID、吾爱破解版OD

### 0x2 查壳
* 将PE文件拖入PEID

### 0x3 定位注册算法
*将PE文件拖入OD,F9运行
*随意填入Name和Serial,点击OK按钮,不出意外肯定会弹出错误提示(如果弹出成功可以去买彩票了)

*F12暂停运行,alt+F9回到用户领空,点击错误提示框的确定按钮,OD回到用户领空断下
*从断点处往上翻,遇到第一个jmp指令,我们看到这个jmp指令跳过了错误提示框的代码,以此推断这条jmp指令没有执行,所以在jmp指令的下面肯定有从上面跳过来的地方,这条指令很近,紧挨着jmp指令,顺藤摸瓜,找到跳过来的地址
*我们发现了关键的字符串,以此判断,此je指令为根据输入结果判断打开哪个提示框

*从此指令上翻找到一条cmp指令,在此指令下断

*重新点击确定,断点在cmp指令断下,此时观察堆栈,找到cmp的两个参数,一个是我们输入的serial,一个是算法生成的serial,准备定位“585308”生成的地方,有两个思路。

#### 思路一
*来到图中的地方,首先在位置1处找到edi的内容,然后在位置2处找到ecx的内容,我们发现ecx中存储的即为“585308”,ecx又来源于位置2

*在下硬件写入断点,点击ok按钮来到下图位置

*存的内容为0x0091BE40,在0x0091BE40下硬件写入断点,来到下图位置

*因为算法不可能在vb虚拟机的dll中,也不可能在系统的dll中,所以一路alt+F9回到用户领空,来到0x402458位置,下断点,重新点击ok按钮,断点在0x402458位置断下,我们看到eax存储的为“585308”,再往上翻就是算法代码
*这种思路有可能不能一次就接近算法位置,重复这个过程,最终会进入算法领空
#### 思路二
*来到这个函数的头部下断点,点击ok按钮,然后F8单步执行,观察栈帧和寄存器,直到看到关键数据,如果关键数据来源于子函数,下断点进入
*重复这个过程,直到定位到算法位置

### 0x4 算法解析
*本例的算法较简单,来到地址0x402412地址处下断,单步分析

*最终得出算法 result = len(Name) * 0x17CFB + ASCII(Name首字符)

一米丶阳光 发表于 2019-10-23 09:23

liphily 发表于 2019-10-23 07:15
像这种右边注释的说明,怎么在左边的代码中看出来
我只会简单的je,jmp,mov,add,inc等基本 ...

判断汇编的意思一般通过两种手段:
1.汇编代码中或者右边的注释区域一般会自带一些od分析出来的字符串和导入函数
2.根据调试器执行后,通过观察寄存器区域和堆栈区域进行判断
举例:
1.call dword ptr ds:[<MSVBWM50.#rtcAnsiValueBstr_516>]像这样的指令,我一般会用两种方法分析,第一,去查阅VB的API手册,去判断这个函数的功能,第二,根据这个函数执行后EAX的返回值判断
2.对于普通的je,jmp,mov,add,inc指令对应的汇编,意思都是很直观的,你需要关注的是你想要的数据所在的寄存器或者内存中发生了什么事情

其次就无其他捷径,多加练习,看得多了就熟练了

moshuiNW 发表于 2022-4-21 11:07

感谢大佬分享,学到了
页: [1]
查看完整版本: 160CrackMe之002(Afkayas.1)