前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于反编译的搜索

【技术文章】apk的反编译、汉化、修改,实现sd2flash - 原道 Window - iMP3随身影音 - 设为首页收藏本站我的财富 开启辅助访问 切换到宽版 请 登录 后使用快捷导航没有帐号?注册 用户名 Email 自动登录 找回密码 密码 登录 注册 只需一步,快速开始 快捷导航 首页MP3/4平板耳机前沿配件行业产品论坛BBS家园Space莫凡 每日签到 电子书阅读器移动电视上网本智能手机GPS 搜索 搜索 热搜: 录音笔 烈焰 蓝牙耳机 手机 kindle 移动电源 手表 视网膜 艾利和 音响 电脑 音箱 蓝牙 耳机 x1050 移动硬盘 X1050 视网膜屏 ipc tf10 ue900 mx985 本版帖子用户 iMP3随身影音&raquo;论坛 &rsaquo; ..:: 品牌频道 ::.. &rsaquo; 原道 Window &rsaquo; 【技术文章】apk的反编译、汉化、修改,实现sd2flash 莫凡个性配件 imp3.net出品商家、网友交易区每月4千现金,iMP3财富攻略找喜爱的产品,点这里 欢迎访问平板派新浪微博pb派平板软件精选请注意账户安全未收到验证邮件请联系:imp3net@163.com 12 / 2 页下一页 返回列表 查看: 10029|回复: 39 [其它] 【技术文章】apk的反编译、汉化、修改,实现sd2flash [复制链接] vivi_an vivi_an 当前离线 积分1518 该用户从未签到 电梯直达 楼主 发表于 2011.1.12 17:00 | 只看该作者 |倒序浏览 |阅读模式 本帖最后由 vivi_an 于 2011.1.12 18:05 编辑 这篇文章是针对Android系统的产品而言(而不是只针对原道产品),不过,我只有一台N5p那就发这儿了(貌视坛子里没有技术区)。如果是打酱油的高手路过,请继续去打酱油,当然也欢迎围观。vivi_an首发imp3.net,转载请注明出处。   主要目标:对于没有SD卡但想要安装运行那些只有SD卡支持的apk程序的(比如仙剑)。   次要目标:apk程序反编译、汉化、修改程序的数据读取和保存路径。   本文针对“思维导图 Thinking Space Pro 2.16”的apk程序ThinkingSpacePro.apk进行修改。题外话,这程序人手配备一个,不错的东西。 一、相关工具(针对windows系统)JDK:http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载windows安装版的程序,安装后不用管它了。Apktool:http://code.google.com/p/android-apktool/ 下载apktool-install-windows-2.2_r01-3.tar.bz2和apktool1.3.2.tar.bz2,用winrar解压后把解压出来的文件都放在一个目录下,比如:E:\apktool\ 下(为简单起见,下文都用这个路径为apktool工作目录)。Auto-Sign签名工具:N/A 二、反编译   说要把apk“装冰箱(反编译)”分三步走:第一步:先把apk程序(这里用ThinkingSpacePro.apk)程序放到 E:\apktool\ 下。第二步:启动windows的cmd.exe,用命令行cd到 E:\apktool 目录下。第三步:键入命令 apktool d ThinkingSpacePro.apk复制代码 这个命令的格式是: apktool d xxx.apk output复制代码 其中 d 参数用来指示工具要进行反编译操作,xxx.apk是要反编译的程序,output 源码输出的路径。如果最后不指定输出的路径,默认是放在同目录下的 xxx 文件夹下(即apk程序名称去掉.apk后的名称)。如果你的apk文件名称中有空格,那键入命令时用双引号引起来,不过为方便起见,反编译之前把apk文件名中的空格都去掉先。 运行反编译命令后会在同级目录下得到一个 ThinkingSpacePro 文件夹,源文件都在里面了。 三、汉化   汉化这个比较简单,在反编译apk程序得到源码后,一般程序的文档都放在res目录下,都是些xml文档,用记事本之类的打开查看一下,一般都会比较容易看出来哪些是可以汉化的文本。这个就不去弄它了。可能不同程序还有不一样的,反正英语差点,汉化这种事我也不去深究了。你如果只想汉化的话,进res文件夹找找,完成汉化后就可以直接重新编译程序了(最后讲编译),不用太多的编程知识。思维导图本身支持多国语言(都在源文件的res文件夹里),所以也用不着汉化了。但大致的汉化过程就是这样了。   另外貌视还有Android ResEdit之类的专用汉化软件,不用搞什么反编译,用起来可能更简单。 四、SDcard to Flash   对于N5p,app2sd只是一个传说,不过sd2flash下面就可以实现。用SD卡玩机的人可以无视。   下面这个是本文的重点。目的就是要修改程序的默认数据读取和保存路径,主要针对那些必须有SD卡才能使用的程序。比如说一个游戏它分为主程序和游戏的关卡数据。主程序可能只有1M,但游戏关卡数据可能是几十甚至上百M,这类游戏一般是主程序安装在内存中,而关卡数据会要求你安装或下载到SD卡上。如果你没有SD卡,那就玩不成了。我之所以要改它的路径,就是不想让它占我的SD卡,N5p不是自带8G(实际好像只有6.5G)Flash闪存么,那为什么不用它?下面的修改就是要欺骗apk程序,我们的Flash闪存就是程序你要的SD卡。   正式修改时,除了要修改所有源文件(主要是.smali程序源文件)中的/sdcard 路径,使之指向 /flash 外,还要修改含有 Environment.getExternalStorageState 和 Environment.getExternalStorageDirectory 的源文件,前者用于检测是否安装SD卡,后者获取SD卡的路径。   那么从头来修改思维导图 Thinking Space Pro 2.16的数据读写路径。原版程序你必须要有SD卡才能正常保存你的数据,修改之后,所有数据读取、保存都针对N5p自己的Flash闪存,从而解放SD卡。用apktool反编译ThinkingSpacePro.apk apktool d ThinkingSpacePro.apk复制代码 反编译后得到ThinkingSpacePro文件夹,存放着程序源文件。使用UltraFileSearch搜索ThinkingSpacePro文件夹中所有包含"sdcard"文字的文件(搜索时,UltraFileSearch去掉"Whole word"的选项)。没有UltraFileSearch可以用windows系统自带的搜索工具,只是要用搜索文件中包含有指定内容的文件,而不是搜索文件名(我的系统搜索工具坏了,所以用UltraFileSearch这个软件代替)。对搜索到的文件(主要是其中的.smali程序源文件)用记事本打开编辑,将文件中所有 "/sdcard" 的字串改成 "/flash" 字串,这样将原先指向 /sdcard 的路径全部指向 /flash 路径。搜索程序中判断SD卡是否安装的方法,修改它使判断SD卡是否安装的方法返回True。一般的检测SD卡是否安装的方法是用下面的代码判断的: Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)复制代码 所以用UltraFileSearch查找包含有"getExternalStorageState"字串的文件。 有些软件会用这个检测,有些软件则不用它,所以找不到的话可以窃喜:不用那么复杂了。 针对思维导图这个程序,在App.smali中会找到(其它程序不一定在这里)。具体查找到的代码如下: .method public static isSdPresent()Z .locals 2 .prologue .line 476 invoke-static {}, Landroid/os/Environment;->getExternalStorageState()Ljava/lang/String; move-result-object v0 const-string v1, "mounted" invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v0 return v0 .end method复制代码 这个是Dalvik opcodes,修改它需要一点专业知识(参考这里), 修改成如下(后来发现似乎只需要将最后的 return v0 改成 return 1 就可以了,不过没去做测试,对Dalvik opcodes尚未仔细研究过): .method public static isSdPresent()Z .locals 2 .prologue .line 476 const-string v0, "mounted" const-string v1, "mounted" invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v0 return v0 .end method复制代码 改后因为v0始终等于v1,所以这个方法就返回True,这样就欺骗程序我们已经安装了SD卡了。搜索程序中获取SD卡路径的方法,修改它使它返回的路径从原来的指向 sdcard 变成 flash,再次欺骗程序我们的 flash 就是我们的 sdcard。一般的获取SD卡路径的方法如下: Environment.getExternalStorageDirectory复制代码 注意这个方法返回的是一个java.io.File对象,而不是字符串,修改时要注意这一点。所以用UltraFileSearch搜索包含"getExternalStorageDirectory"的文件(主要是.smali文件),针对思维导图这个程序会搜索到App.smali和FileIO.smali二个文件,分别打开修改。具体对于App.smali相关内容如下(FileIO.smali也是类似): .line 246 :cond_0 new-instance v2, Ljava/lang/StringBuilder; invoke-direct {v2}, Ljava/lang/StringBuilder;->()V invoke-static {}, Landroid/os/Environment;->getExternalStorageDirectory()Ljava/io/File; move-result-object v3 invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; move-result-object v2 sget-object v3, Ljava/io/File;->separator:Ljava/lang/String;复制代码 把它修改成如下: .line 246 :cond_0 new-instance v2, Ljava/lang/StringBuilder; invoke-direct {v2}, Ljava/lang/StringBuilder;->()V const-string v3, "/flash" invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; move-result-object v2 sget-object v3, Ljava/io/File;->separator:Ljava/lang/String;复制代码 五、重新编译程序   修改完成后,回到cmd.exe窗口,键入重新编译的命令:   apktool b ThinkingSpacePro   第一次编译会出状况,后来发现是源码中的AndroidManifest.xml这个配置文件有问题,在这个文件的倒数第二行: <supports-screens android:anyDensity="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:resizeable="true" />复制代码   问题就出在那个android:xlargeScreens="true"上,好像不支持吧。所以删掉它,变成: <supports-screens android:anyDensity="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:resizeable="true" />复制代码   再次重新编译,成功。   重新编译后,编译输出的apk程序文件保存在 ThinkingSpacePro 子目录下的 dist 文件夹下。   这时候工作都基本完成了,不过,这个生成的apk程序还不能直接安装使用,因为缺少签名。 六、签名   抓鬼用保鲜膜,打鬼用巧克力,签名用Auto-Sign。这个工具的下载和使用方法网上搜吧。我这里不说了,已经出了本文的范围。   另外像物理空间Space Physic这个游戏的修改方法与此类似,不过它还要简单一点。还有像仙剑,它的修改不用涉及Dalvik opcodes,所以更简单,不过,它的不同点在于还要修改.so文件(.so文件相当于动态连接库dll文件),对.so的修改时用hedit等二进制编辑工具打开后将 "/sdcard" 替换为 "//flash" 即可。   全当抛砖引玉,你可能有不同的目的来修改原程序,不过万变不离其宗,大致如此。   如果你仍然不知道我上面改来改去到底在改什么,那么可以在你的N5p不插SD卡的情况下安装原版的思维导图这个软件,看能不能正常运行和使用;然后,卸载原版,同样在不插SD卡的情况下,安装我的修改版,看能否正常运行和使用了。   题外话,仙剑这个程序修改后能运行,但过了几分钟就自动退出,原先以为我修改的有问题,后来拿原版的用SD卡玩,一样没过几分钟就自动退出,网上一搜都有这种情况,所以不是我改的有问题,原本程序移植的就有问题。   最后提供思维导图和仙剑的Flash版(不需要SD卡即可运行),FLASH_ThinkingSpacePro2.16.apk、FLASH_PAL31.apk。对于仙剑这里只提供主程序,游戏数据用论坛的那个原版的,把 pal 上传到 N5p的flash闪存中(而不需要SD卡),就是连接电脑后出现的 "N5 Pro" 的那个磁盘(这个仙剑移植的不咱地,无故自动退出、菜单不支持触摸需要物理按键、分辨率太低造成大大的马赛克等等),安装FLASH_PAL31.apk即可。   我的修改程序的下载地址:http://u.115.com/file/t597954474   仙剑原版(只用数据):http://bbs.imp3.net/viewthread.php?tid=962491&extra=&highlight=%CF%C9%BD%A3&page=1 评分 参与人数 5金币 +110 收起 理由 241711044 + 1 赞 jade175 + 1 仰望 badcrazy + 5 lz 知道控制重力感应的命令么? lxary + 3 不赞不行 lostfounder + 100 技术含量太高 我辈无法观摩 查看全部评分 分享到: QQ好友和群 QQ空间 腾讯微博 腾讯朋友 收藏17 转播 分享 淘帖0 支持8 反对0 mofi莫凡 小米全系——小米3、小米2S、小米2A、红米 个性彩绘皮套 视窗皮套 回复 使用道具 举报 hwhpppl hwhpppl 当前离线 积分3269 该用户从未签到 2楼 发表于 2011.1.12 17:09 | 只看该作者 很不错的技术贴 Apktool是个好工具,一直在用 顶一下 mofi莫凡 iPad Air 经典皮套 回复 支持 反对 使用道具 举报 rockjablew rockjablew 当前离线 积分148 该用户从未签到 3楼 发表于 2011.1.12 17:23 | 只看该作者 兄弟,你要是早发布两天我就不用买卡了。不过还是要说谢谢。 mofi莫凡 专用款保护套:for iphone 5/5S、5C、4S;三星 galaxy S4/NOTE3;小米3、红米、2S、2A;华为 G610/C8815、G700、P6、MATE;联想 A850、K900;酷派 5950/7296;中兴 N919;魅族 MX3、MX2;OPPO X909、U707t、N1、R809T;步步高 X5、X3、X1;中移动 M701、M601;海信 EG960... 回复 支持 反对 使用道具 举报 qw8336800 qw8336800 当前离线 积分1362 该用户从未签到 4楼 发表于 2011.1.12 17:30 | 只看该作者 本帖最后由 qw8336800 于 2011.1.12 23:31 编辑 回复 1# vivi_an 不管了,顶了再说!前排急速占楼…帖子看不懂,但肯定强大,楼主帅到掉渣了 mofi莫凡 小米全系——小米3、小米2S、小米2A、红米 个性彩绘皮套 视窗皮套 回复 支持 反对 使用道具 举报 yzxmyspace yzxmyspace 当前离线 积分7839 该用户从未签到 5楼 发表于 2011.1.12 17:46 | 只看该作者 不错,Java啊。。。 回复 支持 反对 使用道具 举报 lostfounder lostfounder 当前离线 积分13633 该用户从未签到 6楼 发表于 2011.1.12 18:24 | 只看该作者 安卓下有没有更好的签名工具 感觉这auto-sign不是很好用 回复 支持 反对 使用道具 举报 lajidong lajidong 当前离线 积分3438 该用户从未签到 7楼 发表于 2011.1.12 18:33 | 只看该作者 请教一下:我想修改系统的重力方向,左右对调,是全局修改,不是个别软件,对系统上所有按重力感应状态工作的程序都要起作用,比如重力球游戏、支持横竖屏切换的软件等等。不知道要改哪里。谢谢! 回复 支持 反对 使用道具 举报 hwhpppl hwhpppl 当前离线 积分3269 该用户从未签到 8楼 发表于 2011.1.12 18:45 | 只看该作者 安卓下有没有更好的签名工具 感觉这auto-sign不是很好用 lostfounder 发表于 2011.1.12 18:24 上面提到的Android ResEdit专用汉化软件,拿来签名也很好用 回复 支持 反对 使用道具 举报 vivi_an vivi_an 当前离线 积分1518 该用户从未签到 9楼 楼主| 发表于 2011.1.12 18:48 | 只看该作者 回复 7# lajidong 汗!这个没研究过。我只是拿到N5p后才开始研究android,N5p到手还没过1个星期。你这个估计得要改造系统了。 回复 支持 反对 使用道具 举报 vivi_an vivi_an 当前离线 积分1518 该用户从未签到 10楼 楼主| 发表于 2011.1.12 18:54 | 只看该作者 回复 6# lostfounder 楼上有高手回复了,Android ResEdit好像就是集成的auto-sign,不过一键签名不用命令行了。 我以前好像看到过一个其它的签名软件,比较强大,几十M大小,不过那时还没玩上android,所以没有保存,牛人写的牛X作品,网上试试搜搜,我不记得名也不记得在哪看的了,只知道有! 回复 支持 反对 使用道具 举报 饼饼的豆沙包 饼饼的豆沙包 当前离线 积分664 该用户从未签到 11楼 发表于 2011.1.12 19:20 | 只看该作者 高人啊!一看这么长我就晕了。。。 楼主帮忙研究一下我们的系统吧! →_→ 回复 支持 反对 使用道具 举报 ywjczx999 ywjczx999 当前离线 积分476 该用户从未签到 12楼 发表于 2011.1.12 20:19 | 只看该作者 妈呀 看不懂哎 回复 支持 反对 使用道具 举报 yanqin yanqin 当前离线 积分886 该用户从未签到 13楼 发表于 2011.1.12 22:26 | 只看该作者 好文章啊! 楼主再研究下app2sd造福大家啊 回复 支持 反对 使用道具 举报 lajidong lajidong 当前离线 积分3438 该用户从未签到 14楼 发表于 2011.1.12 22:33 | 只看该作者 本帖最后由 lajidong 于 2011.1.13 08:04 编辑 有个apkManager有好多功能:批量自动签名、反编译、优化png、zipAlign等等。不用自己进入命令行打命令,它的那个批处理很强大 另外有个dex2jar可以反编译apk里的dex文件。反编译出来的结果可读性非常好,非常接近java源代码了,用它来分析代码比apktool得到的文件好得多了。不过它不能修改代码,更不能重新成编译apk。可以配合apktool使用 还想请教一下:仙剑的so里为什么/sdcard替换成//flash而不是/flash加一个0字符?是不是android里//flash和/flash等效? 回复 支持 反对 使用道具 举报 vivi_an vivi_an 当前离线 积分1518 该用户从未签到 15楼 楼主| 发表于 2011.1.13 11:24 | 只看该作者 本帖最后由 vivi_an 于 2011.1.13 11:35 编辑 回复 14# lajidong //flash 反正在windows下是等效的,我这么改后也没发现问题,所以即便在android也应该是等效的。后来用shell测试,比如用 cd //flash/ase 命令可以正常进入到 /flash/ase 文件夹下,表示这个是等效的。 不过,你用hedit等二进制打开后,用查找替换功能将二进制的 /sdcard 替换为 /flash 也应该没问题的,不过这么改我没测试过,你可以试一下。 回复 支持 反对 使用道具 举报 lajidong lajidong 当前离线 积分3438 该用户从未签到 16楼 发表于 2011.1.13 12:47 | 只看该作者 回复 15# vivi_an //flash和/flash等效,这个以前还真不懂。又学到东西了。 至于查找/sdcard替换成/flash,两个字符串长度不一样,变短了,不知编辑器会怎么处理。可能自己不处理一下会出问题 回复 支持 反对 使用道具 举报 圣斗士 圣斗士 当前离线 积分2405 该用户从未签到 17楼 发表于 2011.1.13 13:06 | 只看该作者 都是高手啊 回复 支持 反对 使用道具 举报 vivi_an vivi_an 当前离线 积分1518 该用户从未签到 18楼 楼主| 发表于 2011.1.14 14:04 | 只看该作者 回复 16# lajidong 那个应该会自己删除多余的内容吧,可以拿个windows程序测试一下,不过我们覆盖的其实是程序中的字串而已。 我这篇文章虽然只是针对 /flash 路径,但其实还可以指向其它地方,比如 /flash/mydata 这样把所有软件的数据都指向到 /flash/mydata 中,这样就不会造成flash下文件夹混乱了,因为不同的软件会在 flash (原来是 sdcard)生成不同的数据文件夹。 回复 支持 反对 使用道具 举报 vivi_an vivi_an 当前离线 积分1518 该用户从未签到 19楼 楼主| 发表于 2011.1.14 14:10 | 只看该作者 回复 13# yanqin 这个网上貌视有很多教程,只是我也没去测试过,手头也没有干净的sd卡,因为要做分区,现有的sd卡都填满了,数据搬来搬去的麻烦,有机会再试。 不过,我还是希望官方能出android2.2的固件,那就不用这么麻烦了。 回复 支持 反对 使用道具 举报 hcolin hcolin 当前离线 积分104 该用户从未签到 20楼 发表于 2011.1.14 14:40 | 只看该作者 牛X了,收藏备用。 回复 支持 反对 使用道具 举报 下一页 &raquo; 12 / 2 页下一页返回列表 高级模式 B Color Image Link Quote Code Smilies 您需要登录后才可以回帖 登录 | 注册 本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页 浏览过的版块 艾诺 ainol 如有意见或建议请与我们联系:imp3net@163.com 网站合作:13911001503 mofi莫凡个性配件:13599407494Copyright (C) 2002~2011 iMP3.net 随身影音专业站, All Rights Reserved. 手机版|Archiver|小黑屋|iMP3随身影音 ( 京ICP证090368号 京ICP备09052696号 ) GMT+8, 2014.1.18 10:52 , Processed in 13.093809 second(s), 25 queries , Gzip On, Memcache On. Powered by Discuz! X3.1 Licensed &copy; 2001-2013 Comsenz Inc. 快速回复 返回顶部 返回列表