1. 背景
群里有个小伙伴学习设计加密方法,如同某商用软件输入注册码后就能使用扩展功能。设计时他很自然的想着所写的加密措施是否足够健壮安全,是否有什么方法可以绕过加密检查,也就是破解。
权限管理仅在启动后检查一次注册码是否有效——一个 if 判断,他也认定,若反汇编软件只要 欺骗过这条判断加密措施荡然无存。
群里我给他一个破解设计思想:“利用nop指令覆盖相关代码绕开鉴权”。
2. 演示
下面是我做的一个例子演示运用nop指令破解:软件a.out在破解前不是vip,直接修改二进制文件后拥有了vip权限。
它是怎么实现的呢?先看看源码,源码逻辑很简单,仅仅判断用户有没有money,没有钱当然没权限。
为了便于阐述原理,我编译源码带上调试选项:-g,生成的可执行文件a.out反汇编后就能同时看到源码和汇编内容。
void main(){ int money = 0; int vip = 1;
asm(“nop”); asm(“nop”); asm(“nop”); asm(“nop”); asm(“nop”); asm(“nop”); asm(“nop”); // 无效指令 if (money == 0) { vip = 0; }
printf(“money %d vip %d
”, money, vip); if (vip == 1) { printf(“授权成功
”); } else { printf(“未授权
”); }}
a.dis 是反汇编文件,138行是vip=0的汇编代码 “movl $0x0,-0x4(%rbp)”, 对应机器码为 “c7 45 fc 00 00 00 00” , 左侧窗口内容是a.out二进制文件,文件第1168字节位置找到相应机器码。
3. 开始破解
接下来这么修改呢?轮到主角nop指令登场。
据我所知,每种处理器都会有一条瞎忙活的空指令nop(no operation)。cpu遇到nop指令仅空转,浪费你的电费,不干实际有意义的事情(其实空转也是为了更有意义的发挥效能,上班摸鱼是不是能更有活力!), 那么想办法把“vip=0”这条语句生成7字节机器码 “c7 45 fc 00 00 00 00”,替换成nop指令的机器码,是不是就破解了呢?如果nop机器码是2字节,我的还需考虑指令完整性对齐,覆盖机器码长度必须是nop机器码整数倍。
问题来了:x86的nop指令对应的机器码是什么呢?习惯性百度搜索 “x86 nop 机器码”。我这里介绍更简洁直接的方法,需要查询什么反汇编指令,问问反汇编工具objdump。
有没有注意到源码里我写了若干行指令 ‘asm(“nop”)’,c语言可以嵌入汇编,查看反汇编文件a.dis告诉我nop指令最终编译得到的机器码是什么。
反汇编后nop的机器码是 0x90。谢天谢地,芯片工程师设计指令操作码时只给它一个字符。任何正整数都是1的整数倍,不用考虑指令完整性对齐。
顺带留给读者一个思考题:对于x86这种 cisc 复杂指令集,把nop指令的机器码设计成只有一个字节,有什么好处?
替换后的源码 “vip = 0” 这行如同被注释掉一样。
保存修改,再次执行,看到了吗!已经得到了vip权限。
智慧镜面显示屏将打造一个全新的广告投放模式
意法半导体专注三大领域 提前布局应对半导体市场
客户案例丨无锡农商行携手芯盾时代,打造行业反欺诈标杆
5G短信和维信短信之间是怎样的关系
中芯国际:正积极与梁孟松博士核实其真实意愿
如何用NOP指令覆盖相关代码绕开鉴权
破壁机如何进行气密性防水检测
电容和电感组成LC振荡电路原理和应用电路分析
细节见真章,一组图让你看清直10的矛与盾
2019年上半年全球车载面板出货7900万,大尺寸化趋势明显
蓝蜂物联网水肥一体化MQTT应用案例
你知道吗?电缆故障测试仪怎样测试漏电情况?
如何在物联网设备开发中增加安全性?
电压降怎么测量
美国内政部发布严格测评报告,大疆“政企版”无人机获安全许可
6个最佳树莓派智能魔镜项目介绍
小米Note2亮银黑真机图鉴,综合表现不输于三星edge
华为nova4e入手体验测评 性能完全不必担心足够满足日常使用
OriginOS截胡华为鸿蒙系统 vivo OriginOS系统有何优势
微软Edge HTML风格滚动特性让Chromium滚动变得更加灵敏