从100到1逆向 world中world怎么弄目录

教你把1分如何变成100万?
> 教你把1分如何变成100万?
教你把1分如何变成100万?
来源:大学生创业网
  教你把1分如何变成100万?或许你绝对不相信,
  但是石油大王洛克菲勒想到了。在他眼中1粒种即是1分钱,当你把一分钱当成一粒种子,播种后,辛勤地耕耘。到第二年就能收获了,这分钱就可以成为1元钱,这个道理就是积少成多,积沙成塔。当然,要等到成长至20万元,甚至100万元,还有一条漫长、崎岖的道路要走。
  金钱也像种子一样,能够成长繁殖,你的信用会因资金充裕而变得更加巩固,为了及早推动计划,你必须有良好的信用作为凭借。倘若你一文不名,那么要向别人借钱,将会是一件难如登天的事;反之,如果你自己已经拥有100万元,再要向别人借100万元便易如反掌。公司员工待遇的改善、工厂设备的改良,也都需要资金,所以,切莫轻易让1分1毫从你手上流失。
  石油大王洛克菲勒是美国19世纪三大富翁之一。他一生至少赚过了10亿美元,捐出的就有7.5亿美元。但他自己平时花钱十分节俭。
  有一次,洛克菲勒下班想搭公车回家,差一毛钱,就向秘书借并说:&你一定得提醒我,免得我忘了。&秘书说:&请别介意,一毛钱算不了什么。&他却正色地说:&你怎能说算不了什么,把一块钱存在银行里,要整整两年才有一毛钱的利息啊!&
  洛克菲勒习惯到一家熟识的餐厅用餐,餐后,给了服务生一毛五分钱的小费。有一天,不知何故,他只给了服务生五分钱。服务生不禁埋怨说:&如果我像你那么有钱的话,我绝不吝惜那一毛钱。&
  洛克菲勒听后笑了笑说:&这就是你为何一辈子当服务生的缘故。&还有一次洛克菲勒来到纽约一家旅馆,要住最便宜的房间。他向经理问道:&这里最便宜的房间一晚多少钱?我是一个人住,只需要一个很小的房间。&
  经理告诉他后说:&您为什么要住这样简陋的房间!您的儿子来我们这里从来都是住最贵的房间,您却要住最便宜的房间。&
  洛克菲勒打趣地说:&是的,因为他(儿子)爸爸是个富翁,但我爸爸不是!&
  经商关键点:金币有着喜欢群居的习性,一位能够懂得其价值的主人,能让一枚金币带来成千上万的财富。
  小投资赚钱秘诀:
  1、做比想像更重要
  创业需要有想象力,但是创业者不能整天白日做梦,动手比动心更难,做比想更重要;尤其想对新上路的创业者说的一句话是:赶紧试错!你的idea再好,不动手做出来去接受市场的检验,永远不知道真实的答案。但愿它大受欢迎,也许无人问津,这时有人会自认失败选择放弃,有人会再试再试再试,直到成功,当然,也会有人试错无数次,依然以失败告终。呵呵,创业嘛,不仅试错,也在试人。
  2、小是美丽的
  创业起步都是小公司,缺钱、缺人、缺资源,要啥缺啥,不然咋叫创业?创业要解决的难题是从0到1,从无到有,从脑子里的idea变成一个产品,从无人信服你到有第一个客户掏钱给你。所以,刚起步的创业者不必整天想你将来会上市会赚几十个亿几百个亿,但必须首先证明你能从0到1,没有小事的成功,别想做成大事&&从0到1叫创业,从1 到100叫成长,从100到1000000叫扩张。
  3、专注做一件事情
  什么叫&专注&?专注就是对自己说&不&,在100个决定中,对99个说&不&,只允许一个&Yes&。更形象些:伸出你的双手一共10个手指,必须砍掉9个,你留哪一个?创业者应该用这方法来对待自己的产品,砍砍砍,只保留一个;同样,这个产品上的功能也一样砍砍砍,只留必不可少的,这样你可能做出一个iPod来,世界上没有比&专注&更强大的力量。
  4、专注赚钱
  创业失败的原因几乎千篇一律:现金流断了。创业者切忌犯低级错误:一厢情愿假设钱一定会进来、客户一定存在、产品一定能大卖、钱烧光的刹那间VC来敲门;现实很可能是:钱不进来就是不进来,产品没人买就是没人买,账上没钱了公司就得关门。创业公司在和现金流作生死决斗,是死是活,现金流是硬道理,CEO要站在&钱线&上。
  5、专注客户
  谁说创业了你就成了老大?公司里至高无上的老板不是你,是顾客,只有他们开心了,你的日子才好过;公司里不应只有你在做伟大而重要的事情,人人都在做伟大重要事情;公司的命根子不是工作环境规章制度,是你的产品;纵有千头万绪,只要死死抓住&客户&,一切事情都会理顺。
  6、创业是在冒险中学习
  创业公司最大的风险是CEO,公司的最高决策人,没人管得了他,就怕他不懂装懂,创业公司CEO必须有自律和学习精神;如没干过销售,就立刻学习并在短期成为最好的销售,如不懂会计,立刻学习掌握。别幻想哪天有了钱可以雇人来干,你不懂其中奥妙如何监管外来的和尚呢?学习是投资,但学了不用是浪费的投资,冒险也是投资,更有挑战和直接的投资。创业是冒险+学习的大投资,常人玩不起。创业没法先学习,然后顺顺当当去冒险,创业的学习在冒险中进行。创业成功时,你发现自己成了一个&通才&:你掌握了领导力、理解了客户和市场、精通了如何点将带兵、也品尝了钱的滋味。
  7、让团队做得比自己好
  创业公司里人人都是一条龙,即便是前台她知道的也不见得比CEO少,公司里谁她不认识?办公室进进出出啥不在她眼里?员工嘀咕的逃得过她的耳朵?关键是公司的创始人们能不能领袖的胸怀,找到有创业意识的人,把每个人内心埋藏着的火山爆发出来,来为创业的成功添砖加瓦;衡量一个领袖的标准不是看他是否会高谈阔论、发号施令,而是他能不能让周围的人做的都比自己更好。
  8、师傅的力量
  我的创业知识,大多来自实践和高人指点,所以建议第一次的创业者找一个成功的创业者做师傅(Mentor),关键问题上能有个人指点把关一下,免得舍近求远。记得那时我刚创业,廿来人的小公司忙得我团团转,我朋友Jim 是一家大建材公司的老板,他常来我办公室坐坐,有天我问他&我经营一家小公司忙得不可开交,你管那么大一家公司,哪来的时间能老来我这里闲逛?&他答: &我的工作就是保证我每天啥都不做。&我茅塞顿开,他一句话点穿我对于企业管理的所有疑问。
  9、不必藐视竞争对手,多多向他们学习
  创业公司的竞争对手大多比自己强,人家公司的产品卖的比你好,人家公司的规模比你大,人家公司融到的钱比你多;世界之不公我们常常觉得受委屈,明明是我的产品功能更多为什么偏偏是他的卖的更好?明明我的团队更优秀为什么他们融到了这么多钱而我敲遍VC的们却无人问津?换种思维:现实的就是合理的,人家能做到一定是有原因的,不必藐视竞争对手,多多向他们学习,争取比他们做得更好,这才是竞争力。
  10、失败不是坏事,成功不能复制
  最有效的学习来自犯错误。一婴儿在桌上爬,爬到桌沿扑个空摔地上疼得大哭,第二次再把他放桌上,他爬到桌沿就停下来。创业团队多为第一次创业,创业企业的成长和婴儿成长一样,会犯大量错误,走许多弯路,弄不好还会从桌上摔下来摔死,创业公司的成本风险是团队的学习成本,要付学费,但错误代价昂贵,但愿你不要摔死;创业的成功是汗水+智慧+运气,没有天上掉下来的成功,没有永远的成功,成功不能复制。
