【逆向入门】 CrackMe160-005 分析思路
CrackMe160-005
这道题难度严重超标了。。纯小白的我呕心沥血才算勉强搞明白了,并且也学到不少东西,不多说废话,来看题
爆破思路
养成好习惯,爆破流程第一步,用exeinfo打开看看文件是否加壳并且使用的什么语言
可以看出有UPX的壳,那么我们直接使用UPX脱壳软件就可以产生一个新的,已经脱壳完成的exe了,原来的exe已经在后面加上了.bak后缀,已经是备份文件了,这里我们打开生成的exe
这诡异的三字经,阴间的黑白配色,名字里的层层设防。。。一切看起来都那么“和蔼”
既然直接爆破的话,我们试试直接点击注册看看会怎么样
卧槽没反应。。。。可恶。。。
输入值再试也还是一样。此时已经能感受到ajj师傅浓浓的恶意了
点击图片会有提示(谢天谢地)
不过如果只是爆破的话,我们做到这里就可以直接尝试搜索字符串了
搜索的时候就不用搜那么准确了,比如一般如果注册成功就会有“注册成功”这几个字出现,所以我们直接搜注册就可以
这里可以看到有一个注册了,看起来很像是注册成功的意思,我们点进去看看
对味了!
往上面翻一下找找关键跳转
不难发现这里有五个验证跳转。。。。也代表本次的序列生成的难度之高。。。
不过作为爆破的话,只要将这里的跳转都nop掉就可以了
请忽略多出来的一个输入框和里面的内容。。是进行了其他操作才有的
可以看到鼠标在放到图片上的时候会提示 “厉害厉害真厉害!佩服佩服真佩服!!”,并且原来的注册按钮此时也变成了“注册了”
那么简单粗暴的爆破就完成了。接下来就是地狱级的折磨了。。。
序列生成
既然有五个判断条件跳转,我们就应该让这五个判断条件都不成立就可以了
另外,这个程序仍然是使用delphi编写的,所以我们也要结合Delphi Decompiler(以下简称DD)去看一下对应的事件执行
补充一点基础知识,在向上一行行读代码的时候,一般只要找到函数入口点就可以了,我们可以在函数入口点打上断点,并观察是如何触发的
而函数入口点一般是如下特征
push ebp
move ebp, esp
或者是位于ret之下
而这里呢,我们并没有发现应该有的函数入口特征
在004473B0这里已经是ret了,但是下面的代码看起来并不是函数入口的样子
这里我们结合DD来看,发现在这个地址附近有个事件调用的地址
也就是说,这个004473E4就是事件Timer2Timer的入口点,在事件Timer2Timer发生时就会从004473E4开始执行,所以其实也相当于函数入口点了,那么我们在这里打个断点试试看怎样才能触发这个事件
发现似乎是到一个时间点就会触发这个事件,然后如果程序暂停也不会影响。可以猜测这个事件的触发是根据机器的时间决定的,大概是每8秒触发一次(自己数的,可能不准)
既然每隔8秒就会判断一次,那么我们只要确保这5个条件跳转不执行就可以了
304
004473E7 | 81BB 04030000 340C0 | cmp dword ptr ds:[ebx+304],C34 |
004473F1 | 0F84 88000000 | je ckme002bak.44747F |
意思是304存的这个值不能等于C34
那么我们就应该寻找304这个地址所有的操作记录,方法叫做常量查找,鼠标右键->查找引用->常量:304
可以看到有3个,先点开第一个看看
所以不能让这一行执行,往上面读
所以00446D6B这个跳转不能成立
代码太多,我们直接来到函数开头一步步执行下来
找到函数入口点特征,对比DD发现是FormCreate的入口,根据这个名字我们不难猜测是在窗口创建时触发,这里打上断点检查触发条件,
这个时候可以把其他的断点设置为禁用,但不用删除,以备后续还需要使用
发现这里有一个路径,我们试着创建这个路径(为了方便这里将盘符 X 改为 D)
就可以通过第一个大跳转了
然后这是第二个,显示是乱码是因为编码方式不对,这里是GBK编码,更换编码后如图
这里容易猜测,函数调用的目的是对比文件内容,试着把这个内容写入ok.txt文件,用010Editor打开,点击hex模式然后把值复制进去
C++字符串保存的模式是在结尾处放一个 ‘\0’ ,这个反斜杠0的十六进制就是00,所以在00之前的都复制进来就可以了
然后这样就两个304的赋值语句就不会执行了,第一个判断就通过了
308
004473F7 | 81BB 08030000 0D230 | cmp dword ptr ds:[ebx+308],230D |
00447401 | 74 7C | je ckme002d.44747F |
意思是308存的这个值不能等于230D
同样地,我们搜索308的引用,点开第一条发现是初始化的语句
语句的排序默认是按照地址先后来的,(一般来说)也就是执行顺序
点开发现位于FormCreate事件内,是在窗口创建时执行的,可以理解为ebx+308在这里进行了初始化,赋值28E
那么点开第二条,根据函数入口点对比DD,发现是Button1MouseDown入口,猜测是“注册”按钮的点击事件,打下断点确认
因为初始值是28E,不等于230D,所以会到下一个判断 cmp cl , 1
观察发现 cl的值与鼠标点击按钮的键有关,左键(cl=0),右键(cl=1),滚轮(cl=2),原理未知,可能是某种协议规定直接写入
所以这里的意思就是,对注册按钮按下鼠标右键就会使308的值加3,暂时没有其他作用,我们接着往下看,看第5个引用处
对比DD,发现是Panel1DbClick入口,猜测是图片的双击事件,打下断点确认
发现并不完全是,只有在点到不是图片的部分,也就是点击空白部分才会触发(看来图片的点击是另外的事件)
00446FDC | 81B8 08030000 9D020 | cmp dword ptr ds:[eax+308],29D | Panel1DbClick入口
00446FE6 | 75 0D | jne ckme002d.446FF5 |
00446FE8 | B2 01 | mov dl,1 |
00446FEA | 8B80 F0020000 | mov eax,dword ptr ds:[eax+2F0] | eax:"TiD", [eax+2F0]:"溝A"
00446FF0 | 8B08 | mov ecx,dword ptr ds:[eax] | eax:"TiD"
00446FF2 | FF51 5C | call dword ptr ds:[ecx+5C] |
00446FF5 | C3 | ret |
可以看出,当308等于29D的时候,点击空白处会调用一个函数,对比DD会发现这个ds:[eax+2F0]的2F0是Edit2的ID
也就是说这里获取了Edit2的ID,并调用了一个函数,猜测可能是显示出这个Edit,毕竟目前只有一个Edit
通过右键注册按钮5次,使308等于29D,可以发现确实显示出了Edit2
至此,308结束
310
00447403 | 81BB 10030000 940F0 | cmp dword ptr ds:[ebx+310],F94 |
0044740D | 75 70 | jne ckme002d.44747F |
意思是310存的这个值要等于F94,查看引用情况,点开第一次引用,网上找函数入口点,发现为FormMouseMove入口,根据名字推测是鼠标移动触发,验证发现当鼠标进入程序界面的时候触发事件
这里补充一点基础知识
转化为文字也就是 在调用函数之前,先将两个参数(倒序)压入堆栈,再执行call,执行call时自动将返回地址压入堆栈。然后再压入ebp,mov ebp, esp,再压入局部变量
回到FormMouseMove,这两行代码很明显就是获取函数的参数
004470F6 | 8B55 08 | mov edx,dword ptr ss:[ebp+8] |
004470F9 | 8B45 0C | mov eax,dword ptr ss:[ebp+C] |
根据事件的功能推测(判断鼠标的位置),有可能是获取鼠标的坐标,尝试后确认如此
那么这些指令的意思就是判断鼠标进入程序的位置了
直到这一行,要求30C不能等于9,那么就要看30C的引用情况
引用第一条是30C初始化为9
所以就只有第二条能改变30C的值了,那么我们需要让第二条执行
点进去往上翻发现是Edit2DblCilick入口
通过一行行执行并且观察发现函数功能,如上图注释(需要耐心观察对比)
00447043 | 8078 01 5F | cmp byte ptr ds:[eax+1],5F | eax+1:"_345,78", 5F:'_'
正常来说我们常见的是dword ptr ds:[eax],他的意思是取eax这个首地址开始的一个dword(双字),所以这里byte ptr ds:[eax+1]的意思就是取eax+1这个首地址开始的一个byte,也就是一个字符,也就是edit2输入框中的第二个字符必须要为 “_”(下划线)
之后的0044705A同理
再往下看就是一个看不太出的函数,这里学到一点就是,实在分析不出来可以试着点进函数内部看看有没有调用什么系统Api,比如这里进入函数可以看到调用了系统API GetDiskFreeSpaceExA 一看这个API就知道估计是产生的随机数了,这个系统剩余空间估计不会有相同的返回值
然后就一个函数调用然后生成结果就结束了
318和314
0044740F | 8B83 18030000 | mov eax,dword ptr ds:[ebx+318] |
00447415 | 3B83 14030000 | cmp eax,dword ptr ds:[ebx+314] |
0044741B | 75 62 | jne ckme002d.44747F |
这里是要求318和314相同,进入318的引用,倒是有很多,第一行是初始化318为0
点进第二个,发现是Image1MouseDown入口,也就是图片【人之初】的点击事件
容易分析这里还是根据点击的按键对318加不同的数
其余几个都是一样,这里就不展示了
314的引用如下。第一行仍为初始化
后面的都是根据30C的值来对314进行赋值,相当于一个条件判断语句
后面就是一个对比Edit1的值是不是ajj,然后隐藏Label3
31C
0044741D | 81BB 1C030000 E7030 | cmp dword ptr ds:[ebx+31C],3E7 |
00447427 | 74 56 | je ckme002d.44747F |
意思是31C存的这个值不能等于F94
查看引用只有一条,跳转只有一行
004474C0 | C780 1C030000 E7030 | mov dword ptr ds:[eax+31C],3E7 | Button1Click入口
004474CA | C3 | ret |
验证发现鼠标右键不算Click,左键点击才算,并且如果点下去然后又移开,相当于没点
需要注意click事件和mousedown事件,click必须是鼠标左键按下和抬起的全过程,而且鼠标位置都在按钮控件范围内,不能移开。而mousedwon事件只要按下就算触发,左键右键都可以,只不过右键没有动画显示
【逆向入门】 CrackMe160-005 分析思路相关推荐
- 【JS 逆向百例】转变思路,少走弯路,X米加密分析
文章目录 声明 逆向目标 逆向过程 抓包分析 参数逆向 基本参数 hash 总结 完整代码 Python 登录关键代码 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理, ...
- 逆向入门分析实战(三)
之前两篇文章,针对恶意代码为了确保自身只有一个实例在运行进行了正向开发和逆向分析.逆向入门分析实战(一)逆向分析入门实战(二) 这种现象在恶意代码中非常常见,现在对上次的内容进行一个简要的回顾和扩展: ...
- 逆向入门分析实战(二)
上次我们对主函数分析完成了,逆向入门分析实战(一)那么这次我们对子函数IsAlreadyRun进行分析. C语言代码 IsAlreadyRun函数的C语言代码如下图所示: 下面对其汇编代码进行分析: ...
- 贴捕鱼cocos2d逆向入门分析
cocos2d-x 先clone git clone地址 https://github.com/cocos2d/cocos2d-x.git lua虚拟机相关代码在cocos2d-x\cocos\scr ...
- 谁说菜鸟不会数据分析(入门篇)----- 学习笔记2(结构为王:确定分析思路 4P 5W2H )
1.数据分析方法论 确定分析思路需要以营销.管理等理论为指导,把这些跟数据分析相关的营销.管理等理论统称为数据分析方法论. 数据分析方法论主要用来指导数据分析师进行一次完整的数据分析,更多的是指数据分 ...
- 视频教程-X64位游戏软件安全逆向入门-其他
X64位游戏软件安全逆向入门 在职教师,从事it行业多年.兼职培训10余年,主要是反外挂数据分析和游戏数据分析.有明文封包分析系列等多部教程. 曾辉新 ¥600.00 立即订阅 扫码下载「CSDN程序 ...
- 西湖大学鞠峰组:环境宏病毒组学分析思路与常用工具
环境宏病毒组学分析思路与常用工具 袁凌1, 2,倪艳4,鞠峰1, 2, 3 * 1 浙江省海岸带环境与资源研究重点实验室,工学院, 西湖大学, 杭州, 浙江 2 前沿技术研究所, 浙江西湖高等研究院 ...
- 基础006 宏基因组入门理论以及分析环境的部署
本文"植物微生物组"公众号原创,ID: plantmicrobiome 作者:zhiwen 原文链接:基础006 宏基因组入门理论以及分析环境的部署 一.宏基因组核心思想 鉴定菌群 ...
- 攻防世界逆向入门题之流浪者
攻防世界逆向入门题之流浪者 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向入门题的流浪者 下载附件,照例扔入exeinfope中查看信息: 32位PE文件无壳,照例扔入ida32中查看伪代码: 是没 ...
最新文章
- C语言遥控器程序,红外遥控
- python中的单下划线和双下划线_python中的单下划线和双下划线
- 解决Extjs中Combobox显示值和真实值赋值问题
- 10、jeecg 默认为空的字段值是如何被填充的?
- C# WinForm中获取当前程序运行目录的方法
- 如何导入一个项目 myeclipse
- CentOS配置snmp
- js基础知识汇总13
- linux内核定时器使用及原理
- ubuntu安装vasp_Ubuntu常用软件的安装
- 数据库变为可疑_Sql 2008数据库可疑如何解决
- 服务器测评文档,十年磨一剑,腾讯自研TBase数据库有奖测评
- 【参赛作品70】MOGDB/openGauss与PostgreSQL关于GDK字符集问题
- Codeforces 666E Forensic Examination SAM+权值线段树
- Fastreport.Net用户手册:打印Bands
- spring boot 定时器
- Web 基础研发体系的建立
- 计算机联锁 组合布置图,车站计算机联锁论文
- 洛谷P1157组合的输出
- Compaq 511系列 显卡驱动 声卡驱动 网卡驱动
热门文章
- 编写一个 spootboot 程序,有二个方法,一个问早上好,一个说再见
- Windows 10 微软官方下载工具
- 哔哩哔哩20校招算法笔试题(2019.8.20)第二道编程题 AC
- 网站关键词优化技巧都有哪些?如何进行优化?
- 【测开实战】adb+python自动化刷快手/抖音视频来赚金币
- python自动生成ppt_用Python自动化生成倒计时图片
- Linux虚拟机下FTP服务器的搭建(详细)
- python微信发送消息过于频繁_微信发送信息频率上限?
- 烂笔头笔记:favicon配置不是所有浏览器都兼容
- Glide 源码解析之监听生命周期