android调用C语言实现内存的读取与修改的方法示例
时间:2022-07-27
本文章向大家介绍android调用C语言实现内存的读取与修改的方法示例,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
写之前需要准备以下内容
android studio
已ROOT安卓设备
GG修改器
打开android studio,创建Native C++ Project
activity_main.xml
<?xml version="1.0" encoding="utf-8"?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btn" /
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="~" /
</LinearLayout
MainActivity.java
package com.gs.jc;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private JNI jni;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
jni = new JNI();
textView = (TextView) findViewById(R.id.tv);
}
public void btn(View view) {
textView.setText(String.valueOf(jni.searchMem()));
}
}
新建一个java类,以实现java调用对应C代码
package com.gs.jc;
public class JNI {
static {
System.loadLibrary("native-lib");
}
/*
*定义native方法
*调用C代码对应的方法
*/
public native int searchMem();
}
O_RDONLY只读打开 O_WRONLY只写打开 O_RDWR可读可写打开 O_SYNC以同步的方式打开文件
C++核心代码
#include <jni.h
#include <string
#include <stdio.h
#include <stdlib.h
#include <fcntl.h
#include <dirent.h
#include <unistd.h
static int fd = 0;
//查找游戏进程pid
int getPID(const char *pack_name) {
int id = -1, pid = -1;
DIR *dir = 0;
FILE *file = 0;
char filename[32] = {0};
char cmdline[256] = {0};
struct dirent *entry = 0;
if (pack_name == NULL) {
return -1;
}
dir = opendir("/proc");
if (dir == NULL) {
return -1;
}
while ((entry = readdir(dir)) != NULL) {
id = atoi(entry- d_name);
if (id 0) {
sprintf(filename, "/proc/%d/cmdline", id);
file = fopen(filename, "r");
if (file) {
fgets(cmdline, sizeof(cmdline), file);
fclose(file);
if (strcmp(pack_name, cmdline) == 0) {
pid = id;
break;
}
}
}
}
closedir(dir);
return pid;
}
//打开文件句柄
int open_proc_mem(int pid) {
if (pid <= 0)
return -1;
char mempath[64] = {0};
int handle = -1;
sprintf(mempath, "/proc/%d/mem", pid);
handle = open(mempath, O_RDWR, O_SYNC);
return handle;
}
//读内存
void pread64_mem(int fd, void *buff, int size, long *addr) {
if (fd <= 0 || buff == NULL || size <= 0 || addr == NULL)
return;
pread64(fd, buff, size, (unsigned long) addr);
}
//写内存
void pwrite64_mem(int fd, const void *buff, int size, long *addr) {
if (fd <= 0 || buff == NULL || size <= 0 || addr == NULL)
return;
pwrite64(fd, buff, size, (unsigned long) addr);
}
extern "C"
jint Java_com_gs_jc_JNI_searchMem(JNIEnv *env, jobject thiz) {
char *game = "com.tencent.tmgp.sgame"; //包名
int pid = getPID(game); //获取进程PID
fd = open_proc_mem(pid); //打开进程内存
//long base = 0;
long buf[1] = {666}; //需要修改内存的值
long *addr = (long *) 0x12C0085C; //内存地址:0x12C0085C
pwrite64_mem(fd, &buf[0], 4, addr); //写入内存数据
//pread64_mem(fd, &base, 4, addr);
return pid;
}
C代码中需要自行修改的地方
char *game = “com.tencent.tmgp.sgame”; //包名
long *addr = (long *) 0x12C0085C;//内存地址
效果图链接:yuanma/men_jb51.rar
以上是简单的内存地址修改方法,到此这篇关于android调用C语言实现内存的读取与修改的方法示例的文章就介绍到这了,更多相关android调用C语言实现内存读取修改内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!
- 通过sql语句分析足彩(第三篇)(r3笔记第91天)
- 不要给<a>设置outline:none
- 挑战数据结构和算法——整数的二进制表示中1的个数
- CSS3实现圆形进度条
- 挑战数据结构和算法——跳台阶问题
- IE滤镜及其使用技巧
- 挑战数据结构和算法面试题——左旋转字符串
- 聚簇因子和执行计划的联系(r3笔记第90天)
- Global eval. What are the options?
- 3d效果的图片轮播
- 关于等待事件"read by other session"(r3笔记第89天)
- URI编码解码和base64
- 阿里大数据竞赛第一名大神github源代码分享(O2O优惠券使用预测)
- 关于导入dump(r3笔记第98天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SAP WebClient UI开发工具中attribute文件夹展开的实现原理分析
- pthread_attr_init线程属性
- C语言可重入函数和不可重入函数
- 在SAP WebClient UI里显示倒数计时的UI
- 如何使用jMeter测试SAP OData服务并发访问时的性能
- 如何使用SAP HANA Studio的PlanViz分析CDS view性能问题
- 使用SAP C4C自定义BO association创建动态下拉列表
- 使用Express+TypeScript编写后台服务
- WPF 点击按钮时更改按钮样式界面效果的 XAML 实现方法
- ASP.NET Core 警惕可空类型开启之后模型校验失败
- os.path.abspath()的作用
- 机器学习-Coursera笔记
- 抖音解析-抖音视频去水印下载
- 自定义View | 基础概述 & 自定义TextView实战 & 基于源码分析自定义View继承自ViewGroup时无法正常绘制的问题
- AQS 原理剖析