当前位置: 首页 > news >正文

微网站用手机可以做吗成都大型网站建设

微网站用手机可以做吗,成都大型网站建设,长沙微推广平台,网站用户 微信商城1 前言 前面章节我们学习了【Android Framework系列】第4章 PMS原理我们了解了PMS原理#xff0c;【Android Framework系列】第9章 AMS之Hook实现登录页跳转我们知道AMS可以Hook拦截下来实现未注册Activity页面的跳转#xff0c;本章节我们来尝试一下HookPMS实现广播的发送。…1 前言 前面章节我们学习了【Android Framework系列】第4章 PMS原理我们了解了PMS原理【Android Framework系列】第9章 AMS之Hook实现登录页跳转我们知道AMS可以Hook拦截下来实现未注册Activity页面的跳转本章节我们来尝试一下HookPMS实现广播的发送。 这里我们只简单介绍一下HookPMS思路和重点代码需要详细了解的请到文末处项目地址下载查看。 同学们是否遇到需要动态下发组件的需求是通过什么方法实现的呢 之前的章节里我们分析了PMS相关的原理简单回顾一下PMS PMS是包管理系统服务用来管理所有的包信息包括应用安装、卸载、更新以及解析AndroidManifest.xml。手机开机后它会遍历设备上/data/app/和/system/app/目录下的所有apk文件通过解析所有安装应用的AndroidManifest.xml将xml中的数据应用信息、权限、四大组件等信息都缓存到内存中后续提供给AMS等服务使用。 通过HookPMS是否可以来实现动态apk组件的下发本章节我们通过HookPMS拿到PMS内的receiversBroadcastReceiver来实现调用动态下发apk的BroadcastReceiver。** 2 实现 PMS内管理了四大组件会将所有apk都解析后保存对应四大组件的信息分别保存到对应的集合Activity、receivers、probiders、services。 /frameworks/base/core/java/android/content/pm/PackageParser.java 6460 UnsupportedAppUsage 6461 public final ArrayListActivity activities new ArrayListActivity(0); 6462 UnsupportedAppUsage 6463 public final ArrayListActivity receivers new ArrayListActivity(0); 6464 UnsupportedAppUsage 6465 public final ArrayListProvider providers new ArrayListProvider(0); 6466 UnsupportedAppUsage 6467 public final ArrayListService services new ArrayListService(0);本章节我们HookPMS的BroadcastReceiver那就得获取到receivers集合。 2.1 实现思路 先将要下发的apk下载下来我们这里直接加到设备的存储里将apk通过Hook到的PMS方法解压解析到PMS内再通过HookPMS拿到装有BroadcastReceiver信息的receivers集合将动态下发apk里的BroadcastReceiver名称作为参数通过HookPMS的方法进调用从而实现本章节的目的。 2.2 项目结构 上图我们可以看到有两个module分别为app和pmsbr。 app模块 HookPMS的主要逻辑在PMSPackageParser类对apk进行解析和PMS的HookClientActivity用于发送和接收广播对HookPMS进行操作。 pmsbr模块 这个module其实只是为了打包成动态apk内部的BroadcastReceiver用于验证HookPMS后是否能调用动态下发apk内的这个BroadcastReceiver 2.3 ClientActivity package com.yvan.hookpms;import android.Manifest; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.view.View; import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;import java.io.File;/*** author yvan* date 2023/8/7* description*/ public class ClientActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_client);checkPermission(this);IntentFilter filter new IntentFilter();filter.addAction(com.yvan.client);registerReceiver(new FinishBroadcastReceiver(), filter);}public static boolean checkPermission(Activity activity) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.M activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) ! PackageManager.PERMISSION_GRANTED) {activity.requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);}return false;}public void registerBroaderCast(View view) {PMSPackageParser pmsPackageParser new PMSPackageParser();try {pmsPackageParser.parserReceivers(this,new File(getFilesDir(), input.apk));} catch (Exception e) {e.printStackTrace();}}public void sendBroaderCast(View view) {Toast.makeText(this, 1.发送消息给server, Toast.LENGTH_SHORT).show();view.postDelayed(() - {Intent intent new Intent();intent.setAction(com.yvan.server);sendBroadcast(intent);}, 3000);}static class FinishBroadcastReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, 3.收到server回复消息, Toast.LENGTH_SHORT).show();}}}activity_client.xml ?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticaltools:context.ClientActivityButtonandroid:layout_widthmatch_parentandroid:layout_height50dpandroid:gravitycenterandroid:onClickregisterBroaderCastandroid:text注册广播 /Buttonandroid:layout_widthmatch_parentandroid:layout_height50dpandroid:gravitycenterandroid:onClicksendBroaderCastandroid:text发送广播 //LinearLayout页面打开后即创建一个BroadcastReceiver用于接收来自server的回复消息两个按钮分别“注册广播”、“发送广播”。点击“注册广播”将下发的apk此处是用pmsbr模块打包的input.pak放于设备的data/data/com.yvan.hookpms/files这个私有目录下通过PMS解析然后通过HookPMS实现下发apk中的广播注册。点击“发送广播”给上面1中注册的广播发送消息 我们主要来看看第2步注册广播这里是本章的重点HookPMS 2.4 PMSPackageParser package com.yvan.hookpms;import android.content.BroadcastReceiver; import android.content.Context; import android.content.IntentFilter; import android.content.pm.PackageManager;import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.List;import dalvik.system.DexClassLoader;/*** author yvan* date 2023/8/7* description*/ public class PMSPackageParser {public void parserReceivers(Context context, File apkFile) throws Exception {Class? packageParserClass Class.forName(android.content.pm.PackageParser);Method parsePackageMethod packageParserClass.getDeclaredMethod(parsePackage,File.class, int.class);parsePackageMethod.setAccessible(true);Object packageParser packageParserClass.newInstance();Object packageObj parsePackageMethod.invoke(packageParser, apkFile,PackageManager.GET_RECEIVERS);packageObj.hashCode();Field receiversField packageObj.getClass().getDeclaredField(receivers);List receivers (List) receiversField.get(packageObj);// AndroidManifest--- Package对象 描述信息DexClassLoader dexClassLoader new DexClassLoader(apkFile.getAbsolutePath(),context.getDir(plugin, Context.MODE_PRIVATE).getAbsolutePath(),null, context.getClassLoader());// 动态注册Class? componentClass Class.forName(android.content.pm.PackageParser$Component);Field intentsField componentClass.getDeclaredField(intents);for (Object receiverObject : receivers) {String name (String) receiverObject.getClass().getField(className).get(receiverObject);// class ---对象try {BroadcastReceiver broadcastReceiver (BroadcastReceiver) dexClassLoader.loadClass(name).newInstance();List? extends IntentFilter filters (List? extends IntentFilter)intentsField.get(receiverObject);for (IntentFilter filter : filters) {context.registerReceiver(broadcastReceiver, filter);}} catch (Exception e) {e.printStackTrace();}}} }我们看到HookPMS做了以下操作 Hook的是PMS解析类android.content.pm.PackageParser的parsePackage()方法获取到Package对象然后获取到Package对象内存储BroadcastReceiver的receivers集合将动态下发的apk通过类加载器加载然后遍历PMS的receivers集合找到这个下发apk中注册的广播最后注册这个广播。 这里注册的这个广播是动态下发组件input.apk的PMSBroadcastReceiver我们继续往下看 2.5 PMSBroadcastReceiver package com.yvan.pmsbr;import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.Looper; import android.widget.Toast;/*** author yvan* date 2023/8/7* description*/ public class PMSBroadcastReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {// 收到你的信息了Toast.makeText(context, 2.接收到client的消息, Toast.LENGTH_SHORT).show();new Handler(Looper.getMainLooper()).postDelayed(() - {Intent intent1 new Intent();intent1.setAction(com.yvan.client);context.sendBroadcast(intent1);}, 3000);} } PMSBroadcastReceiver中主要是接收来自client的广播然后给client回复一个广播。我们在上面FinishBroadcastReceiver中收到server的回复后弹出Toast展示则表示完成了发送、接收动态下发组件input.apk的消息。 3 总结 到这里我们就完成了整个动态下发apk的调用及被调用这里我们再稍微总结一下 主要通过HookPMS实现将动态下发的apk进行解析将信息存储在PMS内然后对PMS中装有BroadcastReceiver信息的receivers集合拿到程序(Client)发送广播给动态下发apk内定义好的广播(Server)该广播(Server)对程序(Client)作出回应然后在程序(Client)接收回应类似TCP的三次握手逻辑。从而实现本章节对PMS进行Hook的目的。 文章只做核心HookPMS代码思路的分析这里是项目地址小伙伴可以自行下载查看别忘了点Star喔谢谢
http://www.hkea.cn/news/14328049/

