[CrackMe]160个CrackMe之002
吾爱破解专题汇总:【反汇编练习】160个CrackME索引目录1~160建议收藏备用
一、逆向分析之暴力破解
暴力破解,对于这种具有提示框的,很好定位。
定位好之后,爆破其跳转语句,就能达到破解目的。
当然,我们之后还会分析其算法写出注册机。
1)点击OK,弹出标题上的对话框。此时点击暂停(不要关闭对话框),然后跳转到 K窗口。
可以看出其栈的调用顺序,最下面的位于 0x40000(EXE)模块内,为用户区代码。
点击“显示调用”,跳转过去,查看用户区的汇编代码。

2)往上看,字符很明显。

3)其跳转结构就是 if else,找到关键跳转点,如图地方使用爆破即可。

二、逆向分析之算法分析
暴力破解,难度比较低,显然不能满足我们的预期。我们的目标是分析其算法写出注册机。
分析前需要具备一个意识:在2)中我们找到一串疑似生成的serial并验证成功,假设该为十进制字符串,那么我们在olldbg中看到的就是为十六进制的数字。
0x77148 = 487752,所以需要对 77148 这个数字敏感。
1)查看其跳转时的 IF 条件。
如下图,使用 test si,si;je xxx 进行跳转。翻译过来就是“若si为0,则跳转到xxx(错误显示区)”
我们继续往上观察,上面两个函数依次是 __vbaFreeStrList,__vbaFreeObjList,这属于释放对象的函数,因此忽略。
再往上看,我们发现其存在一个 __vbaStrCmph函数,其是字符串比较函数,且返回值给esi,有大概率可能是“将serial与用户输入进行对比”

2)在__vbaStrCmp函数处下断点,观察其传入参数。

一个类似serial,和一个用户输入,我们下面验证一下。

很明显正确,我们再换一组数据,其后面数字发生变化,我们有理由怀疑 "AKA-"是常量,后面的才是真正的变量。

其根据用户输入计算,下面我们就来寻找这个计算。
3)寻找 代码生成算法。
警告:不要再从 __bvaStrCmp算法往上分析,而是找到用户输入的往下分析。
因为你从下往上,无法确定到底是哪一环生成的,这种排除法很容易出错。
虽然从上往下,你可能丢掉了输入点,但是你只要看到用户输入,说明并没有被计算,那么你所找的也就不重要了,根据这点来继续分析也可以找到算法。
我们直接跳到 该函数入口 "push ebp"处,虽然分析的代码有点长,但我们只要盯紧 “CPU区、寄存器区、栈区” 三个部分,单步分析,找到用户名 "abcde" 即可。
这样想其实也不是那么的难。

4)查找到其 serial算法:
如图,这是从函数头步一直按F8第一次见到用户输入的字符串 "abcde"

算法分析:其首先获取用户输入的长度(__vbaLenBstr),然后该值乘以0x17CFB(0x402420处),之后获取用户输入name的第一个字符(a),调用rtcAnsiValueBstr函数获取其ASCII码,最后与前面结果相加。
5*0x402420+0x61('a') = 0x77148,该值正好与我们前面假设的完全相符,则说明这就是该值的正确算法。
下面会调用某些函数将其转换为十进制的UNICODE,然后与 "AKA-"进行拼接,最后调用 strcmp 函数进行验证显示结果。
三、解题感悟:
- 找到serial算法本身就需要具有一定思路,像上面所强调的,找到if语句判断的条件,之后不要从下往上推,而是从上往下推。
- 一般这类题不会太复杂,不要陷入很深的函数出不来,那往往说明你分析错了。
[CrackMe]160个CrackMe之002的更多相关文章
- [CrackMe]160个CrackMe之015
吾爱破解专题汇总:[反汇编练习]160个CrackME索引目录1~160建议收藏备用 一.破解 该破解比较简单,其是一个静态密码 2G83G35Hs2 ,输入进去即可破解. 1)栈定位法找到用户代码 ...
- [CrackMe]160个CrackMe之001
吾爱破解专题汇总:[反汇编练习]160个CrackME索引目录1~160建议收藏备用 一.Serial/Name 之 暴力破解 1. 熟悉界面:很常规的一个界面,输入完账号密码之后会进行验证. 2. ...
- [反汇编练习] 160个CrackMe之002
[反汇编练习] 160个CrackMe之002. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之003
[反汇编练习] 160个CrackMe之003. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之027
[反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之026
[反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之025
[反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之024
[反汇编练习] 160个CrackMe之024. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之022
[反汇编练习] 160个CrackMe之022. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
随机推荐
- Vue实现简单的列表金额计算效果(简易购物车)
效果图: 使用技术:v-for v-bind v-on实现简单的列表选中绑定操作 代码: <!DOCTYPE html> <html> <head> <met ...
- python基础(3):变量、常量、注释、基本数据类型
1. 变量 变量:将运算的中间结果暂存到内存,以便后续程序调⽤. 可以直接运算,如下所示: print(3+5+6) print((3+5+6)*12) print(((3+5+6)*12)+3) p ...
- Python【day 15】基本数据类型-int str bool list
'''''' ''' 1 python的定义 是一门弱类型的解释性的高级编程语言 这里的高级是相对低级(例如:汇编语言等) 高级编程语言和低级编程语言的区别 1.前者更接近于人的理解--字母组成的语法 ...
- SpringCloud服务调用源码解析汇总
相信我,你会收藏这篇文章的,本篇文章涉及Ribbon.Hystrix.Feign三个组件的源码解析 Ribbon架构剖析 这篇文章介绍了Ribbon的基础架构,也就是下图涉及到的6大组件: Ribbo ...
- JS基础语法---分支语句之:if语句,if-else语句,if-ever if语句
//if语句只有一个分支 //if-else语句有两个分支,最终执行一个分支 //if-else if-else if-else if-else if..........else---多分支,最终也是 ...
- Redis之自问自答
Q:Redis客户端的批处理大量数据请求时,如何优化请求速率? A:管道技术:Redis是基于客户端-服务端模型的TCP请求/响应服务,且是阻塞式的,客户端需要等待服务端处理完数据后返回状态,才能继续 ...
- python中动态创建类
class Foo(Bar): pass Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__创建一个名字为Foo的类对象(我说的是类对象,请紧 ...
- MySQL通过SHOW TABLE STATUS查看库中所有表的具体信息
有时候我们想看下指定库下所有表的使用情况,比如,查询表的Table大小,什么时候创建的,数据最近被更新的时间(即最近一笔insert/update/delete的时间).这些信息对我们进行库表维护很有 ...
- nginx 安装 lua_nginx_module 模块(nginx——lua 学习笔记1)
插入两个网站: nginx + lua 的OpenResty 开发 跟我学OpenResty(Nginx+Lua)开发目录贴 两个都是 可以根据目录一步步学习的. 1. 版本下载 nginx版本为 n ...
- nginx的共享字典项api(操作方法)
nginx的共享内存,称为共享字典项,对于所有的worker进程都可见,是一种全局变量. 备注一下内容中的 [] 是 备注. 源码分析文档:https://www.codercto.com/a/948 ...