前言
昨天刚把公司任务弄得差不多。同事想学粤语,下了一款XX粤语手机APP,让我帮他弄下。之前也没接触过APK,这次就当学习好了。
先下个JDK装好  再把Android SDK NDK统统装好,配置好环境变量,下载好需要的包,开搞。为了学习移动端的安全知识,买了一台安卓系统的手机作为一个测试环境。

1.下载下来APK解包

百度一下APK,11月20号还更新了。作者还挺勤快嘛。把APK下载下来,先解压看看里面是什么。发现里面的东西打不开~应该是要解包。从网上找了一下,有个apktool的还是很nice的,用apktool解包后如图:

2.再把程序安好,看看它里面到底是卖的什么药->是个什么样的注册方法:

从以上两张图,可以知道明白了。
1>爆破。根据功能的需求一个地方一个地方的找,找到后再一一修改,但这显然不是最好的方法,繁琐而且不完美。
2>从积分入手。
(1)此软件的积分可以支付宝购买
(2)下载它推荐的“垃圾应用程序”
(3)帮他宣传。微博分享等等。
当然可以从这3方面的任何一方面入手,我认为都可以达到需要的刷积分的效果。
我的第一思路就是找到这个积分变量,并修改它。如果能成功,这样的破解就会是很完美的破解了。

3.定位
找字符串试试,到\res\values里面的String.xml里面看了一圈。

这个获取积分成功是不是很诱人呢?
打开Public.xml。找了对应的ID

0x7f060010。
OK,接下来我们在smali文件夹里搜索这个的引用。
发现了一个文件引用它  位置在:smali\com\movesky\a\c.smali

4.分析代码

由于对smali代码接触得不多,打开之后,发现完全看不懂。怎么办?没事~本来就是需要今后的学习。~既然看不懂smali代码,那我们为什么不可以换个代码看呢?
那就用Java decompiler吧  Java我总能看懂吧~

先看看C类里写的是什么东西。

一共有2个函数,成功的函数代码如下:
代码:

public final void onSuccess(long paramLong){String str = Integer.toString((int)(paramLong / 1L)); //取相应任务的分值Log.i("ZRD", "奖励积分:" + str);///刷新分值显示Toast.makeText(this.d, this.d.getString(2131099664) + str, 0).show();//显示获取积分成功K.a(this.d, new Handler(), str, "dianjing", "Add");//把积分数据更新下}
}

OK.显然按照我的思路来,最后一句代码当然更吸引我。那继续追踪K类:

public final class K
{private static List<NameValuePair> bb;private static JSONArray a(String paramString1, String paramString2, String paramString3, String paramString4, String paramString5){JSONArray localJSONArray = new JSONArray();JSONObject localJSONObject = new JSONObject();try{localJSONObject.put("Fld_Points", paramString1);localJSONObject.put("Fld_Action", paramString2);localJSONObject.put("Fld_State", paramString3);localJSONObject.put("Fld_Source", paramString4);localJSONObject.put("Fld_Note", paramString5);localJSONArray.put(localJSONObject);return localJSONArray;}catch (JSONException localJSONException){while (true){localJSONException.printStackTrace();ZrdCommon.ZrdLog.Log("Err=" + localJSONException.getMessage());localJSONObject = new JSONObject();}}}public static void a(Context paramContext, Handler paramHandler){a(paramContext, new JSONArray(), paramHandler);}
public static void a(Context paramContext, Handler paramHandler, String paramString1, String paramString2, String paramString3){a(paramContext, a(paramString1, "1", "1", paramString2, paramString3), paramHandler);}public static void a(Context paramContext, Handler paramHandler, String paramString1, String paramString2, String paramString3, String paramString4, String paramString5){a(paramContext, a(paramString1, paramString2, paramString3, paramString4, paramString5), paramHandler);}private static void a(Context paramContext, JSONArray paramJSONArray, Handler paramHandler){Activity localActivity = (Activity)paramContext;ArrayList localArrayList = new ArrayList();bb = localArrayList;localArrayList.add(new BasicNameValuePair("_VKey", AppJNI.i()));bb.add(new BasicNameValuePair("_MaxID", "0"));bb.add(new BasicNameValuePair("_DevID", n.a(localActivity)));bb.add(new BasicNameValuePair("_BundleID", paramContext.getPackageName()));bb.add(newBasicNameValuePair("_BundleVersion", paramContext.getString(2131099661)));bb.add(new BasicNameValuePair("_ChannelID", paramContext.getString(2131099662)));bb.add(new BasicNameValuePair("_PointsDetail", paramJSONArray.toString()));ZrdCommon.ZrdLog.Log("YSpoints Updata PointsDetail=" + paramJSONArray.toString());new L(paramContext, paramHandler).start();}
}

找到对应的函数,一共套了几层,稍微需要一点耐心,但并没有难度。上面的几个a函数都是对传进来参数的一切处理,都是字符串游戏。对上述代码分析后可得 private static void a(Context paramContext, JSONArray paramJSONArray, Handler paramHandler)这个函数是最关键的函数。
分析paramJSONArray里的内容如下:
["Fld_Points":str,              //这里的str就是完成对应任务的分数.toString()
 "Fld_Action":"1",
 "Fld_State":"1",
 "Fld_Source":"dianjing",        
 "Fld_Note":"Add"]          //方法为Add

跟到这个时候发现这个函数的作用是客户端给服务器提交参数的函数。
悲剧了,分析了这么多~积分却不在本地。
于是这个时候可能又跳出有几种思路:
1>劫持这个变量
2>本地化,在本地完成任务达到免费使用
3>骗服务器
又去String.xml翻了翻。发现一个新的东西