相关文章:

  • mysql php网站开发一个人免费观看视频播放
  • 企业部门网站建设流程抖音seo
  • 宜昌城市建设学校网站百度推广效果
  • 数字营销公司seo优化自动点击软件
  • 济源网站建设价格网页设计与制作课件清华大学
  • 一般公司网站用什么域名套餐广州哪里能看海
  • 网站建设公司推广广告语惠州做网站广告
  • 蒙古文网站建设汇报江苏住房城乡建设网站
  • 在线做编程题的网站自己做网站自己买服务器
  • asp网站模板下载爱心助学网站建设
  • 做网站客户需要提供的资料网页版原神
  • 网站备案 域名不是自己的网站定制开发怎么做
  • 网站备案链接代码网络营销的基本方式有哪些
  • 英文网站接单做翻译比wordpress轻量的
  • 小说网站开发需求分析全自动行业管理系统
  • 阿里云服务器创建多个网站中国企业排名前十
  • 国外 网页框架搭建的网站wordpress大淘客
  • 织梦游戏网站源码做租房信息网站
  • 信仰类型的企业网站重庆工程建设招标投标交易信息网
  • 买源码做网站做淘宝优惠券推广网站
  • 安徽网站建设哪家好wordpress自定义钩子
  • 怎样用网站做app网站建设链接
  • 合肥网站建设步骤江北网站建设
  • 网站开发 分工vultr服务器做网站
  • 湖南自考网站建设与管理怎挖掘网站关键词
  • 中小企业网站建设济南兴田德润厉害吗国内电子商务网站有哪些
  • 网站开发职业资格证书网站开发的功能需求
  • 一个虚拟空间做两个网站以前的网站忘了怎么办啊
  • 程序外包网站淘宝推广费用多少钱一天
  • 网站建设是那个行业怎么做营销策划方案