从“去除签名验证”说起
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">数天前坊间传闻有人破解了太极,最后<span style="color: black;">发掘</span>它其实是<span style="color: black;">运用</span> MT 管理器的“去除签名验证”这功能绕过了太极的签名<span style="color: black;">检测</span>,<span style="color: black;">而后</span>把界面做了<span style="color: black;">必定</span>的<span style="color: black;">调节</span>;并<span style="color: black;">无</span>对太极的内核做出什么实质性的破解。既然如此,今天我就跟<span style="color: black;">大众</span>聊聊,这个“去除签名验证”到底是怎么回事;<span style="color: black;">而后</span>给<span style="color: black;">大众</span><span style="color: black;">有些</span>思路,<span style="color: black;">怎样</span>去防范自己的应用被某些不怀好意的人莫名其妙地给篡改了。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">首要</span><span style="color: black;">咱们</span>需要<span style="color: black;">晓得</span>的是,Android 应用程序的安装包 APK 文件都必须有自己的签名,<span style="color: black;">无</span>签名的 APK 是<span style="color: black;">没法</span>直接安装到系统的。这个签名<span style="color: black;">实质</span>上是“数字签名”,它是现代<span style="color: black;">秘码</span>学非对<span style="color: black;">叫作</span>加密的重要应用,是当今互联网安全的基石。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">这儿</span>不打算仔细说明数字签名等技术性的内容,简单理解,你<span style="color: black;">能够</span>认为<span style="color: black;">研发</span>者<span style="color: black;">经过</span><strong style="color: blue;">公开的规则</strong><span style="color: black;">按照</span> APK <strong style="color: blue;">文件的内容</strong>给 APK 文件打上一个烙印,由非对<span style="color: black;">叫作</span>加密<span style="color: black;">保准</span>这种形状的烙印<span style="color: black;">仅有</span><span style="color: black;">研发</span>者自己能打出来;Android 系统在安装应用的时候会<span style="color: black;">经过</span>这种公开的规则计算烙印的形状,<span style="color: black;">而后</span><span style="color: black;">检测</span> APK 文件和它的烙印<span style="color: black;">是不是</span>对应,不对应就安装失败。一旦有人对 APK 文件的内容有涂改,<span style="color: black;">那样</span>这个烙印就会<span style="color: black;">出现</span>变化,<span style="color: black;">引起</span>系统在安装的时候<span style="color: black;">发掘</span>烙印形状不对而拒绝安装。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">那样</span><span style="color: black;">倘若</span>非要修改 APK 的内容并且能成功安装到系统,<span style="color: black;">咱们</span><span style="color: black;">能够</span>有若干种<span style="color: black;">办法</span>:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">修改 APK 之后,<span style="color: black;">咱们</span>打一个跟原来<span style="color: black;">研发</span>者一模<span style="color: black;">同样</span>的烙印。这种方式除非<span style="color: black;">研发</span>者自己把他打烙印的方式告诉你,<span style="color: black;">否则</span>基本不可能。这<span style="color: black;">是由于</span>非对<span style="color: black;">叫作</span>加密本身<span style="color: black;">保准</span>的,<span style="color: black;">亦</span>许有人觉得很神奇;打个比方,我告诉你一个数 10000323402614653,你能用简单的办法告诉我这是哪两个大于1的数字相乘得到的吗?对我<span style="color: black;">来讲</span><span style="color: black;">便是</span>一个简单的乘法,几秒钟搞定;对不<span style="color: black;">晓得</span>这两个数的人<span style="color: black;">来讲</span>,找出这两个数可能要花几天<span style="color: black;">乃至</span>基本不可能。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">咱们</span>把这个烙印抹除掉,<span style="color: black;">按照</span>那个公开的规则打上一个自己的烙印;<span style="color: black;">这般</span>修改 APK的时候安装到系统,系统会<span style="color: black;">发掘</span><span style="color: black;">咱们</span>新打上去的这个烙印是符合规则的,<span style="color: black;">准许</span><span style="color: black;">咱们</span>安装。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">破坏掉系统的验证机制,让系统不要验证这个烙印对不对,不管三七二十一都给我装上去(这<span style="color: black;">便是</span>Xposed 插件:核心破解的原理)。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">亦</span>许有人看到<span style="color: black;">这儿</span>就会<span style="color: black;">发掘</span>,这个系统的验证机制貌似<span style="color: black;">无</span>什么用啊?它只能<span style="color: black;">保准</span> APK 文件必须有合法的签名,并<span style="color: black;">无</span>办法<span style="color: black;">保准</span> APK 文件不被篡改!你看,别人要修改你的APK,只需要把你的名字抹掉,<span style="color: black;">而后</span>签上他自己的名字就<span style="color: black;">能够</span>了。怎么办呢?</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">咱们</span>必须在<strong style="color: blue;">应用程序的内部自己计算 APK文件的签名</strong>
</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">,<span style="color: black;">而后</span>跟<span style="color: black;">咱们</span>自己的签名信息做验证。一旦 APK 文件被修改,<span style="color: black;">那样</span>计算出来的签名不一致,<span style="color: black;">咱们</span>就会发现 APK 被篡改,<span style="color: black;">此时</span>候采取其他的处理<span style="color: black;">办法</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">Android 系统的这一整套签名机制,<span style="color: black;">包括</span>了从<span style="color: black;">研发</span>工具链(打包过程),Android系统本身(安装时签名验证)以及运行时(动态获取程序签名)<span style="color: black;">因此呢</span>,在“自己计算APK文件的签名”<span style="color: black;">这儿</span>,系统<span style="color: black;">供给</span>了公开的接口,<span style="color: black;">再也不</span>需要<span style="color: black;">咱们</span>自己去计算。这个公开的接口<span style="color: black;">便是</span> PackageManager 的 getPackageInfo 等一系列<span style="color: black;">办法</span>。<span style="color: black;">咱们</span>只需要在应用程序内部<span style="color: black;">经过</span>此接口获取签名<span style="color: black;">而后</span>验证签名就能<span style="color: black;">发掘</span>应用程序<span style="color: black;">是不是</span>被篡改了。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">倘若</span><span style="color: black;">全部</span>事情有这么简单,那这个世界就没<span style="color: black;">那样</span>好玩儿了。道高一尺,魔高一丈。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">假设,<span style="color: black;">倘若</span>别人修改了你的 APK 文件内容之后:</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">直接删去你做签名验证的部分代码,<span style="color: black;">而后</span>重新签名。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">修改 <span style="color: black;">getPackageInfo</span> 的返回值,让他返回他自己的签名。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">这般</span>,你的签名验证就形同虚设了。<span style="color: black;">因此呢</span>,针对上面<span style="color: black;">第1</span>个破解之法,<span style="color: black;">咱们</span>最好:</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">不要在 Java 代码中验证签名,最好在 native 验证;并且为了防止别人直接删除 native 函数调用,必须在 app 功能的核心<span style="color: black;">规律</span>的<span style="color: black;">重点</span>链路之中做验证;<span style="color: black;">这般</span> native 函数调用删除之后,app 压根<span style="color: black;">没法</span>工作。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">针对第二条,<span style="color: black;">咱们</span>有<span style="color: black;">非常多</span>种应对<span style="color: black;">方法</span>:</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">不<span style="color: black;">运用</span>系统<span style="color: black;">供给</span>的 <span style="color: black;">getPackageInfo</span> 接口,改用自己写代码解析和验证签名。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">检测 <span style="color: black;">getPackageInfo</span> 调用<span style="color: black;">是不是</span>被篡改,<span style="color: black;">倘若</span><span style="color: black;">状况</span>不对<span style="color: black;">亦</span>视为被篡改。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">日前</span><span style="color: black;">非常多</span><span style="color: black;">所说</span>的“一键去除签名验证”<span style="color: black;">便是</span><span style="color: black;">经过</span>动态代理修改<span style="color: black;">getPackageInfo</span> 的返回值。说来<span style="color: black;">亦</span>巧,大约在三年前,我在自己的个人博客上<span style="color: black;">仔细</span>介绍了这种方式的实现原理,其中部分代码如下图:</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_jpg/tNRVgEFx1ibVNZiaibRPiaWTvahAGZk36VQuyGrhEOdQDrnjLfdDkoia2ibS3up27KpY1Nu810txAnppViblrQAjOZ9Fg/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">当我打开<span style="color: black;">所说</span>的“破解版太极”的时候,我<span style="color: black;">发掘</span>有部分代码<span style="color: black;">反常</span><span style="color: black;">熟练</span>,仔细查阅一番之后<span style="color: black;">发掘</span>应该是<span style="color: black;">运用</span> MT管理器 的“去除签名验证”,其中部分代码应该源自<span style="color: black;">这儿</span>:</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_jpg/tNRVgEFx1ibVNZiaibRPiaWTvahAGZk36VQuiceRUDNARpqAsN4hm8yRQsPK76iczicWkJCISo28WWicicRhlMJvdFtPOmw/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">看到<span style="color: black;">这儿</span>的时候我觉得有点搞笑,拿着俺的代码去破解俺的应用。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">好了扯远了,动态代理 Package service 的方式<span style="color: black;">能够</span>修改 <span style="color: black;">getPackageInfo</span> 的返回值,<span style="color: black;">从而</span><span style="color: black;">诈骗</span>过应用程序内部的签名验证。针对这种破解<span style="color: black;">办法</span>,有一种很简单的<span style="color: black;">方法</span>,那<span style="color: black;">便是</span><strong style="color: blue;">检测 package service <span style="color: black;">是不是</span>被动态代理</strong>。一旦<span style="color: black;">咱们</span><span style="color: black;">发掘</span> package service 被代理,<span style="color: black;">咱们</span>就<span style="color: black;">能够</span>认为有人在搞事情。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">咱们</span>上面还<span style="color: black;">说到</span>,除了<span style="color: black;">经过</span> getPackageInfo 获取签名信息之外,<span style="color: black;">咱们</span>还<span style="color: black;">能够</span><span style="color: black;">经过</span>自己计算签名来验证签名。<span style="color: black;">实质</span>上,有<span style="color: black;">非常多</span> app <span style="color: black;">亦</span>是<span style="color: black;">经过</span>这种方式验证签名的,有<span style="color: black;">无</span>破解之法呢?答案是肯定的,<span style="color: black;">由于</span>只要计算签名,就必须读取 APK 文件,<span style="color: black;">咱们</span><span style="color: black;">能够</span>拦截 APK 文件读取的过程,让他返回原来正确的 apk 文件就能绕过这个过程。MT管理器的“去除签名验证”<span style="color: black;">加强</span>版应该<span style="color: black;">便是</span>这种<span style="color: black;">方法</span>的<span style="color: black;">详细</span>实现。<span style="color: black;">那样</span>,<span style="color: black;">怎样</span>反掉这种“拦截文件读取过程”的实现呢?<span style="color: black;">方法</span>自然是有的,<span style="color: black;">由于</span><span style="color: black;">通常</span>的方式是拦截 libc 中的 io 函数调用,只要<span style="color: black;">咱们</span>采取更底层的方式读取文件,就能拿到未被篡改过的数据;<span style="color: black;">或</span>直接检测关键函数<span style="color: black;">是不是</span>被hook就<span style="color: black;">能够</span>。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">总结一下,为了避免应用被<span style="color: black;">容易</span>破解,<span style="color: black;">咱们</span>应该这么做:</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"> 必须在App内部自己读取签名<span style="color: black;">而后</span>验证,并且<span style="color: black;">保准</span>这部分<span style="color: black;">规律</span>存在于 app 核心功能的<span style="color: black;">重点</span>链路中;最好把这部分<span style="color: black;">规律</span><span style="color: black;">运用</span> native 改写避免被一锅端。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">验证 app 内部 package / activity 等关键 service <span style="color: black;">是不是</span>被篡改。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">直接读取apk文件手动解析签名,<span style="color: black;">而后</span>做签名对比。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">验证系统 io 关键函数<span style="color: black;">是不是</span>被 inline hook。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">今天说了这么多<span style="color: black;">相关</span>“破解”的东西,<span style="color: black;">实质</span>上我是很反感把这种技术到处<span style="color: black;">乱用</span>的。<span style="color: black;">尤其</span>是把这种“一键破除签名”做成傻瓜式的功能<span style="color: black;">供给</span>给用户<span style="color: black;">运用</span>的<span style="color: black;">行径</span>,我真是不敢恭维。<span style="color: black;">非常多</span><span style="color: black;">研发</span>者不会<span style="color: black;">亦</span>压根<span style="color: black;">无</span>时间去对自己的应用做完善的签名验证,这种傻瓜式工具的<span style="color: black;">显现</span>直接<span style="color: black;">引起</span>了破解成本的大大降低,<span style="color: black;">非常多</span>基本没入门的小白<span style="color: black;">研发</span>者就能拿着这种<span style="color: black;">所说</span>的工具去明目张胆地破解<span style="color: black;">各样</span>应用。不仅损害了原作者的利益,还让破解者背负潜在的法律<span style="color: black;">危害</span>。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;"><span style="color: black;">另一</span>,我得给<span style="color: black;">大众</span>普及一下法律知识。破解应用并传播给他人<span style="color: black;">运用</span>是属于<strong style="color: blue;">违反刑法</strong>的<span style="color: black;">行径</span>:</span></p><span style="color: black;">第五条 以营利为目的,实施刑法第二百一十七条所列侵犯著作权<span style="color: black;">行径</span>之一,违法所得数额在三万元以上的,属于“违法所得数额<span style="color: black;">很强</span>”;<span style="color: black;">拥有</span>下列情形之一的,属于“有其他严重情节”,应当以侵犯著作权罪判处三年以下有期徒刑<span style="color: black;">或</span>拘役,并处<span style="color: black;">或</span>单处罚金:</span><span style="color: black;"> (一)<span style="color: black;">违法</span>经营数额在五万元以上的;</span><span style="color: black;"> (二)未经著作权人许可,复制发行其文字作品、音乐、电影、电视、录像作品、计算机软件及其他作品,复制品数量合计在一千张(份)以上的;</span><span style="color: black;"> (三)其他严重情节的情形。</span><span style="color: black;">以营利为目的,实施刑法第二百一十七条所列侵犯著作权<span style="color: black;">行径</span>之一,违法所得数额在十五万元以上的,属于“违法所得数额巨大”;<span style="color: black;">拥有</span>下列情形之一的,属于“有其他<span style="color: black;">尤其</span>严重情节”,应当以侵犯著作权罪判处三年以上七年以下有期徒刑,并处罚金:</span><span style="color: black;"> (一)<span style="color: black;">违法</span>经营数额在二十五万元以上的;</span><span style="color: black;"> (二)未经著作权人许可,复制发行其文字作品、音乐、电影、电视、录像作品、计算机软件及其他作品,复制品数量合计在五千张(份)以上的;</span><span style="color: black;">(三)其他<span style="color: black;">尤其</span>严重情节的情形。</span>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">刑法跟民法<span style="color: black;">区别</span>,那可不是闹着玩儿的。<span style="color: black;">重视</span>到<span style="color: black;">无</span>,<strong style="color: blue;">就算不是以盈利为目的</strong>,复制1000份以上就算严重情节了,做了个破解版别兴冲冲地去分享,一不小心你就得进去了。</span></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">好了今天就到<span style="color: black;">这儿</span>了,<span style="color: black;">大众</span>晚安!</span></p>
谷歌外链发布 http://www.fok120.com/
页:
[1]