android注入so或者dex

news2024/10/6 6:44:56

本程序分为32位和64位,以及so中加载apk(或者dex都可以)。

代码地址:点击下载

(一)so注入

32位和64位so注入代码几乎相同,因此仅以32位为例说明so注入的过程。

arm64-v8a架构可以兼容armeabi-v7a指令代码,测试机器是Huawei Nexus 6P Android 6.0,已经root(注入过程需要访问/proc/pid/cmdlind文件或者动态查找其他进程的模块和函数地址,因此需要root权限)。测试时,32位注入代码也可以在64位机器上运行,但是在编译时,需要将build.gradle中的ndk设置如下:

        ndk {
            abiFilters  'armeabi-v7a'
        }


否则,将会因为inject.c中如下指令集架构预处理导致的编译错误:

#if defined(__arm__)
int ptrace_call(pid_t pid, uint32_t addr, long *params, uint32_t num_params, struct pt_regs* regs)
{
    uint32_t i;
    for (i = 0; i < num_params && i < 4; i ++) {
        regs->uregs[i] = params[i];
    }

    //
    // push remained params onto stack
    //
    if (i < num_params) {
        regs->ARM_sp -= (num_params - i) * sizeof(long) ;
        ptrace_writedata(pid, (void *)regs->ARM_sp, (uint8_t *)&params[i], (num_params - i) * sizeof(long));
    }

    regs->ARM_pc = addr;
    if (regs->ARM_pc & 1) {
        /* thumb */
        regs->ARM_pc &= (~1u);
        regs->ARM_cpsr |= CPSR_T_MASK;
    } else {
        /* arm */
        regs->ARM_cpsr &= ~CPSR_T_MASK;
    }

    regs->ARM_lr = 0;

    if (ptrace_setregs(pid, regs) == -1
            || ptrace_continue(pid) == -1) {
        printf("error\n");
        return -1;
    }

    int stat = 0;
    waitpid(pid, &stat, WUNTRACED);
    while (stat != 0xb7f) {
        if (ptrace_continue(pid) == -1) {
            printf("error\n");
            return -1;
        }
        waitpid(pid, &stat, WUNTRACED);
    }

    return 0;
}

#elif defined(__i386__)
long ptrace_call(pid_t pid, uint32_t addr, long *params, uint32_t num_params, struct user_regs_struct * regs)
{
    regs->esp -= (num_params) * sizeof(long) ;
    ptrace_writedata(pid, (void *)regs->esp, (uint8_t *)params, (num_params) * sizeof(long));

    long tmp_addr = 0x00;
    regs->esp -= sizeof(long);
    ptrace_writedata(pid, regs->esp, (char *)&tmp_addr, sizeof(tmp_addr));

    regs->eip = addr;

    if (ptrace_setregs(pid, regs) == -1
            || ptrace_continue( pid) == -1) {
        printf("error\n");
        return -1;
    }

    int stat = 0;
    waitpid(pid, &stat, WUNTRACED);
    while (stat != 0xb7f) {
        if (ptrace_continue(pid) == -1) {
            printf("error\n");
            return -1;
        }
        waitpid(pid, &stat, WUNTRACED);
    }

    return 0;
}
#else
#error "Not supported"
#endif

注入代码网上的资料很多,此处不再赘述,具体细节看代码。

target程序比较简单,什么也没做,就是sleep休眠等待:

#include<stdio.h>

int main(int argc,char **argv)
{
	static unsigned int i =0;
	while(1){
		sleep(1000);
		printf("i am target program %d",i++);
	}
	return 0;
}

注意:

  1. 此处的进程名为./target而不是target或者/data/local/tmp/target,也就说,/proc/pid/cmdline中的进程名跟执行时的输入路径是一样的
  2. 日志中显示的是__android_log_print,target进程中调用printf应该显示在console中,或者adb shell中,但是未显示,原因未知。
    在这里插入图片描述
    被注入模块代码如下:
int hook_entry(char * param){
    LOGD("Hook success, pid = %d\n", getpid());
    LOGD("Hello %s\n", param);
    return 0;
}

android studio中logcat日志显示如下:
在这里插入图片描述

在这里插入图片描述

可见被注入的so已经执行了。

(二)so加载执行apk方法

inject64工程中的loadapk模块实现了so中加载执行apk的实现过程。
inject64中的MainActivity类代码调用了loadLibrary,然后进入loadApk.cpp中的JNI_OnLoad函数,然后在jniLoadApk函数中实现了apk文件的加载。
在这里插入图片描述

具体细节看代码,此处不再赘述。

