• 注册
  • 投稿
    • 中文
    • English
  • 注册
  • 【新手上路】 【新手上路】 关注:6 内容:9

    如何实现在任意apk添加自定义代码逻辑

  • 查看作者
  • 打赏作者
    • 【新手上路】
    • Lv.14
      永久会员
      大富豪

      如何实现在任意apk添加自定义代码逻辑

      通过安卓修改大师可以很轻松的在任何apk中添加新的代码逻辑,实现额外添加的功能,本次教程通过对一款名为“VMware Horizon”的软件进行反编译,实现在登录界面添加自动登录功能(该登录界面之前已经有自动登录功能,但是未实现相应的逻辑,且自动登录功能按钮在代码中自动隐藏掉了)。

      为了方便大家学习,文中用到的apk和java代码请点击后面的连接下载:点击这里下载

       

      1、 反编译安装包,将要反编译的安装包拖拽到安卓修改大师界面上,弹出的界面中选择反编译。系统将自动进行反编译打包。首次修改的时候,建议什么都不改,直接打包,看看有什么问题,并进行修复,确保可以打包运行才进行后续的操作。

       

      如何实现在任意apk添加自定义代码逻辑

      2、 修复打包过程错误,在打包的过程中会遇到图示的错误,尝试按照提示的自动修复进行打包,发现并不能进行自动修复。然后看底部的日志,按照日志的要求,按照文件路径打开文件,删除提示的不存在的属性,然后重新编译。

      如何实现在任意apk添加自定义代码逻辑

       

      3、 定位要修改的布局和Activity类。重新编译后,项目可以正常在手机上面运行,将手机浏览到登录界面,在安卓修改大师的左侧点击“代码/布局定位”,并点击打开界面的抓取界面布局按钮,就可以获得当前界面的Activity类名和布局文件。请记住上面的类名:

      com.vmware.view.client.android.WindowsPasswordPrompt,后续修改都是在这个文件。

      如何实现在任意apk添加自定义代码逻辑

      4、 点击上图右下角红框圈中的“定位布局和代码”按钮,将自动定位和搜索引用这个按钮的布局和代码文件,可以双击布局或者代码进入看布局逻辑或者代码的逻辑。

      如何实现在任意apk添加自定义代码逻辑

      5、 找到界面元素对应的在类里面映射的变量的方法,以找到上述的“保存密码”复选框对应的变量为例,按照同样的方法,需要自行找到界面上面的用户名、密码和登录按钮对应的变量。按照上面的步骤抓取界面后,做抓取界面左侧的预览窗口点击相应的元素,然后右侧就会显示这个元素相应的一些属性,如果这个元素有id,就会在右下角的列表中显示“查看布局”的按钮,点击后就是上面步骤看到的搜索界面。然后点击smali结尾的文件(就是程序处理源代码文件),看到的代码如下:

      如何实现在任意apk添加自定义代码逻辑

      最好把映射的变量记下来,同样找到用户名和密码的输入框,登录按钮对应的变量,记录下来。

       

      6、 上面是准备工作,下面切入正题。本教程的主要工作是实现自动登录,按照这个逻辑,需要实现两个方法,一个是点击登录后的保存登录信息的功能(保存用户名,密码和保存密码选择框的状态),一个是页面加载的时候读取保存的用户名、密码和保存密码的状态,并自动点击登录按钮进行登录。

      7、 要实现上述功能,需要额外添加代码来实现。一般的做法是先写好一个demo的Android studio项目,把要实现的功能写成一个类,然后确保实现功能并完成功能测试。下面就是实现该逻辑的代码,该代码也在附带的压缩包中。

       

      package com.kongyu.project;

      import android.app.Activity;
      import android.content.SharedPreferences;
      import android.widget.Button;
      import android.widget.CheckBox;
      import android.widget.EditText;

      public class AutoLogin {
          
      //实现自动登录
          
      public static void autoclick(final Activity context, CheckBox cbRemmber, EditText etUser, EditText etPwd, Button btnSave) {
             SharedPreferences shareData= context.getSharedPreferences(
      “Data”, Activity.MODE_PRIVATE);//创建一个给全局使用
             
      etUser.setText(shareData.getString(“UserName”“”));
             etPwd.setText(shareData.getString(
      “Password”“”));
             cbRemmber.setChecked(shareData.getString(
      “CheckedUser”“”).toLowerCase().equals(“true”));
             
      if(cbRemmber.isChecked())btnSave.performClick();
          }

          //保存登录信息
          
      public static void saveinfo(final Activity context, CheckBox cbRemmber, EditText etUser, EditText etPwd) {
             SharedPreferences shareData= context.getSharedPreferences(
      “Data”, Activity.MODE_PRIVATE);//创建一个给全局使用
             
      SharedPreferences.Editor editor = shareData.edit();//绑定sharePreferences对象
             
      editor.putString(“UserName”, etUser.getText().toString());
             editor.putString(
      “Password”, etPwd.getText().toString());
             editor.putString(
      “CheckedUser”“” + cbRemmber.isChecked());
             editor.commit();
      //注意保存数据
          
      }
      }

      下面是调用的java代码

      AutoLogin.saveinfo(this,checkBox,etuser,etpwd);AutoLogin.autoclick(this,checkBox,etuser,etpwd,btn);

       

       

      同时也要在代码里面写好这两个方法的调用方法,会利用下一步生成上述类和改调用方法对应的smali文件,这是插桩方式插入代码的关键地方。

       

      8、 然后将上述demo项目打包成apk,再用安装修改大师反编译,反编译后即可获得对应的smali代码。

       

      如何实现在任意apk添加自定义代码逻辑

       

      反编译后点击该项目后面的“打开目录”按钮,即打开上图显示的反编译后的文件目录,然后浏览smali目录下面,按照类路径依次找到上述的类文件对应的smali类文件(路径不一定 跟我的截图一样,按照实际的你自己定义的类路径来)。

      如何实现在任意apk添加自定义代码逻辑

      同时在调用这两个方法的地方,找到反编译后的对应的调用的smali调用方法,后面备用。

         保存信息的smali方式调用方法:

          invoke-static {p0, p1, v0, v1}, Lcom/kongyu/project/AutoLogin;->saveinfo(Landroid/app/Activity;Landroid/widget/CheckBox;Landroid/widget/EditText;Landroid/widget/EditText;)V

       

        自动登录的smali方式调用方法:

          invoke-static {p0, p1, v0, v1, v2}, Lcom/kongyu/project/AutoLogin;->autoclick(Landroid/app/Activity;Landroid/widget/CheckBox;Landroid/widget/EditText;Landroid/widget/EditText;Landroid/widget/Button;)V

       

      9、 下面就进行最核心的代码整合阶段了。代码整合的过程一般是先将写好的代码转变成的smali文件拷贝到目标项目的smali目录下面(只要放到smali下面就可以,具体在哪一个目录无所谓,你为了方便,也可以放到自定义目录例如plugin这样名称的目录下面),如果有资源文件,也照样拷贝到对应的res资源文件目录即可。如果你要整合的代码有依赖包,依赖包的相关反编译出来的smali文件也一并拷贝到新的项目即可,重点要强调的是,如果目标项目已经有了相关的类包,一定不要重复拷贝,会导致编译失败。

      按照上述方法,将上述获得的类smali文件拷贝到目标项目的smali目录下。到目前为止,类文件已经移植完毕。

      如何实现在任意apk添加自定义代码逻辑

      10、        下面进行核心的插桩操作。按照上面的分析,需要在登录按钮点击的时候插入保存信息的代码,在页面oncreate加载的地方插入自动登录的方法。大家还记得开头通过界面抓取获得类名吗,可以在那个界面直接点击转到smali,跳转到要处理的smali文件。

      如何实现在任意apk添加自定义代码逻辑

      跳转后的代码编辑界面,通过顶部的下拉,找到oncreate方法,并点击进入

      如何实现在任意apk添加自定义代码逻辑

      11、        然后在oncreate的末尾插入自动点击的方法

      如何实现在任意apk添加自定义代码逻辑

      自动登录的方法需要传入5个参数,分别是当前类p0,保存密码的复选框v0,用户名输入框v1,密码输入框v2,登录按钮v3,这几个界面元素对应的类里面的变量如何获取,请参考前面获取复选框的方法。

       

      12、        在登录按钮点击后,插入自动保存登录信息的调用方法。需要获得点击事件对应的代码位置,下面重点演示如何通过界面抓取来获得按钮对应的点击事件代码对应的位置。

      在界面抓取页面,点击左面的预览窗口的登录按钮,然后右侧会显示该按钮可以查看界面布局和代码,点击“查看页面布局和代码”按钮,跳转到搜索界面。

      如何实现在任意apk添加自定义代码逻辑

      搜索结果里面找到上述类名对应的文件,找到sswitch_0这一行,一般情况下,sswitch语句就是用来做判断跳转的,所以这个搜索结果对应的基本上就是该按钮对应的处理方法代码。

      如何实现在任意apk添加自定义代码逻辑

      然后双击这一行,并自动打开代码编辑页面,在代码编辑器搜索上述截图的sswitch_0,即可找到这个按钮的处理入口。下面的截图已经将保存登录信息的方法调用添加进去了。

      如何实现在任意apk添加自定义代码逻辑

      保存信息的方法需要四个参数,分别是当前的activity的p0,保存密码的复选框v0,保存密码的复选框v0,用户名输入框v1,密码输入框v2。

      到此为止,已经通过代码插桩的方式,将当初在android studio里面开发的java代码逻辑,转变为smali代码,并且在相应的位置插入了smali代码的调用,重新编译打包,在手机上面即可看到运行的效果。

      顺便说一句,原始的apk的保存密码选择框在布局里面有,但是运行后在界面上面看不到,通过分析代码,发现是代码中通过代码隐藏掉了,需要搜索复选框对应的变量,找到处理显示的方法setVisibility方法,然后删除或者注释掉这一行即可。Smali注释某一行的方法是在这一行的前面写#号。注释后,这句代码就不起作用了。

      如何实现在任意apk添加自定义代码逻辑

       

      到此为止,已经完整讲述了如何通过插桩的方式,在没有源代码的基础上,在apk里面添加新的功能。大家可以触类旁通,实现更多更复杂的功能。通过安卓修改大师,只要apk可以反编译打包运行,就可以额外添加任意逻辑。

      请登录之后再进行评论

      登录
    • 做任务
    • 帖子间隔 侧栏位置: