逆向纯新手,第一次破解,大神勿喷,有建议我虚心接受。做个记录
前置知识:写过一些小脚本,会点简单OD找数据;曾经尝试学过破解无果。
1、拿到软件熟悉的右键 -- 属性,软件只有130K,感觉有点小,第一感觉是有压缩壳,果断查壳。(PS:电脑根本没有这些工具软件,全靠用的时候百度...

2、查壳,如图,下面显示什么都没找到,右上角EP段显示UPX1,感到应该是peid版本问题,没关系就当是upx壳。

3、本着有轮子就不造轮子的原则,直接百度UPX脱壳软件,下载了几个脱壳尝试,都是无效的,exe运行不起来(困难1) -- (后面还是靠脱壳软件脱掉的,请往后看)。
4、难道只有学习自己造轮子?遂搜索UPX脱壳教程,什么三大步、8大法,看着就眼花缭乱,而且很多描述不清晰,直接没有看下去的欲望;终于找到一个简单点的,就是载入OD,ctrl+F搜popad附近的大跳转(具体深层原理不太清楚,个人认为跳转处就是壳子解压缩之后到程序真正执行的地方--好像是什么oep),找到popad这个 JMP 这个跳转,直接F2下断,程序跑起来到这里断下。
搜索

下断

5、鼠标右键断下的地方,点跟随(或者直接键盘 enter),就来到了新的区域。为了确定是不是,右键汇编区域,中文搜索,确实有很多和这个软件相关的字符串,以及登录失败这些提示(涉及软件信息,这个我就不截图了),确定刚才跳转进入的地方就是正确的。返回之后,右键 选择 dump process 类似的字样,界面看不太懂,根据之前所了解的是有什么修复,但是界面默认选择了一些,先不管无脑下一步保存,得到了新的exe。


6、激动的双击,再双击,然并卵,程序跑不起来,WTF ?,难道还要去学习什么修复各种表?本着有轮子就不造轮子的原则! 这个UPX壳已经很常见了,搜脱壳教程一大堆,肯定有人造了脱壳并且修复什么表的轮子,前面找的脱壳软件可能版本不匹配或者别的原因没成功。继续百度UPX脱壳软件,多尝试几个,终于让我找到了一个,脱壳之后程序能继续跑起来的脱壳机!(运气、运气) -- 软件我不放了,百度随便找,对比下界面是不是这个就好了。

【分析开始】
6、脱完壳之后,就开始正式操作了。软件载入OD,直接跑起来,出现登录窗口,随便输入用户名:asd,启动,提示 未发现此用户。-- 后续涉及软件内容,截图可能会少一些或者遮盖一些,见谅!

有提示就好办,OD搜索中文字符串,确实找到了这个字符串,点进去!
![]()

这里就能看到一些判断提示,根据自己写代码的经验,这里应该是错误判断,也就是前面已经断定出现错误了,进这个函数去判断错误类型,所以我们要找的错误点应该在前面调用这个函数的地方。
猜测函数原型:
do 验证用户
if (出错){
函数--判断什么类型再弹窗提示 --我们现在应该在这个函数里面}
else{
正常执行
}
到这个函数顶部,下断,重新运行程序,看哪个函数调用的

断下之后,右下角可以看到是来自谁调用的,直接选中右下角,enter键

来到这里,函数很长,上下滚动看看,注意看旁边的注释,有网络请求,还有download字样,看来是一个网络验证,而且应该还下载了数据(困难2),有点超过我的预期了..


既然有网络请求,那我就抓包看看发送和返回了什么信息,找轮子,首先是charles fiddler 两大工具,百度下载安装一气呵成。结果抓不到进程的请求,百度说要什么设置,由于两个程序功能都比较多,相对我的需求来说太杂了,弃之。继续找软件,找到一个功能相对较少,但是一眼就能看明白设置的软件,好像是易语言结合golang写的,现成的轮子真是好! -- 软件不放了,也是开源的,要的自己搜 sunny 抓包 关键字

设置好进程名,重启程序,点击登录,抓到了

返回了404,被拒绝了,看看请求url 包含了 5ebd12f97a84554e4868a8d32e03a065b1565648a3dbf1ec815505f8df40615edebaf5c8f8366d9777efb54de8dcde73,是一串加密的字符。
这时候有两个思路:
1、去OD继续破解,把加密方式找到,看看都用了什么加密,加密了些什么,再去破解
2、买正版卡,找正版数据,研究返回了什么数据,拿到数据之后,继续后续破解,这里的访问最后做一个IP拦截转向,转向自己的地址,把数据补回去就好了
我先尝试了第一种,找起来比较麻烦(新手、新手),弃之,买了个正版卡,再次登录,拿数据。
![]()
返回了201,成功了,但是为什么不是200?搞个201。不管,而且看后面的 content-Type -- application/octet-stream 这是什么鬼,继续百度,原来这是HTTP传文件的类型(可能描述不准确),也就是服务器传下来的是一个文件,返回OD里面,把整个请求流程看完




看旁边的注释,整个一套http请求,具体是需要什么参数或者返回什么也不清楚,从单词意思上来看,构造请求-发起请求-读取数据-关闭请求,大致是这样一个逻辑,接着就一个个拿名字到百度去搜索,全是win系统的API,微软官网都有比较好的注释。
这里我就不写具体用法,继续走几遍登录流程,正版号和非正版号轮流来,找出代码的差异位置做好标记。基本上弄明白了。

这里,传入了IP和端口,都是写死的,后续要改可以直接用utralEdit修改

这里,存入了返回的状态码

这里,读取了传回来的文件,存到内存[0x422098]里面,同时把返回的长度赋值给了EAX
继续往后走,正版卡就会出现程序界面,非正版的账号就弹窗提示错误。
逻辑就比较清楚了,用正版卡执行一次,通过抓包把 服务器的文件 搞下来,再把IP转向自己的ip,请求的时候,访问自己的ip,返回正确的状态码,再把文件返回回去,就应该没问题。
转向IP这个太麻烦先不做,准备测试操作,直接在OD里面补数据。
OD重载入程序,在上面执行访问的各个地方下断点,随便输入账号,登录,断下来,先补状态码。

看到补数据的地方,明显返回了404被拒绝了,改201,继续运行,再次断下

明显看到,数据长度EAX为0,并且存数据的地址里面没数据,

这时候就要补长度和数据,右上角eax,双击修改补上返回长度

接着db 到存数据的地址,手动输入数据 -- 但在这里有坑,OD里面一次输入长度不够,手动要输超级久,于是又找了个申请内存的工具--被杀毒杀掉了,懒得找,工具我就不贴图了

把数据存入申请的内存中,再把原来数据指向的地址替换成为申请好的地址。
相当于 原来 [0x422098] 地址指向009FC020 ,但是这里面没数据,我申请好的有数据的内存地址是 0F020020 ,手动在OD里把0x422098指向的内存地址由009FC020改为 0F020020 ,那么再次读 [0x422098]取数据的时候,就能读到我补的那块数据。
继续运行,没有错误提示,弹出程序界面
完结了?并没有,网络验证基本上都会有心跳,果然开了窗口几分钟,程序就退出了。


再次载入程序,重走一遍,出现登录界面。接着在od 下 bp ExitProcess 断点,看看哪些地方导致退出的
没一会,程序再次退出,OD里面断下,这时候 按K看下堆栈,发现有一个调用很像退出,双击进去看
0019EC3C 75943074 ? KERNEL32.ExitProcess ucrtbase.7594306E
0019EC40 00000000 ExitCode = 0x0
0019EC48 7594303E ? ucrtbase.7594304A ucrtbase.75943039
0019EC80 75942FA1 ? ucrtbase.75942FAA ucrtbase.75942F9C
0019EC8C 00410AE4 ucrtbase.exit hahaha_dump.00410ADE 0019EC88 -- 这个很像
0019EC90 00000000 status = 0x0

确实有退出相关字样,到函数顶部下断点,再次重启程序,等触发,断下后返回到上一层

在这个函数,看注释是一个switch语句,到一定条件就退出,仔细分析

CMP EAX,0x8ED28
CMP EAX,0x8EE54
用EAX 比较,前面ADD EAX,0xC8 不断的给eax增加值0xC8(十进制的200),eax超过0x8ED28或0x8EE54就会退出程序。
那么正版可能就是在每次心跳成功之后,把eax置零,这样就能一直正常,因此我这里就直接让eax不增加就好了 改ADD EAX,0xC8 ==> ADD EAX,0x0
到这里 心跳和登录就处理完成了
完了吗?还没有!
只是把数据补了,但是数据是加密的,也没去分析。这个程序是时间制的,如果时间是在返回的加密信息里面,那么还是有可能出现到期的。因此要继续分析试试,回到OD,中文搜索,找到显示剩余时长相关的地方挨着下断,我这里就不截图了。
重新运行程序,断下来分析

找到了一组判断时间的,那么到函数顶部下断,再次重新运行程序

看到注释那里明显的settimer,定时器,OD分析出来间隔是1分钟。当程序首次运行,获取剩余时长后,设置定时器,每隔一分钟会进入程序判断一次时间,所以要到判断函数内部处理。

用正版和非正版账号登录,反复下断找差异,分析出大致逻辑 每次从[0x421358]读取剩余时间到eax,eax再减去1分钟,执行判断时间,没问题就继续运行程序,等一分钟再来判断一次;如果时间不足就执行弹窗退出啥的。
那么就简单了,把跳转处理了就好了。
到这里应该就算处理完了,就差测试还有没有别的暗装,测试没问题后,再用ue把ip端口修改,搭载自己的服务器上,就能正常运行了!
第一次破解软件也是第一次发帖记录,不是强壳也没有啥反调试,重在分析程序执行逻辑,大神们看看就好,轻喷。
留一个疑惑,哪个大哥解答下:
MOV EAX,DWORD PTR DS:[0x421358]
MOV EDX,DWORD PTR DS:[0x42135C]
CMP EAX,0xB7E7759
JNZ SHORT hahaha_dump.0040FC62
TEST EDX,EDX
JNZ SHORT hahaha_dump.0040FC62
MOV EAX,DWORD PTR DS:[0x422048]
MOV ECX,0xF4240
MUL ECX
MOV ECX,DWORD PTR DS:[0x422268]
ADD EAX,0xFFFF15A0
MOV DWORD PTR DS:[0x421358],EAX
ADC EDX,-0x1
MOV DWORD PTR DS:[0x42135C],EDX
JNZ SHORT hahaha_dump.0040FCE9
关于最后检测时间这里,还是有点不明白,上面我标红了3个跳转,前两个前面分别由CMP 和 TEST 指令比较后,判断是否跳转,但是最后一个JNZ SHORT hahaha_dump.0040FCE9不等于0就跳转,之前并没有进行任何比较,靠什么的值来判断是否跳转呢?
7650

被折叠的 条评论
为什么被折叠?



