这里还是照顾一下新手,把一些过程写一下.
工具1.dex2jar
下载地址(抄来的或者Google):<br”>http://laichao.googlecode.com/files/…7-SNAPSHOT.zip</a><br />
工具2 豌豆荚2 这个是用来下来APK的,也可以用来管理手机软件.方便
工具3.JD-GUI 下载地址:<br”>http://laichao.googlecode.com/files/jdgui.zip</a><br />
(建议用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(),可以在 查看<br”>http://bbs.pediy.com/showthread.php?t=159446</a> 查看<br />
因为要修程序,所以要跳过这个验证,但验证是在网上,登录时如果发现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 下载地址:<br”>http://code.google.com/p/android-apktool/</a><br />
记得参数加 -r ,不反编译资源,不然编译回去时报错一堆!! 本次也只是修改代码而已!!
反编译后打打开com.immomo.momo.e所对应的文件e.smali,
(在输出目录的com.immomo.momo_165626smalicomimmomomomo下)搜索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.
–*转载请注明来自看雪论坛@PEdiy.com