记录一次 disassembling crack经历

来源:互联网 发布:淘宝厨房用品 编辑:程序博客网 时间:2024/06/03 21:04
记录一次 disassembling crack经历

引子


此文目的

记录破解经历,总结 disassembling 的经验,以备参考;同时给不了解的人初步认识 disassembling 到底是个什么?


针对读者

自己以及那些对 disassembling 破解激活程序好奇又不太了解的(非)IT人士,如果您已经是安全领域砖家,就不必浪费你的时间了,因为本文涉及的知识点都过于low


特别声明

因涉及版权问题(一年前有过案例),本文不会具体抛出如何制作激活码,而是教你破解知识,有能力的人可以自行破解,笔者仅从技术探讨角度撰写本文,不提供有偿、无偿破解服务,如需激活码,请自行x宝买别人的吧。(GNU也得有点知识产权意识!)


crack对象

*315nav(0223)四维地图校验程序中的hash算法

crack难度

LOW


crack原因

刚买车一个月不到,无耻的进口大众死活不给我升级一年半以前的地图,加上爱卡的无敌小xixi已经crack成功,x宝的crack版激活码遍地都是,让我深信crack的可行性非常高!可以肯定这个激活码是离线本地算法,不涉及远端服务器,再就是很多人对这次crack嗤之以鼻,更加剧了我挑战的欲望。虽然我即使安装了新版地图,也不大会用,但是我打算对ARM汇编系统了解一下


crack工具&材料

disassembling tool No1 IDA, 0223版system程序(虽然名字为system.elf但是Bosch对elf头部和符号表都做了处理,用readelf和objdump都无法正确获取信息,还是用高版本的IDA正确转义出ARM汇编);导航地图数据包;已知可用的导航地图激活文件


知识点概述

ARM:嵌入式电子设备主流CPU架构,类似桌面PC的x86,运行二进制机器码
disassembling :通过对机器码逆向译码得到汇编指令及伪码,从而分析程序代码的执行逻辑
IDA:功能强大的 disassembling 工具,可以转义众多指令集,hacker必备工具,就像vi,busybox
HASH值:散列数值,主要用来校验数据的完整性,具有不可逆性和抗冲突性以及雪崩效应

破解概述

*315nav的map校验原理

大致说来,利用DID和timestamp等信息作为数据原文,采用一种HASH算法生成散列值并保存为map激活文件。系统程序在加载新地图时会去按照“相同”方法生成hash值,在与激活文件中保存的hash值进行比对,相同即成功激活map

crack大致思路

 disassembling system.elf找到验证地图激活码(xml文件)的这段程序,分析从xml文件读取的数据存放在了哪里?再看看哪个地方用到了这些数据,仔细辨别出用了哪一种hash算法,具体如何调用hash算法的库函数的等等,最后将生成方式搬移至x86平台的vc程序中进行相同的hash算法,生成出来的hash值与手头上正确的激活码中的hash比较,从而评判自己的crack程序是否正确

关键crack过程解析

(1)循环比对生成hash和激活码中的是否一致

 35 loc_8594E                               
 36                 LDR             R2, [R6,R4]  //definitely means hash from XML file
 37                 LDR             R1, [R5,R4]  //cal hash
 38                 CMP             R1, R2  //checking hash1
 39                 BNE             loc_85968
 40                 LSRS            R1, R1, #1      //'hash2' is generated by shifting 1 wi    th 'hash1'
 41                 LDR             R2, [R6,R7]
 42                 CMP             R1, R2  //checking hash2
 43                 BNE             loc_85968
 44                 CMP             R4, #0x14
 45                 BEQ             loc_85988
 46                 ADDS            R4, #4
 47                 ADDS            R7, #4
 48                 B               loc_8594E
