记一个手游app数据文件的破解

出于一些很猥琐的需要,同时自己也想做一些新鲜的尝试,周末用了大半天时间破解了某款手游的数据文件。

过程比我预想的要顺利,主要原因还是我们开发人员的懈怠,咳咳。

过程如下:

  • 下载安装包,解压,发现几个XXX.db文件,最感兴趣的是一个50多M的XXX.db
  • 用UltraEdit打开XXX.DB文件,没有任何线索。只发现这几个文件有相同的文件头
  • 搜索.DB文件可能是什么文件,发现了开源库sqlite,这是一个轻量级的数据库组件,IOS就用了这个,顿时眼前一亮
  • 下载sqlite的命令行工具,发现打不开.DB文件
  • 自己存了一个sqlite的数据库文件做测试,发现根本就是明文存储的
  • 是时候祭出神器IDA pro了,反汇编libXXX.so,发现大量sqlite3_XXX函数,.db文件应该是sqlite数据库文件没错
  • 搜索sqlite加密的相关信息,官方的加密实现是需要授权的,但有一个wxsqlite的开源实现。私下推测该app用了wxsqlite
  • wxsqlite是AES算法加密的,必须找到密匙,否则无法解密,心里凉了半截
  • 继续看反汇编,找到keySqlite函数,发现key就明文写在代码里,是一串1....,额
  • 下载wxsqlite,写了几行代码进行测试,发现依然打不开。自己创建了一个加密数据库文件,发现跟app的db文件差别很大。
  • 阅读wxsqlite的代码,发现加密算法是在sqlite3Codec函数中调用的。在汇编中找到sqlite3Codec,发现它调用了一个My_Encrypt_Func(呵呵)
  • 阅读My_Encrypt_Func的汇编代码,发现就是按字节取反(呵呵呵)
  • 写个小程序,将db文件按字节取反。再用UltraEdit打开,看到了熟悉的明文信息
  • 这回数据文件可以用sqlite命令行打开了,dump成txt文件,得到表结构和所有的数据
  • 最后是那个50多M的db文件。打印出表结构发现是一个字符串name和一个二进制对象。写个小程序,遍历所有表项,将二进制对象存成png文件。任务完成

收获:

  • 如果是用wxsqlite加密实现,并且密匙是通过网络获取的,那就得先想办法在运行时hook api截获密匙。破解难度会上升一大截...
  • 加密函数的arm汇编看上去效率很低....让我好生奇怪。写了一段同样的代码自己编了一下,发现该lib是debug的,这....
  • 加密相关的函数名暴露在动态库中是很危险的,给函数声明加上static,export符号表中没有了,我们就只能看到一个地址跳转啦

反汇编出来的加密函数,跟自己写的并用debug编译出来是一样的

