android調(diào)用C語言實現(xiàn)內(nèi)存的讀取與修改的方法示例
寫之前需要準備以下內(nèi)容
android studio 已ROOT安卓設(shè)備 GG修改器
打開android studio,創(chuàng)建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類,以實現(xiàn)java調(diào)用對應(yīng)C代碼
package com.gs.jc;
public class JNI {
static {
System.loadLibrary("native-lib");
}
/*
*定義native方法
*調(diào)用C代碼對應(yīng)的方法
*/
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;
}
//讀內(nèi)存
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);
}
//寫內(nèi)存
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); //打開進程內(nèi)存
//long base = 0;
long buf[1] = {666}; //需要修改內(nèi)存的值
long *addr = (long *) 0x12C0085C; //內(nèi)存地址:0x12C0085C
pwrite64_mem(fd, &buf[0], 4, addr); //寫入內(nèi)存數(shù)據(jù)
//pread64_mem(fd, &base, 4, addr);
return pid;
}
C代碼中需要自行修改的地方
char *game = “com.tencent.tmgp.sgame”; //包名 long *addr = (long *) 0x12C0085C;//內(nèi)存地址
效果圖鏈接:yuanma/men_jb51.rar
以上是簡單的內(nèi)存地址修改方法,到此這篇關(guān)于android調(diào)用C語言實現(xiàn)內(nèi)存的讀取與修改的方法示例的文章就介紹到這了,更多相關(guān)android調(diào)用C語言實現(xiàn)內(nèi)存讀取修改內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解android是如何管理內(nèi)存的
- Android LeakCanary檢測內(nèi)存泄露原理
- Android Studio使用Profiler來完成內(nèi)存泄漏的定位
- Android Handler內(nèi)存泄漏原因及解決方案
- Android內(nèi)存泄漏的原因及解決技巧
- Python獲取android設(shè)備cpu和內(nèi)存占用情況
- Android Native 內(nèi)存泄漏系統(tǒng)化解決方案
- Android獲取當(dāng)前應(yīng)用分配的最大內(nèi)存和目前使用內(nèi)存的方法
- Android Handler內(nèi)存泄漏詳解及其解決方案
- 詳解Android Ashmem匿名共享內(nèi)存
相關(guān)文章
Android 使用 okhttp3和retrofit2 進行單文件和多文件上傳
這篇文章主要介紹了Android 使用 okhttp3和retrofit2 進行單文件和多文件上傳,開發(fā)項目中需要進行單文件多文件的上傳功能,下面演示的ApiResponse是自己分裝的返回值,要根據(jù)自己的項目來完成,需要的朋友可以參考下2022-10-10
Dcloud的native.js直接撥打電話Android實例代碼
本文為大家分享了3種利用Dcloud的native.js直接撥打電話實例代碼,由于iOS系統(tǒng)的限制所以只有Android版實例2018-09-09
PowerManagerService之手動滅屏流程示例分析
這篇文章主要為大家介紹了PowerManagerService之手動滅屏流程的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
Android Studio做超好玩的拼圖游戲 附送詳細注釋源碼
這篇文章主要介紹了用Android Studio做的一個超好玩的拼圖游戲,你是0基礎(chǔ)Android小白也能包你學(xué)會,另外附送超詳細注釋的源碼,建議收藏!2021-08-08
Android開發(fā)中WebView的簡單使用小結(jié)
WebView(網(wǎng)絡(luò)視圖)能加載顯示網(wǎng)頁,可以將其視為一個瀏覽器。它使用了WebKit渲染引擎加載顯示網(wǎng)頁。下面這篇文章給大家總結(jié)了Android中WebView的簡單使用,有需要的可以參考借鑒。2016-09-09