上述汇编码较为简单,是一个loop循环,每个循环判断32-bit(4个bytes)hash value是否同激活码中的一致,一同5个循环;可见hash value为20bytes(160-bit)。
值得说明的是,这里额外判断了另外20bytes,其数值为真实hash值通过移位得来,
这个移位得到的第二组“hash”值就是用来迷惑大家的!
(补充一点0160程序和0223程序的这个冗余160-bit生成算法不一样!)

(2)sha1 update算法片段

150       ADD     R0, SP, #0xE8+var_70
151       BL      sub_BA550
152       LDR     R0, [SP,#0xE8+var_88] //cid
153       BL      sub_1B2C20 //strlen
154       MOVS    R2, R0
155       LDR     R1, [SP,#0xE8+var_88]
156       ADD     R0, SP, #0xE8+var_70
157       BL      sub_BA550
上述代码中,sub_BA550为sha1的update算法(关于sha1的算法原理,需要网上搜索了解下,包括xml的组成结构),其中var_88存放DID,sub_1B2C20是strlen,var_70局部变量是ctx(即sha1算法中的需要的结构体变量)。至于如何猜出BA550是update函数,首先你要去了解sha1算法,找个开源库看看,你会发现恍然大悟

(3)其他代码片段就不列举了

阅读汇编代码习惯后,并非想象的那么难,建议不要去看IDA转义的C伪代码,不如直接看汇编码直接和准确!

crack技巧总结

(1)Disassembling分析代码行为的难点在于,strip并且缺少符号表,你不知道全局变量的名字及用处,对于局部变量也是要通过使用来揣测其含义,这点就是最难!有时候连strlen,strcpy这种简单地库函数你都要根据用法和传入参数判断其含义,因为汇编码信息量很大,加上优化的跳来跳去,短时间内很难分析一个函数的用处,何况有的函数调用函数甚至递归使用。
(2)IDA反汇编出来的某些代码段是有问题的,比如红色字体部分,不知道什么原因,只能通过上下文猜测了
(3)破解除了需要冒险和挑战精神外,还需要有想象力,猜测程序员的心思,比如为何弄成这么一个奇怪的偏移量?凡是总是有原因,我当时因为想当然,看错一个offset,耽误了好几天。总之,也不能一心埋头死看,多换换思路,出去放松做做运动,时不时就会浮现另一个尝试的方向。
(4)立即数和字符串是破解过程中的灯塔,他们以ASCIIcode和二进制存在于operate code中,比如数据初始化,log信息等,如果没有这些字符串,破解难度会非常大,尤其是这种纯粹静态分析汇编代码来揣测程序执行行为的破解
(5)关于如何查询ARM指令的含义,直接ARM手册查询,建议用DUI0473J_armasm_user_guide,ARMv7和v8的文件过大,过于庞杂看的眼花缭乱!只要不是临时性的了解,系统学习一定要以official handbook为蓝本,比如ARM架构/指令学习,Android开发,GNU MAKE,GCC等等,网友的中文博客都良莠不齐,既不精炼,又不准确!像IBM知识库中的文章还是不错的,还有台湾和新加坡的一些大牛写的也很好!整体来说国内的技术类文章写得好的远不如国外多.......
-------------------------------------------------------------------------------------

后记

期间有几次我想放弃的,心里盘算着,从技术学习角度,目的已经达到了,整个代码已经穿过一边,何必去钻牛角尖?非要查出来最后那个bug?话说回来,即使破解了,我也不用这个破烂*315导航。其实这如同很多初创型公司,很多都在即将走向成功的前夜,大家坚持不住而散伙。
最后,某一天晚上,我终于决定放弃,不管怎么样,总结下,发个帖,留一个手记,以后留用。但是!在整理手记的过程中,又发现一个疑点,细致一分析,果真原先分析有误,通过一个晚上的努力,当看到三个sample都运行正确的那啥那,没有什么激动,只有无穷无尽的艰辛印记在脑海中回荡。(本以为当晚可以睡个安稳觉了,结果却失眠了!)
0 0