.text:002C46E0                 EXPORT My_Encrypt_Func
.text:002C46E0 My_Encrypt_Func                         ; CODE XREF: sqlite3Codec+11Cp
.text:002C46E0                                         ; sqlite3Codec+190p
.text:002C46E0
.text:002C46E0 var_3C          = -0x3C
.text:002C46E0 var_38          = -0x38
.text:002C46E0 var_34          = -0x34
.text:002C46E0 var_30          = -0x30
.text:002C46E0 var_28          = -0x28
.text:002C46E0 var_20          = -0x20
.text:002C46E0 var_4           = -4
.text:002C46E0
.text:002C46E0                 STR     R11, [SP,#var_4]!
.text:002C46E4                 ADD     R11, SP, #4+var_4
.text:002C46E8                 SUB     SP, SP, #0x1C
.text:002C46EC                 STR     R0, [R11,#0x20+var_30]
.text:002C46F0                 STR     R1, [R11,#0x20+var_34]
.text:002C46F4                 STR     R2, [R11,#0x20+var_38]
.text:002C46F8                 STR     R3, [R11,#0x20+var_3C]
.text:002C46FC                 MOV     R3, #0
.text:002C4700                 STR     R3, [R11,#0x20+var_28]
.text:002C4704                 B       loc_2C473C
.text:002C4708 ; ---------------------------------------------------------------------------
.text:002C4708
.text:002C4708 loc_2C4708                              ; CODE XREF: My_Encrypt_Func+68j
.text:002C4708                 LDR     R3, [R11,#-0x10]
.text:002C470C                 LDRB    R3, [R3]
.text:002C4710                 MVN     R3, R3
.text:002C4714                 STRB    R3, [R11,#-9]
.text:002C4718                 LDR     R3, [R11,#-0x10]
.text:002C471C                 LDRB    R2, [R11,#-9]
.text:002C4720                 STRB    R2, [R3]
.text:002C4724                 LDR     R3, [R11,#-0x10]
.text:002C4728                 ADD     R3, R3, #1
.text:002C472C                 STR     R3, [R11,#-0x10]
.text:002C4730                 LDR     R3, [R11,#-8]
.text:002C4734                 ADD     R3, R3, #1
.text:002C4738                 STR     R3, [R11,#-8]
.text:002C473C
.text:002C473C loc_2C473C                              ; CODE XREF: My_Encrypt_Func+24j
.text:002C473C                 LDR     R2, [R11,#-8]
.text:002C4740                 LDR     R3, [R11,#-0x14]
.text:002C4744                 CMP     R2, R3
.text:002C4748                 BCC     loc_2C4708
.text:002C474C                 MOV     R3, #0
.text:002C4750                 MOV     R0, R3
.text:002C4754                 SUB     SP, R11, #0
.text:002C4758                 LDR     R11, [SP+0x20+var_20],#4
.text:002C475C                 BX      LR
.text:002C475C ; End of function My_Encrypt_Func

用release编译的,运行效率怎么也得差几十倍

.text:00001D88 ; My_Encrypt_Func(unsigned char *, unsigned int, unsigned char *, unsigned int)
.text:00001D88                 EXPORT _Z15My_Encrypt_FuncPhjS_j
.text:00001D88 _Z15My_Encrypt_FuncPhjS_j
.text:00001D88                 MOVS    R3, #0
.text:00001D8A                 B       loc_1D94
.text:00001D8C ; ---------------------------------------------------------------------------
.text:00001D8C
.text:00001D8C loc_1D8C                                ; CODE XREF: My_Encrypt_Func(uchar *,uint,uchar *,uint)+Ej
.text:00001D8C                 LDRB    R2, [R0,R3]
.text:00001D8E                 MVNS    R2, R2
.text:00001D90                 STRB    R2, [R0,R3]
.text:00001D92                 ADDS    R3, #1
.text:00001D94
.text:00001D94 loc_1D94                                ; CODE XREF: My_Encrypt_Func(uchar *,uint,uchar *,uint)+2j
.text:00001D94                 CMP     R3, R1
.text:00001D96                 BNE     loc_1D8C
.text:00001D98                 MOVS    R0, #0
.text:00001D9A                 BX      LR
.text:00001D9A ; End of function My_Encrypt_Func(uchar *,uint,uchar *,uint)
时间: 2025-01-04 15:35:37

记一个手游app数据文件的破解的相关文章

一个好的手游APP如何加强海外推广

本文是笔者通过一位长时间在美国游戏公司工作的朋友Juno所分享的经验总结出来的一篇文章,他对于手游APP在国外的推广有着很深的了解.简单地讲:作为一名应用程序开发者来说,或多或少都对推广方面有一些了解.目前,无论是在国内或者国外,互联网都是信息传播最快,覆盖面最广的一种推广方式,但是具体的推广方式还让笔者慢慢道来! 关于海外推广,首先想到的是熟悉所要推广的国家,如果不熟悉所要推广的市场,还可以找专业的无敌勇士科技帮助完成推广任务;在此之前,或许大部分人都已经在网上了解过一些推广的方法和途径了,比

手游App山寨破解的三宗罪:背后产生灰色的产业链!

2013年手游行业的规模与收入均实现了大幅增长,发展势头强劲.权威数据显示,我国移动游戏市场实际销售收入从2012年的32.4亿猛增到2013年的112.4亿元,同比增长了246.9%,手游用户从2012年的8900万迅速增长到2013年的3.1亿,增长幅度高达248.5%.巨大的用户数和迅猛的用户增长速度正使我国成为手机游戏大国. 然而,在手游高速发展的同时,由于监管.审核等方面存在着漏洞,手机游戏软件被破解后注入恶意代码.盗取用户财产.窃取用户设备信息的现象屡见不鲜.如今,种类繁多的手游Ap

手游App山寨破解的三宗罪:背后已成产业链

2013年手游行业发展势头开始越显强劲,手游开发者的规模与收入均实现了大幅增长.但是,在手游高速发展的同时,由于手游行业的快速的发展,一些问题,例如手游App破解.盗版也日益凸显.手机游戏软件被破解后注入恶意代码.盗取用户财产.窃取用户设备信息的现象屡见不鲜.如今,种类繁多的手游App市场,繁华背后暗藏多重隐患,致使手游App背上了"吸金炸弹"的罪名. <2048>引发的"连锁反应" <2048>是一款现象级的游戏,其在全球的风靡程度甚至超越

玩手游虽易保安全不易,打造手游App定制加密方案

据权威统计,2013年移动游戏市场规模达到109亿,其中智能机游戏市场占74%,约为80亿,保守估计到2014年智能机游戏市场规模将超过200亿.手机游戏成为了很多用户休闲娱乐的最佳选择. 但是,手机游戏快速发展的同时,滋生了很严重的安全问题.很多游戏被盗版.二次打包.非法汉化.恶意植入病毒,导致游戏收益和品牌受到很严重的影响.而游戏修改器.外挂的泛滥直接影响游戏团队的生存,因为很多知名游戏被破解后,收费模式被改为免费:例如道具和装备免费,积分和金币自动上调等.这对于一款投入大量人力财力的游戏公

H5游戏和手游APP的差异在哪里?

首先,对于一款游戏来说最大的两个问题就是提升变现能力和对用户粘度问题的解决,这两个因素也是推动着游戏生态圈不断发展的终极动力!现在就以这两个角度对现在火热的H5与手游App进行一个大概区分! H5能已被逐渐证明的变现方式包括了以下几点:1.广告:2.游戏内道具付费:3.跨屏精准营销:4.企业定制服务.而手游App则以的付费模式基本和网络游戏的模式差不多 以道具收费为主,也包含了下载即付费(一般多为单机游戏) 设置付费点付费:当你玩到一定关卡的时候会提示你付费才能继续,(多为单机游戏).还有一种是

《爸爸去哪儿》手游App遭病毒入侵

芒果台推出的<爸爸去哪儿>手机游戏伴随着<爸爸去哪儿第二季>的热播,迅速冲上了热门游戏排行榜,向来无孔不入的手机病毒也趁机入侵.据爱加密安全专家介绍,爸爸去哪儿.爸爸去哪儿-五萌宝.爸爸去哪儿之大批评等三款相关手游App已经遭遇a.espense.chappie病毒感染.目前,这些手机游戏都散布在各大手机论坛.非安全电子市场供用户下载安装. 由于这些伪装成<爸爸去哪儿>游戏的手机病毒打开界面十分逼真,用户根本无法觉察,病毒在手机后台偷偷运行.可以私自操作手机短信,并通过

着手一个手游项目的思考

虽然个人阅历有限,但也对端游,页游,手游都有涉及. 目前正值筹备新项目的时候,又面临着技术选型等方面的问题.记录在此,以整理思绪 技术选型 1.前后端的技术选择 前端我觉得要按以下方向来  平台-〉3Dor2D->游戏类型 不同的引擎总是有自己擅长的一面,而强扭的瓜总不可能太甜. 所以,我一向认为,适合的引擎能够更容易做事情. 同时,我也不建议自己撸引擎. 要撸,就自己撸着玩,不要把自己的坑,带到项目中来. 端游,页游就不讨论了,目前很少有公司新开这类型的项目. 我们来说说手游. 对于手游的选择

手游App为何屡遭山寨???

手游App为何屡遭山寨 爱加密给你支招防护,2013年移动游戏市场规模达到109亿,其中智能机游戏市场占74%,约为80亿,预计到2014年智能机游戏市场规模保守估计将超过200亿.手机游戏的快速发展滋生了很严重的山寨盗版问题. 如何防止山寨App,"不山寨,毋宁死!"已经成为时下手机游戏公司的一种潜规则,开发者辛辛苦苦研发出来的手机游戏被山寨党轻松窃取核心代码,并制造出各种版本的"孪生兄弟",严重影响了正版游戏的收益和品牌形象. 归根结底,手游App被山寨的原因主

开发一个手游需要的工种

1 策划类 =.= 包括数值,系统,感觉手游主要有这两个就欧克了. 2 程序类, 大体分客户端和服务器. 客户端主要负责处理人机交互和表现,细分可以分为引擎程序(性能调优,各种机器适配,写个shader表现啦什么的), 工具程序(为美术和策划减少各种体力活,提高生产效率), ui程序(熟悉项目的ui库,能实现变态各种ui需求和扩展控件), gameplay程序(逻辑程序,好吧,在国内手游来说就是自由人,全能打杂..,什么sdk接入啦,支付购买啦,什么的) 主程序(设计整体架构,把控方向,chec