转自:http://hi.baidu.com/1000in1/item/7c27992427b494949c63d153
这两个工具都是通过修改进程内存的方式来实现的。
简单点说就是调试进程。java 写的界面调用native c 写调试程序。
这里简单抛块转。程序运行需要获取ROOT权限的方法网上很多,可以搜索一下。
通过
activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
procList = activityManager.getRunningAppProcesses();
得到当前运行的应用PID。
通过分析/proc/[pid]/maps文件,得到下面的地址(一般内存分配都在这里进行)
开始 - 结束 可读写
4267f000-42864000 rw-p 00001000 00:04 760 /dev/ashmem/dalvik-LinearAlloc(deleted)
Runtime.getRuntime().exec(“tt”);
运行TT程序(tt需要参数)。
通过tt程序获取内存内容(snapshot),保存成文件。分析文件就比较简单了。找到所有符合你搜索的数据,将地址保存建表。
然后回到游戏,等待数据变化后重复上面的过程,通过保存的上次的地址,进行进一步搜索,直到确认正确地址后,修改这个地址内容即可。
tt程序需要ROOT权限运行
tt程序用ndk编译
Android.mk 编译脚本
==================================================
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
main.c
LOCAL_LDLIBS :=
LOCAL_MODULE:= tt
include $(BUILD_EXECUTABLE)
include $(call all-makefiles-under,$(LOCAL_PATH))
======================================================================
附tt的源代码:
mian.c
===================================================================================
#include <asm/page.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/ptrace.h>
#include <errno.h>
#include <stdlib.h>
#define TRACE(o,p) printf(o,p)
void change_process_mem(int pid ,long offset,long value)
{
ptrace(PTRACE_ATTACH, pid, NULL, NULL);
waitpid(pid, NULL, 0);
ptrace(PTRACE_POKEDATA, pid,(void *)offset, (void *)value);
ptrace(PTRACE_DETACH, pid, NULL, NULL);
waitpid(pid, NULL, 0);
}
void process_mem_snapshot(int pid,long offset,long size,char* memfilename)
{
long i=0;
FILE* out;
ptrace(PTRACE_ATTACH, pid, NULL, NULL);
waitpid(pid, NULL, 0);
out = fopen(memfilename,"wb+");
for(i=offset;i<offset+size;i+=4)
{
long r = ptrace(PTRACE_PEEKDATA, pid,(void *)i, NULL);
fwrite((char*)&r,4,1,out);
}
fclose(out);
ptrace(PTRACE_DETACH, pid, NULL, NULL);
waitpid(pid, NULL, 0);
}
int printf_help(int argc, char *argv[])
{
if ((argc<5)||(argv[1][0]=='s'&&argv[1][1]==0&&argc<6))
{
printf("\r\n\r\n"
"Usage:\ttt <sm> pid offset size <FILE>\r\n\r\n"
"\ttt s 1000 10000 1222 \"/sdcard/temp\"\r\n"
"\ttt m 1000 20000 1234\r\n");
return 0;
}
return 1;
}
int main_s(int argc, char *argv[])
{
int pid;
long offset;
long size;
char* memfilename;
pid = atoi(argv[2]);
offset = atol(argv[3]);
size = atol(argv[4]);
memfilename = argv[5];
process_mem_snapshot(pid,offset, size,memfilename);
return 0;
}
int main_m(int argc, char *argv[])
{
int pid;
long offset;
long value;
pid = atoi(argv[2]);
offset = atol(argv[3]);
value = atol(argv[4]);
change_process_mem(pid , offset, value);
return 0;
}
void main(int argc, char *argv[])
{
int pid = 0;
if (!printf_help(argc,argv))
{
return;
}
if (argv[1][0]=='s'&&argv[1][1]==0)
{
main_s(argc,argv);
return;
}
if (argv[1][0]=='m'&&argv[1][1]==0)
{
main_m(argc,argv);
return;
}
return ;
}
为尊重作者,转帖请注明出处,谢谢