URLPoints,那就是服务器存放APP积分的地址了。
进入如下:

看到SumPoints 居然是个负的。
那我们可不可以不让它访问服务器而把那个变量改成自己想要的值呢?我觉得这是一种可行的思路。
因为第一次弄,思路也是天马行空。当时想,
他这种访问服务器获取积分的方法,地址都是一个PHP文件。那肯定要验证机器码的,然后我把手机机器码屏蔽掉了,发现积分溢出了。贴出两张图为证:

这样这个程序也算是完美破解了~
第一次接触apk破解,难免有理解得不对的地方和弯路,希望大家能多多指正,多多交流方法,希望把不足之处告诉我,共同进步。
                                                                                    2014.11.22
                                                                                    By Eric

第一次接触APK【破解纪实】相关推荐

  1. 菜鸟第一次挑战apk逆向,结果整得怀疑人生,终于知道android apk加密的重要性...

    最近准备从x86上转移到linux上, 于是乎弄了个手游来玩, 正巧朋友推荐了一个修改软件,类似于八门神器.CE,用于搜索修改游戏数据,于是抱着好奇的心理初步研究了下该软件的原理: 研究了下软件, 搜 ...

  2. vue中常碰见的坑_Vue 与 Vuex 的第一次接触遇到的坑

    在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 但是如果是大型项目,很多时候都需要在子组件之间传递数据,使用之前的方式就不太方便 ...

  3. 第一次接触终极事务处理——Hekaton

    在这篇文章里,我想给出如何与终极事务处理(Extreme Transaction Processing (XTP) )的第一次接触,即大家熟知的Hakaton.如果你想对XTP有个很好的概况认识,我推 ...

  4. Project Pacific的第一次接触(转)

    这是己亥年的最后一篇公众号更新,想谈谈自己与VMware Pacific产品的第一次接触,提供一些配置的参考,感兴趣的朋友们可以一起对照着在自己的环境中进行模拟. 首先我们来看几张演示用例: 这可能是 ...

  5. 百度地图API的第一次接触

    因为项目的需求,第一次接触了百度API. 第一步:引用百度地图API的脚本 如果在局域网环境中,要把地图文件和js文件都要下载下来 <script type="text/javascr ...

  6. 家电售后php网站源码,php家电维修源码-第一次接触php语言的最经典,最简单的源代码!!!!!!!!!!-电气资讯 - 电工屋...

    如何修改PHP的源码 PHP源码用记事本就可打开编辑了,当然用DW也可以.图片背景要改,可要看清图片的链接(或者直接将图片改成你要的图片也可),改文字格式要通过CSS来修改,链接的话,应该在网站后台就 ...

  7. 第一次接触炒外汇如何快速上手?

    假如你是第一次听说炒外汇,从来没有接触过,你觉得应该如何学习呢?当然,找个老师教学最快的,但师傅领进门修行靠个人,你还得花时间学习和领悟.如果没有人带,自己摸索,大多小伙伴都没少浪费时间和给市场交学费 ...

  8. 分享第一次接触Atmel AVR微控制器开发板

    本人从事电子行业已有好几个年头,之前做过手机的开发.做过物联网芯片的技术支持,不能说对电子行业精通,也算马马虎虎有些见识了解,电子产业,目前硬件性能过胜是众所周知的事,好比在大家都比较熟知的单片机领域 ...

  9. 如果你是第一次接触Python当中的面向对象,请点击进来。

    2018年7月29日15:49:49 今天有时间写一篇关于Python面向对象入门的文章,其实面向对象是不属于某一门编程语言的,而是一种编程思想,如果你是第一次接触面向对象,你需要弄懂下面几个问题: ...

最新文章

  1. 后端说:只是你不懂怎么用 headers!
  2. C# Redis实战(六)
  3. spring boot记录操作日志
  4. Oracle Database 11g 数据库普通用户登录时提示 ORA-28002: the password will expire within 5 days
  5. 如何获取屏幕分辨率呢
  6. Java 原生 Base64 编解码、Md5、SHA-1、SHA-256 加密摘要算法
  7. Mybaits整个Spring项目,简单示例,10分钟快速上手
  8. JAVA集合系列(2):Collection和Iterator接口
  9. sscom32串口测试软件连接串口时有时会造成设备异常,更换别的串口软件后正常,特此记录
  10. 如何安装树莓派鱼眼摄像头模块
  11. --save-dev 与 --save的区别
  12. cc2430的中文资料
  13. LTE-5G学习笔记17--COMP技术讲解
  14. Worthington核心酶——木瓜蛋白酶的特征及相关应用
  15. android涟漪动画,如何添加涟漪效果并在android中的按钮上有自定义背景?
  16. js版身份证省市性别查询
  17. 前端练习--京东导航
  18. ORB-SLAM2系统中的优化函数
  19. 普通话智能测试系统软件,普通话智能学习软件(普通话水平测试仿真系统) iso光盘版...
  20. TASKCTL4.1不同版本下载

热门文章

  1. linux中修改某行某列字符串,Linux替换指定列的字符串(awk 命令)
  2. app数据分析体系 - 用户粘性 DAU,MAU 和 月人均活跃天数
  3. 极光 · 底层逻辑 · doubleの浮点误差
  4. java开发的游戏测试_用java编写。模拟一个简单的测试打字速度的游戏
  5. 最近在关注冰岩作坊自己写的一个ftp的搜索
  6. sql 语言-单值函数single row functions
  7. Java--JSP四大作用域、九大内置对象
  8. SVN设置忽略文件夹
  9. 专访黄文斌丨中专文凭的他,辞掉了9年的国企“铁饭碗”
  10. 宝塔Nginx编译安装headers_more模块