下页更精彩:1
教你把1分如何变成100万?相关推荐手把手教你逆向分析 Android 程序-android100学习网
手把手教你逆向分析 Android 程序
很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下。
很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下。
第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的图片,苍老师你们不会不认识吧?
第二张图是微信运动步数作弊,6不6?
ok,那我们从头说起……
Android 的反编译,相信大家都应该有所了解,apktool、JEB 等工具。
我们先看一下 Apk 文件的结构吧,如下图:
1.META-INF:签名文件(这个是如何生成的后面会提到)。
2.res:资源文件,里面的 xml 格式文件在编译过程中由文本格式转化为二进制的 AXML 文件格式。
3.AndroidManifest.xml:Android 配置文件,编译过程依然被转换为 AXML 格式。
4.classes.dex:java 代码编译后产生的类似字节码的文件(dalvik 字节码)。
5.resources.arsc:具有 id 值资源的索引表(asserts 文件夹中的资源不会生成索引)。
6.其他文件:可由开发者自己添加,诸如 assets 等,或者 lib(native so 代码)等目录。
(Android 编译打包过程分析参看: http://www./lib/view/open0.html
Apk 的核心逻辑主要在 classes.dex 中,破解和二次打包也基本上对这个文件做手脚,所以对这个文件的保护也尤为重要。
上图为一般 Apk 的破解过程(windows 画图工具画的比较搓)。
我们首先用 apktool 工具反编译:java -jar apktool.jar d -f xxx.apk outDir(PS:outDir 不写会在当前目录输出)。
反编译后的目录结构如下:
这里,res 里的 xml 和 manifset.xml 都已经是解出后的 xml 了,不是 axml 格式了,res 目录里的 values 目录下的 public.xml 可以看到资源对应的 id。
如果命令 java -jar apktool.jar d -f再加入 -r 代表资源文件不反编译,上图的目录中将依然有resources.arsc,xml 都是 axml 格式的,也找不到 public.xml。
其实我们主要关注的是 smali 这个目录,里面是按照 android 程序编写的时候 java 文件的目录格式生成的,但是里面的文件并不是 java 格式的,而是 smali 格式的,类似 MainActivity.smali。
那么什么是 smali 文件呢?
1.Smali 是 Android 的 Dalvik 虚拟机所使用的一种 dex 格式的中间语言。
2.可以理解为,C 语言和汇编语言的编译与反编译,把 smali 理解为一种汇编语言。
我们可以打开一个 smali 文件看看,我们可以使用 notepad++ 打开,然后定一下 smali 语法的高亮显示。
将下面内容保存到 C:\Users\用户名\AppData\Roaming\Notepad++下,文件名为 userDefineLang.xml。
可以参看 http://www.ourunix.org/post/117.html 操作。打开 MainActivity.smali 文件,头三行代码大致如下:
.class public Lcom/example/hacktest/MainA
.super Landroid/app/A
.source "MainActivity.java"
smali 语法这里就不介绍了,自己查资料就好 smali 文件语法参考: http://www./lib/view/open6.html
这里举个例子,我们写个程序,一个 edittext 一个 button,当 edit 里面输入正确的文字的时候,点击 button 才会弹出正确的 toast。
我们看一下,反编译后的关键代码:
可以看到这是一个参数为 string,返回值为 boolean 名叫 check 的函数,当输入为“11”的时候才返回 true。
我们可以把第一个红框位置的 if-eqz 改成 if-nez,这样你输入除了11的任何字符都会返回 true。
或者把第二个红框位置的 0x1,改成 0x0,(0代表 true),这样这个函数不管输入什么都返回 true。
OK,这样我们就改完了,我们重新编译:java -jar apktool.jar b -f outDir xxx.apk(PS:xxx.apk 可以不写,会在 outDir 里生成 dist 目录,编译好的 Apk 在这里面)。
签名:可以网上下载工具 autoSign,使用方法略…
安装 Apk 后验证,通过。
但是事情并不总是如我们所愿,有些 Apk 会做一些盗版检测机制,就是为了防止二次重打包。
以手机XX应用为例,当你按照上述步骤反编译,重新编译,签名之后,进入 APP 会出现这个页面,无法正常使用。
因为你并没有这个 APP 的正版签名文件(关于签名相关的东西,在后面我再仔细讲)。
那么这个原理是什么呢,我们大胆猜测一下,无非就是和上一个例子类似的check函数,两个值的对比,那么这个值一定是签名。
我们先通过方法拿到正版的签名md5,然后在反编译后的代码中搜索一下这个值。
然而并没有搜到,再换个思路,我们搜索获取签名的这个函数,从而定位关键代码,获取应用签名的java代码类似是:
PackageInfo pi = context.getPackageManager.().getPackageInfo(packname,packageManager.GET_SIGNATURES);
对应的smali代码类似是:
Landroid/content/pm/PackageI-&signatures:[Landroid/content/pm/Signature
我们再搜用这段代码搜索,在 StormUtils2.smali 里面找到了,发现在函数 getSignInfo 里面,继续跟踪到 checkPiracy 函数。
看到这个函数发现就和上例中的 check 函数类似了,改一下返回值为 true 就好了。
我们再仔细看看这个函数,发现关键的签名 md5 值被拆开存放了,所以我们才没有搜到,这也是防范搜索的一个举措吧(虽然我觉得并没什么用)。
const-string/jumbo v3, "dbbf****96b326003"
const-string/jumbo v0, "c388a****1578d5"
好的,修改后,我们再重新编译、签名,验证通过。
(PS:关于签名检测的除了 java 层的,可能还有再 so 里面校验的和服务器验证的方式,在 so 里的用 IDA 打开 so 跟踪修改,服务器验证的抓包查看,再模拟发包重放攻击就好了,这里就不具体介绍了)
2. Android 的签名保护机制到底是什么?
Android 系统禁止更新安装签名不一致的 Apk,如果我们修改了 Apk 又用别的签名文件签名,肯定是不一致的。
我们从签名工具 autoSign 分析,看一下 sign.bat 文件内容:
-----------------------------------
Echo Auto-sign Created By Dave Da illest 1
Echo Update.zip is now being signed and will be renamed to update_signed.zip
java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk
Echo Signing Complete
-----------------------------------
看一下 java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk 这行的意义:
以testkey.x509.pem 这个公钥文件和 testkey.pk8 这个私钥文件对 update.apk 进行签名,签名后保存为 update_signed.apk。
我们可以看到签名前和签名后比较,签名后的文件中多了一个文件夹“META-INF”,里面有三个文件 MANIFEST.MF 、 CERT.SF 、 CERT.RSA。
我们通过 jd-gui 工具打开 signapk.jar,找到 main 函数,通过这个函数跟踪代码
1. addDigestsToManifest 这个函数,遍历 Apk 中所有文件,对非文件夹非签名文件的文件逐个生成 SHA1 数字签名信息,再 base64 编码。
然后再写入 MANIFEST.MF 文件中,生成文件如下:
-----------------------------------
Manifest-Version: 1.0
Created-By: 1.0 (Android)
Name: res/drawable-xhdpi/ic_launcher.png
SHA1-Digest: AfPh3OJoypH966MludSW6f1RHg4=
Name: AndroidManifest.xml
SHA1-Digest: NaPhUBH5WO7uGk/CfRu/SHsCvW0=
Name: res/drawable-mdpi/ic_launcher.png
SHA1-Digest: RRxOSvpmhVfCwiprVV/wZlaqQpw=
Name: res/drawable-hdpi/ic_launcher.png
SHA1-Digest: Nq8q3HeTluE5JNCBpVvNy3BXtJI=
Name: res/layout/activity_main.xml
SHA1-Digest: kxwMyILwF2K+n9ziNhcQqcCGWIU=
Name: resources.arsc
SHA1-Digest: q7Ystu6WoSWih53RGKXtE3LeTdc=
Name: classes.dex
SHA1-Digest: Ao1WOs5PXMxsWTDsjSijS2tfnHo=
Name: res/drawable-xxhdpi/ic_launcher.png
SHA1-Digest: GVIfdEOBv4gEny2T1jDhGGsZOBo=
-----------------------------------
SHA1 生成的摘要信息,如果你修改了某个文件,Apk 安装校验时,取到的该文件的摘要与 MANIFEST.MF 中对应的摘要不同,则安装不成功。
2. 接下来对之前生成的 manifest 使用 SHA1withRSA 算法, 用私钥签名,writeSignatureFile 这个函数,最后生成 CERT.SF 文件,如下:
-----------------------------------
Signature-Version: 1.0
Created-By: 1.0 (Android)
SHA1-Digest-Manifest: pNZ9UXN9GMqTgqAwKD6uEN6aD34=
Name: res/drawable-xhdpi/ic_launcher.png
SHA1-Digest: cIga++hy5wqjHl9IHSfbg8tqCug=
Name: AndroidManifest.xml
SHA1-Digest: oRzzLkwuvxC78suvJcAEvTqcjSA=
Name: res/drawable-mdpi/ic_launcher.png
SHA1-Digest: VY7kOF8E3rn8EUTvQC/DcBEN6kQ=
Name: res/drawable-hdpi/ic_launcher.png
SHA1-Digest: stS7pUucSY0GgAVoESyO3Y7SanU=
Name: res/layout/activity_main.xml
SHA1-Digest: Yr3img6SqiKB+1kwcg/Fga2fwcc=
Name: resources.arsc
SHA1-Digest: j1g8I4fI9dM9hAFKEtS9dHsqo5E=
Name: classes.dex
SHA1-Digest: Sci9MmGXNGnZ1d04rCrEEV7MWn4=
Name: res/drawable-xxhdpi/ic_launcher.png
SHA1-Digest: KKqaLh/DVvFp+v1KoaDw7xETvrI=
-----------------------------------
用私钥通过 RSA 算法对 manifest 里的摘要信息进行加密,安装的时候只能通过公钥解密,解密之后才能获得正确的摘要,再对比。
3. 最后就是如何生成 CERT.RSA,打开这个文件看到的是乱码,说明整个文件都被编码加密了,而且这个文件和公钥有关,从源码中看出他是通过 PKCS7 将整个文件加密了。
总结: 1.签名只是对完整性和签名发布机构的校验机制 2.不能阻止 Apk 被修改,只是签名无法保持一致 3.不同私钥对应着不同的公钥,实质上不同的公钥就代表了不同的签名。
3. Android 系统如何获取签名
我们从获取下面一段代码开始分析:
packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES );
Signature[] signs = packageInfo.
md5 = getMD5Str(signs[ 0].toByteArray());
context.getPackageManager()其实拿到的是ApplicationPackageManager
看一下 context 的实现类 contextImpl 里的 getPackageManager()。
public PackageManager getPackageManager() {
if (mPackageManager != null) {
return mPackageM
IPackageManager pm = ActivityThread.getPackageManager ();
if (pm != null) {
// Doesn't matter if we make more than one instance.
return (mPackageManager = new ApplicationPackageManager(this, pm));
可以看到 ActivityThread 中方法 getPackageManager 获取
IPackageManager。
继续看 ActivityThread 的代码:
public static IPackageManager getPackageManager() {
if (sPackageManager != null) {
//Slog.v("PackageManager", "returning cur default = " + sPackageManager);
return sPackageM
IBinder b = ServiceManager.getService("package");
//Slog.v("PackageManager", "default service binder = " + b);
sPackageManager = IPackageManager.Stub.asInterface(b);
//Slog.v("PackageManager", "default service = " + sPackageManager);
return sPackageM
看源码知道是通过 ServiceManager.getService(“package”);获取 PackageManagerService 并得到 IBinder对象,然后通过
asInterface 函数取得接口类 IPackageManager 实例。
然后作为参数构造 ApplicationPackageManager,再看 ApplicationPackageManager 这个类里的方法:
public PackageInfo getPackageInfo(String packageName, int flags)
throws NameNotFoundException {
PackageInfo pi = mPM.getPackageInfo(packageName, flags, mContext.getUserId());
if (pi != null) {
} catch (RemoteException e) {
throw new RuntimeException( "Package manager has died" , e);
throw new NameNotFoundException(packageName);
这里的mPM就是上面构造函数传进来的 IPackageManager,就可以调用 PackageManagerService 的方法了。
下图是 PackagerManager 静态类结构图:
ok,看完上图的结构图,继续跟代码 ,看到这里是 mPM 继续调用的getPackageInfo(代理模式),通过进程通信到 PackageManagerService 中执行响应操作:
public PackageInfo getPackageInfo(String packageName, int flags, int userId) {
if (!sUserManager.exists(userId))
enforceCrossUserPermission(Binder.getCallingUid (), userId, false, "get package info");
synchronized (mPackages) {
PackageParser.Package p = mPackages.get(packageName);
if (DEBUG_PACKAGE_INFO)
Log.v (TAG, "getPackageInfo " + packageName + ": " + p);
if (p != null) {
return generatePackageInfo(p, flags, userId);
if((flags & PackageManager. GET_UNINSTALLED_PACKAGES ) != 0) {
return generatePackageInfoFromSettingsLPw(packageName, flags, userId);
这里 mPackages 是 hashMap,其调用put方法的时机是在 scanPackageLI 方法中,而 scanPackageLI 的调用地方是在程序安装和替换函数中,还有就是 scanDirLi 中,代码略。
scanDirLi 是用来扫描一些系统目录的的,在 PackageManagerService 的构造函数中调用的:
File dataDir = Environment. getDataDirectory();
mAppDataDir = new File(dataDir, "data");
mAppInstallDir = new File(dataDir, "app");
mAppLibInstallDir = new File(dataDir, "app-lib" );
mAsecInternalPath = new File(dataDir, "app-asec" ).getPath();
mUserAppDataDir = new File(dataDir, "user");
mDrmAppPrivateInstallDir = new File(dataDir, "app-private" );
上面是扫描的位置↑↑↑↑↑↑↑
PackageManagerService 处理各种应用的安装、卸载、管理等工作,开机时由 systemServer 启动此服务。就是说之前安装过的应用或者系统应用信息都会在开机扫描过程中存到 mPackages 这个 hashMap 中。开机后用户的安装操作也会同样存到这个 hashMap 里面。
继续看 getPackageInfo,调用的 generatePackageInfo , 里面调用的是 PackageParser 中的 generatePackageInfo,继续跟。
这个函数的代码比较长,只贴出部分关键代码:
if ((flags&PackageManager. GET_SIGNATURES ) != 0) {
int N = (p.mSignatures != null) ? p.mSignatures.length : 0;
if (N & 0) {
pi.signatures = new Signature[N];
System.arraycopy (p.mSignatures, 0, pi. signatures, 0 , N);
这段代码之前主要是做一些复制的操作,就是 new 一个 PackageInfo,然后把 PackageParser.Package 对象中的一些内容复制到这个 PackageInfo 中。
从这段代码可以看出来,最终得到的 signatures 信息就是中 p(PackageParser.Package )中的成员 mSignatures 中得来的。
好了,现在就是看这个PackageParser.Package是从哪来的了,通过跟踪代码,installPackageLI 和 scanPackageLI 中的:
final PackageParser.Package pkg = pp.parsePackag (tmpPackageFile, null, mMetrics, parseFlags);
这行代码只是生成了 pkg,并没有赋值里面的 mSignatures,继续跟踪,找到函数 collectCertificatesLI,找到 pp.collectCertificates(pkg , parseFlags)。
PS:最终又进行了一系列的跟代码,找到了 JarVerifier.java 这个类的 readCertificates 这个就是用来读取.RSA 文件的,最终我们看到的里面的代码是通过 loadCertificates 取得的 certs 赋值给了 pkg.mSignatures。
至此,获取签名的所有逻辑就算是简单的过一遍了,以下是简略流程图:(发现 ppt 画图比 Windows 画图工具好用多了,哈哈)
在跟代码的过程中也找到了签名对比的函数 compareSignatures ,有空自己看看就好了。
OK,绕了这么久我们终于找到源头了,获取签名就是在 META-INF 中寻找,并解析。试想一下,如果我们修改了这个函数,让他解析原来正版的 META-INF 中的 CERT.RSA 文件,这样就可以伪造为真正的签名了。
那么我们就想到了 HOOK,(很多人都是从看雪论坛上找到的一篇文章看到的 /showthread.php?t=186054 hook 的原来简单来说就是,找到原函数和新函数的指针位置,然后兑换内容,将新函数替代原函数。
关于 hook 呢,网上也有很多框架可以使用,比如:
1.Cydia substrate :
/ 2.Xposed : / 网上也有很多教程可以看看。
乌云(wooyun)上有一篇很有意思的教程,就是利用 hook 进行微信运动作弊,原帖地址: http://drops.wooyun.org/tips/8416
下图就是我用了上面的方法产生的效果,还差点被微信部门的人请去喝茶。
这里用的是 Xposed 框架,原理就是 hook 了手机的计步传感器的队列函数,然后把步数的返回值每步乘1000返回,前提是,你的手机硬件本身有计步传感器功能,这里微信运动里面列出了支持的手机列表: /touch/sappfaq/151013AvyyeQqmq.html?platform=15 好像最高就是98800了,可能是微信做了步数限制吧。
我这里用的是小米4联通版,发现虽然是1000基数的加,但是好像隔了很久才变化,估计又是 MIUI 做了一些省电策略,传感器的采集做了对齐吧?
Xposed 框架,很多玩机爱好者,会拿它修改一些主题,字体之类的,或者系统界面,定制自己想要的系统插件等等。然而,也有缺点,需要手机root,而且这个框架,还有可能让手机变砖,还有的系统可能对这个框架支持的不好,或者不支持。XDA 论坛里面也有很多大神把 Xposed 对某些机型做了适配,大神一般都是说,如果手机变砖他们不负责,哈哈。
正式由于这些框架的诸多不便,root 等等的问题,于是就有了一些非 root 的 hook 的黑科技,比如阿里巴巴的开源框架 Dexposed( /alibaba/dexposed )其也是根据 Xposed 框架修改而来的,不过看 github 上他们也好久没更新了。
也有像其他个人写的和这种比较类似的框架,这里就不介绍了。但是这类框架的缺点就是,只能在该进程下hook,不能全局 hook,即只对这个进程的应用起作用,不能对另一个应用起作用,优点是可以 hook 自定义函数也能hook 系统函数,并且不用 root 和重启。阿里用这个框架来打在线热补丁。
那对于 App 内部签名校验的就不用再搜相应的代码了,直接 hook 就一步到位了,android.app.ApplicationPackageManager 这个类的 getPackageInfo 这个方法直接把正确的签名返回就好了,接下来我们就需要把hook的代码注入到某个 App 里就好了。
4. 关于如何注入?
开篇的时候有个图片就是我在地图里面注入了一个苍老师的图片其实就是,自己写了个 imageloader,用来下载网络图片,再写个 activity 或者 dialog 来承载这个 imageview,然后编译,再反编译,取出相应的smali等文件,比如贴到已经反编译好的地图的里面,把开启这个苍老师图片下载的启动代码放到合适位置,最后再把地图重新打包签名,就ok 了。
hook 代码也是同理注入,验证一下,成功(我这块写的比较粗略,代码比较多,只说思路了)那么这种代码注入和 hook 相结合的方式能干什么呢,我们也不妨搞出点事情来。同样我们还是进行微信运动作弊的事情,其实很多运动类的软件都可以把自己的数据同步到微信运动里,比如小米手环,乐动力,悦动圈等等。
那我们就先拿一个来开刀吧:
经过一系列的跟踪代码定位,最终定位到了这个类 cn.ledongli.ldl.cppwrapper.DailyStats 里的 f 方法(f 是因为代码混淆了)然后我们注入并 hook 方法,让它返回66666,ok,我们看到了如下效果:
然后我们在应用里面登陆微信账号,和对接到微信运动的功能,发现不好用,是因为,微信里面做了对应用的签名校验,应用的签名已经变了。
所以我们只能破解微信了(闷声作大死),同样注入 hook 代码,让微信获取乐动力的签名的时候取得正确签名,关键代码:
if( packageName.equals( "cn.ledongli.ldl")){
if ( result instanceof PackageInfo) {
PackageInfo info = (PackageInfo)
info. signatures[0] = new Signature( myHexLedongli);
param.setResult( info);
再把这个盗版的微信重新打包签名,重新进行应用的同步数据操作,再进微信运动看看,是不是已经66666了。至此作弊完成。
♂♂♂♂♂♂♂♂♂♂我是画风不同的分割线♂♂♂♂♂♂♂♂♂♂♂♂
说了这么多破解的,也该聊聊防破解的了。
google 最早给的就是代码混淆的方案,其实一般的混淆只是降低了代码的可读性,让你对反编译出来的函数命名等不知道什么意思,不过解读出来只是时间问题。后来还有资源混淆的,但是意义不大。
后来有了核心代码用 C 实现,写成 SO,加花指令的办法,这个办法确实会阻止一大部分人的继续破解,但是对于经常做逆向的工程师来说也不是什么难题。
其实做这么多大多数软件的初衷就是不想软件被盗版,然后被注入乱七八糟的广告,或者被盗取信息等,后来就有了盗版检测机制。比如:JAVA 层的签名校验,NDK 层校验,分段存放签名 Hash 串,服务器校验等等,但是这些方法我都在上面说了破解方法。
现在国内的一般应用市场都有对 APP 签名的检测,在你下载的时候会告诉你这个 APP 是不是盗版的,从而让用户区分出来。但是应用市场自己本身又被盗版了怎么办呢?
再后来,就有了像360加固保和腾讯的乐固等产品,so 做了加密,真正的 dex 也藏起来了,不过个人觉得,就算真正的 dex 也需要变成 odex 了,root 的手机取到 odex,再转回 dex,就能拿到真正的 dex(虽然我没试过,但是我觉得可能是一个思路),所以这个方法就更难破解了。
虽然加固产品很厉害,但是也会有他的缺陷,Android 系统不断的更新升级,也许就换了某些模式等等,比如 ART 刚出来的时候,加固保加固后的 Apk,在 ART 模式运行下就会 Crash。这些加固产品要不断的适配各种型号的手机,CPU 类型,运行模式等等,所以很多 APP 为了考虑兼容性,他们也不会轻易去加固自己的产品。
♂♂♂♂♂♂♂♂♂♂我是画风不同的分割线♂♂♂♂♂♂♂♂♂♂♂♂
关于逆向破解 Android 应用,我觉得耐心很重要吧,代码跟来跟去确实很枯燥,总结几点小技巧吧:
1.信息反馈:通过界面的一些弹出信息,界面特点寻找突破点。
2.特征函数:比如搜 Toast,Log,getSignature 等。
3.代码注入:把 toast 或者 log 函数注入到程序中,跟踪位置。
4.打印堆栈:插入 new Exception(“定位”).printStackTrace();
5.网络抓包:通过抓包得到的关键字段,在代码中定位。
写在后面:
这篇文章整理了有一段时间了,觉得还是应该写出来,也不是什么高深的技术文章,就是个人总结的一点心得而已。
关于破解应用很多人可能会去破解别人的应用注入广告来获取利益,也有可能盗取别人的信息。
不过我们作为有节操的开发工程师,应该本着瑞雪的精神看待技术,学习技术,而不是乱♂搞。但是我们也应该知道,我们的应用有可能会被别人怎么搞……
最后推荐一本资料书,大家可以有空看看。
via: /bbs/forum.php?mod=viewthread&tid=974

我要回帖

更多关于 world怎么弄目录 的文章

 

随机推荐