验证的算法已经在下面的帖子里有了,现在就是如何跳过程序验证的问题了.
http://bbs.pediy.com/showthread.php?t=159446这里还是照顾一下新手,把一些过程写一下.
(有些文件是找来的:
标 题: Android的APK文件反编绎
作 者: 沙加L
时 间: 2011-11-04,22:18:42
链 接: http://bbs.pediy.com/showthread.php?t=142376
)
工具1.dex2jar
下载地址(抄来的或者Google):
http://laichao.googlecode.com/files/dex2jar-0.0.7-SNAPSHOT.zip
工具2 豌豆荚2 这个是用来下来APK的,也可以用来管理手机软件.方便
工具3.JD-GUI 下载地址:
http://laichao.googlecode.com/files/jdgui.zip
(建议用0.3.3的,最新的0.3.5的好像不如旧的,有些不能反编译)
用豌豆荚2 下载的 com.immomo.momo_165626.apk 用 dex2jar 转换成 com.immomo.momo_165626_dex2jar.jar
然后用JD-GUI打开
......这里省略查找过程.......
最后找到是在com.immomo.momo.e.J(),可以在
http://bbs.pediy.com/showthread.php?t=159446 查看
因为要修程序,所以要跳过这个验证,但验证是在网上,登录时如果发现apksign不正确,那是没有办法进行登录的.
方法一 本来想把程序直接改成
public static String J()
{
return "正确的apksign";
}
但问题apksign通过抓包抓不到,因为是HTTPS协议.放弃~~
方法二 自己写程序,按照算法算出来,再放回去,但说实话,我一个APK程序都没写过,可行,但懒得找下程序来写了~~
方法三,最后突发想法,看代码
String str1 = a.getApplicationInfo().publicSourceDir; //获取程序的绝对路径
Class localClass = Class.forName("android.content.pm.PackageParser");
Class[] arrayOfClass1 = new Class[4];
arrayOfClass1[0] = File.class;
arrayOfClass1[1] = String.class;
......
arrayOfObject2[0] = new File(str1);//打开文件,放入参数
arrayOfObject2[1] = null;
arrayOfObject2[2] = a.getResources().getDisplayMetrics();
arrayOfObject2[3] = Integer.valueOf(4);
Object localObject2 = localMethod1.invoke(localObject1, arrayOfObject2);
我想一下如果把路径换成没有修改过的APK,让修过的APK去计算没有修改过的APK.
(验证是否行得通花了我两个小时,过程略..)结果证明,是可以的,所以只要修改str1这个参数.
现在说一下如何修改代码,为了修改代码,得用上工具4
工具4 apktool 下载地址:
http://code.google.com/p/android-apktool/
记得参数加 -r ,不反编译资源,不然编译回去时报错一堆!! 本次也只是修改代码而已!!
-r, --no-res
Do not decode resources.
反编译后打打开com.immomo.momo.e所对应的文件e.smali,
(在输出目录的\com.immomo.momo_165626\smali\com\immomo\momo下)搜索J()
在修改之前,还得打没有没有修过的com.immomo.momo_165626.apk放到手机里,我的是放到
/data/app/com.immomo.momo_165626.apk,注意,是放入不是安装
然后就可以进行对str1这个参数的修改了
.method public static J()Ljava/lang/String;
.locals 11
const/4 v1, 0x0
const/4 v10, 0x4
const/4 v9, 0x2
const/4 v8, 0x1
const/4 v7, 0x0
sget-object v0, Lcom/immomo/momo/e;->a:Landroid/content/Context;
invoke-virtual {v0}, Landroid/content/Context;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;
move-result-object v0
iget-object v0, v0, Landroid/content/pm/ApplicationInfo;->publicSourceDir:Ljava/lang/String;
const-string v2, "android.content.pm.PackageParser"
invoke-static {v2}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
move-result-object v2
const-string v3, "parsePackage"
new-array v4, v10, [Ljava/lang/Class;
const-class v5, Ljava/io/File;
aput-object v5, v4, v7
const-class v5, Ljava/lang/String;
aput-object v5, v4, v8
const-class v5, Landroid/util/DisplayMetrics;
aput-object v5, v4, v9
const/4 v5, 0x3
sget-object v6, Ljava/lang/Integer;->TYPE:Ljava/lang/Class;
aput-object v6, v4, v5
invoke-virtual {v2, v3, v4}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
move-result-object v3
new-array v4, v8, [Ljava/lang/Class;
const-class v5, Ljava/lang/String;
aput-object v5, v4, v7
invoke-virtual {v2, v4}, Ljava/lang/Class;->getConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
move-result-object v4
new-array v5, v8, [Ljava/lang/Object;
const-string v6, ""
aput-object v6, v5, v7
invoke-virtual {v4, v5}, Ljava/lang/reflect/Constructor;->newInstance([Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v4
new-array v5, v10, [Ljava/lang/Object;
new-instance v6, Ljava/io/File; //就是上面的 new File(str1);
//只要加一面这一句,其他什么都不需要修改了
const-string v0, "/data/app/com.immomo.momo_165626.apk" //v6是File,v0是参数,所以在传入前把v0这个参数改掉
invoke-direct {v6, v0}, Ljava/io/File;-><init>(Ljava/lang/String;)V //v6是File,v0是参数
aput-object v6, v5, v7
aput-object v1, v5, v8
至此,程序验证已经失效,接下来你就可以Do something.......B+)
修改完后再用apktool编译回去
最后也是很多人没有说的,要给APK签名
工具5 APK-sign
请Google吧,不记得从哪里下载的了
最最后就是安装了,That's all.
--
[培训]《安卓高级研修班(网课)》月薪三万计划,掌
握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法