好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 GTXFuryNano 于 2026-3-18 20:45 编辑
这两天笔者逛某视频软件时,发现一款声称可以专门针对运营商宽带赠送的路由器而优化的密码搜索软件,笔者下载后发现软件居然需要授权。
于是笔者在第二天想要回复作者时,却发现视频已经被删,无法联系。
本着测试软件的需求,笔者尝试对软件进行分析。
首先查壳,得知本软件为使用PyInstaller打包的Python文件,那么这下就好办了。
准备PyInstaller脱壳工具pyinstxtractor-ng,使用命令行对软件进行脱壳得到pyc文件。
观察信息得到核心文件为19.9.2.pyc文件,接下来就可以使用pyc反编译工具得到源代码了,因为笔者没有准备python环境,因此这里笔者使用在线的反编译工具对软件进行反编译。
这时候我们返回软件,来到激活界面,随意输入一个授权码,观察错误提示。
根据错误提示,打开反编译出来的代码,搜索这个错误提示,顺利定位到程序验证段。
验证部分代码如下:
[Python] 纯文本查看 复制代码 def verify_auth_code(self, code_str):
try:
code = int(code_str.strip())
if len(code_str.strip())!= 4:
return (False, '授权码错误')
else:
now = datetime.datetime.now()
current_hhmm = now.hour * 100 + now.minute
valid_times = set()
for offset in range((-60), 61):
target_time = now + datetime.timedelta(minutes=offset)
target_hhmm = target_time.hour * 100 + target_time.minute
valid_times.add(target_hhmm)
if code in valid_times:
return (True, '授权成功')
else:
return (False, '授权码已过期')
except ValueError:
return (False, '授权码错误')
except Exception as e:
print(f'验证授权码异常: {e}')
return (False, '授权验证失败,请重试')
我们来分析这段代码。
首先,代码会删除首尾的空格,将输入的内容转换为整数型,同时判断长度是否为4位,如不是则提示授权码错误,代码如下:
[Python] 纯文本查看 复制代码 code = int(code_str.strip())
if len(code_str.strip())!= 4:
return (False, '授权码错误')
当代码等于4位后,进入授权码运算部分,其逻辑为先获取当前系统时间,并生成为小时+分钟组成的四位数字,代码如下:
[Python] 纯文本查看 复制代码 now = datetime.datetime.now()
current_hhmm = now.hour * 100 + now.minute
随后,和符合程序算法要求的授权码进行比对,这里的算法是生成以当前电脑时间前后60分钟的所有小时+分钟组成的四位数字,格式如下:
[Asm] 纯文本查看 复制代码 假如当前时间是
14:00
那么符合程序算法要求的授权码为
1400
1401
......
1500
或
1359
1358
......
1300
其对应的代码部分是:
[Python] 纯文本查看 复制代码 valid_times = set()
for offset in range((-60), 61):
target_time = now + datetime.timedelta(minutes=offset)
target_hhmm = target_time.hour * 100 + target_time.minute
valid_times.add(target_hhmm)
如果你输入的是符合程序要求的4位数字,并且与算法比对成功,则返回授权成功。如果时间超出算法要求,则返回授权码已过期。代码如下:
[Python] 纯文本查看 复制代码 if code in valid_times:
return (True, '授权成功')
else:
return (False, '授权码已过期')
如果你胡乱输入一串数字但是通过了第一层的验证(正常来说不会到这一步,之所以会写这个很可能是做了个小的暗装,在汇编层面增加阻碍),则提示授权码错误或授权验证失败,请重试,这部分代码如下:
[Python] 纯文本查看 复制代码 if code in valid_times:
return (True, '授权成功')
else:
return (False, '授权码已过期')
except ValueError:
return (False, '授权码错误')
except Exception as e:
print(f'验证授权码异常: {e}')
return (False, '授权验证失败,请重试')
以上算法分析完毕,现在来实战一下。目前电脑时间是14:10,我们进入授权页面,输入1430试试。
顺利通过验证。证明分析无误。
在程序根目录生成了一个授权的文本型文件auth.lic,内容应该是本机的机器码。删除该文件后,软件重回未授权状态(笔者测试符合算法的数个授权码生成的授权文件内容均一致,这里仅讨论软件的授权算法故不作细致分析)。
软件方面目前测试功能也能正常使用,至于能否查找到WiFi的密码,这就要交给时间的验证了。
正好笔者目前使用的电脑内安装了易语言的编程环境,这里就简单通过易语言写一个keygen吧
总结:本次简单的展示了通过逆向软件内置算法计算授权码的分析流程,得益于软件能够轻松被脱壳和逆向,我们很容易就能看到软件的源代码,从而解析出其自带的授权码算法。事实上,本软件拥有多种可以绕过授权的方案:一是本文中展示的通过其算法计算出软件的授权码;二是可以通过X64DBG等逆向工具爆破检测是否授权或授权码检测部分;三是分析其授权文件auth.lic的算法从而仿冒已授权文件实现激活。
以上仅供讨论软件攻防技巧学习使用,如有需要还请大家支持正版软件!
附录:软件放到后面了,后附网络扫描病毒信息,部分杀毒软件报毒,不放心可放入虚拟机测试。
链接:https://980.lanzouu.com/iCUU53kwlqcf |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|
|