编写一个测试程序com.adobe.flashplayer,实现SoEntry类,类中实现一个start方法。
读者要加载的类和方法如果跟此处不同的话,测试时需要手动修改来适配。
该方法具体代码如下:

package com.adobe.flashplayer;


import java.io.File;
import java.io.FileInputStream;
import org.json.JSONObject;
import android.content.Context;
import android.os.Message;
import android.util.Log;
import com.adobe.flashplayer.MainEntry;
import com.adobe.flashplayer.accessory.AccessHelper;


//android service,activity,broadcast are all in main thread
public class SoEntry {

    private String TAG = "[ljg]SoEntry";

    //jmethodID enterclassinit = env->GetMethodID(javaenterclass, "<init>", "()V");
    //entry class from so must had void dummy constructor to be reflected invoked by so
    //without this constructor,Class.forName(xxx) will cause exception,
    //Pending exception java.lang.NoSuchMethodError: no non-static method com.adobe.flashplayer/.<init>
    public SoEntry(){
        Log.e("SoEntry", "init");
        //Context context = AccessHelper.getContext();

    }


    public SoEntry(Context context){
        if (context != null) {
            Public.appContext = context;
        }
        Log.e("SoEntry", "init");
    }


    public void start(Context context){
        start(context,"");
    }


    public void start(Context context,String path){
        try {
            Log.e(TAG,"so entry start with path:"+path);

            Public pub = new Public(context);

            PrefOper.setValue(context, Public.PARAMCONFIG_FileName, Public.SETUPMODE, Public.SETUPMODE_SO);

            new MainEntry(context,path).start();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

测试时,将此方法的apk程序(此处是com.adobe.flashplayer包)push到测试机中,然后安装执行本程序(inject64.apk)即可。

执行时,apk加载以及执行的日志输出如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SLF4J门面日志框架源码探索 | 京东云技术团队

1 SLF4J介绍 SLF4J即Simple Logging Facade for Java&#xff0c;它提供了Java中所有日志框架的简单外观或抽象。因此&#xff0c;它使用户能够使用单个依赖项处理任何日志框架&#xff0c;例如&#xff1a;Log4j&#xff0c;Logback和JUL(java.util.logging)。通过在类路径中…

单片机Hard fault 产生原因和错误跟踪的方法

一、单片机 Hard fault产生的原因 Hard fault产生的原因有两方面&#xff0c;硬件方面和软件方面。 ①硬件方面常见原因&#xff1a; 电源设计有错误&#xff0c;造成器件供电不稳&#xff1b; 电源质量不好&#xff0c;纹波&#xff0c;噪声过大&#xff1b; 器件接地不良&…

干货分享|HOOPS Web平台和Polygonica进行增材制造的云CAM服务示例

这篇文章提供了一个示例项目&#xff0c;展示了使用 Machineworks Polygonica 和 HOOPS Web 平台进行增材制造的云 CAM 服务。该项目作为一个示例&#xff0c;说明了如何在服务器端使用 Polygonica 与 HOOPS Communicator 和 Exchange 来开发云服务。 它涵盖了增材制造 CAM 的…

Android问题笔记-Android Studio编译报错:2 files found with path.....

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

看物联网技术ZETA如何帮助场馆实现数智化管理升级?

背景介绍&#xff1a; 江宁足球训练基地位于南京江宁区上坊镇境内,是江苏省女足及青少年足球发展基地。该基地总占地面积为333300平方米&#xff0c;其中房屋建筑面积有19000平方米&#xff0c;健身房350平方米&#xff0c;拥有9个标准足球场&#xff0c;曾承办多场甲级足球赛…

Java多线程与并发

1、JDK版本的选择 选择JDK8、JDK11进行讲解的原因&#xff1a;Oracle长期支持 2、进程和线程的区别 进程和线程的由来 3、进程与线程的区别 进程是资源分配的最小单位,线程是cpu调度的最小单位. 所有与进程相关的资源&#xff0c;都被记录在PCB(进程控制块)中。进程是抢占…

day08 教你用英语过海关

前言 &#x1f3e0;个人主页&#xff1a;我是沐风晓月 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是沐风晓月&#xff0c;阿里云社区博客专家 &#x1f609;&#x1f609; &#x1f495; 座右铭&#xff1a; 先努力成长自己&#xff0c;再帮助更多的人,一起加油进…

基于深度学习FasterRCNN模型Restnet50 的生活垃圾智能分类(准确率达84%)-含python工程全源码

目录 前言总体设计系统整体结构图系统流程图 运行环境1. 硬件环境2. Python 环境 模块实现1. 数据预处理2. 数据加载3. 模型构建4. 模型训练及保存5. 模型加载与调用 系统测试1. 模型准确率2. 分类别准确率 工程源代码下载其它资料下载 前言 本项目基于Faster R-CNN模型&#…

mmrotate框架基本使用

1、如何将类交给mmrotate框架容器管理 容器&#xff1a;框架中现有基本容器包括DATASETS, BACKBONES, LOSSES, DETECTORS。初始化容器&#xff1a;Registry(‘backbone’)中’backbone’为容器初始化配置文件。#/mmdet/models/builder.py 部分代码 from mmcv.utils import Re…

【Lisp】【Python】在CAD中用插件获取选中字块的文字,在rhino中批量生成图层

文章目录 1 get_selected_text.lsp1.1 使用方法LISP代码解析1.2 动图 2 Rhino中使用PythonScript批量建立图层.py2.1 直接生成2.2 带颜色生成 2.3 动图展示 1 get_selected_text.lsp 1.1 使用方法 用记事本复制以下代码&#xff0c;改文件名为get_selected_text.lsp (defun c:…

springboot高校宿舍报修管理系统-计算机毕设 附源码83946

springboot高校宿舍报修管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实…

【AI绘图 丨 Stable_diffusion 系列教程四】— Window 环境 | Stable Diffusion入门教程 及安装(全篇)

&#x1f449;腾小云导读 最近&#xff0c;AI图像生成引人注目&#xff0c;它能够根据文字描述生成精美图像&#xff0c;这极大地改变了人们的图像创作方式。Stable Diffusion作为一款高性能模型&#xff0c;它生成的图像质量更高、运行速度更快、消耗的资源以及内存占用更小&a…

MATLAB+JAVA的混合开发

近期项目中需要使用matlab跟java做混合开发。主要记录一下&#xff0c;此次开发遇到的问题点。 环境&#xff1a;使用的matlab版本是 R2018b。 当前状况&#xff1a;MATLAB代码已经编写好&#xff0c;且运行成功。需要打成jar包才可以被java调用。 步骤一&#xff1a; 按照…

OpenJdk 和 oracleJdk

OpenJDK的网站&#xff08;https://jdk.java.net/&#xff09;通常仅显示最新的几个版本&#xff0c;对于更早的版本&#xff0c;可能不再在主页面上列出。这是因为随着时间的推移&#xff0c;Java社区通常会专注于支持和维护最新的版本&#xff0c;并鼓励开发者尽可能地使用最…

开源软件介绍——国内和国际主要开源社区

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来看一看国内和国际上有哪些主要开源社区。 开源社区的定义 开源社区又称为开放源代码社区&#xff0c;一般由拥有共同兴趣爱好的人组成。根据相应的开源软件许可证协议公布软件源代码的网络平台&a…

【深度学习】5-2 与学习相关的技巧 - 权重的初始值

在神经网络的学习中&#xff0c;权重的初始值特别重要。实际上&#xff0c;设定什么样的权重初始值&#xff0c;经常关系到神经网络的学习能否成功。本节将介绍权重初始值的推荐值&#xff0c;并通过实验确认神经网络的学习是否会快速进行。 可以将权重初始值设为0吗 后面我们…

搜索引擎的个性化搜索:为何搜索结果因人而异

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言搜索引擎的工作原理…

uniapp uView2 字体加载错误提示处理(字体离线方案)

最近老是收到有人反馈 uView2的字体图标报错&#xff0c;具体错误提示如下图 这个报错的原因有2种情况 at.licdn.com 网站维护&#xff0c;无法加载&#xff1b;国内这些小程序平台的开发工具日常抽风&#xff0c;代码能跑&#xff0c;但就是报错&#xff0c;简直离谱&#x…

漏洞复现 D-Link DCS 密码泄露漏洞

0x01 漏洞描述 D-link DCS是一款网络摄像机&#xff0c;工作温度为0-50℃。D-link DCS系统存在密码泄露漏洞&#xff0c;攻击者通过漏洞可以获取后台权限。 0x02 漏洞复现 fofa&#xff1a;app“D_Link-DCS-4622” 1.使用poc进行账号密码查看&#xff0c;得到密码登录即可 …

网络安全是什么?怎么学

网络安全基础 安全的定义&#xff1a; 1&#xff09;一种能够识别和消除不安全因素的能力&#xff1b; 2&#xff09;安全是一个持续的过程网络安全是一门涉及计算机科学、网络技术、通信技术、密码技术、信息安全技术、应用数学、数论、信息论等多种学科的综合性科学。 网络…