Android逆変調ソースコードはここにあります.
リバースデバッグの方法は多いですが、androidシステムはオープンソースなので、リバーステストも実は神秘的なものではありません.以下は一般的で、多くのメーカーが使用しています.私たちのプロジェクトグループも含めて使用しています.複数のシナリオを組み合わせることで、より良いデバッグを実現できます.
文書ディレクトリ 1.1 ptrace自身、android_serverは に添付されていません 1.2.トレースpidの値 を検出する 1.3ポート番号を検出android_serverこのポート番号 1.4これらのデバッグプロセスの名前を検出する 1.5.常放ディレクトリの検出:/data/local/tmp 1.6検出break point指令 1.7 Linux inotifyプロパティを使用してファイルの読み書き、開くなどの権限を監視する . 1.8.デバッグされたコードの前後時間の違いを検出する;
1.1 ptrace自身、android_サーバが添付されていません
1.2.トレースpidの値を検出する
1.3ポート番号を検出android_serverというポート番号
1.4これらのデバッグプロセスの名前を検出する
1.5.常放ディレクトリの検出:/data/local/tmp
1.6 break point指令の検出
1.7 Linux inotifyプロパティを使用してファイルの読み書き、開くなどの権限を監視する
1.8.デバッグされたコードの前後時間の差異を検出する;
より多くの安全技術の文章は、「ゲーム安全攻防」の公衆番号に注目し、一緒に交流し、一緒に進歩してください.
文書ディレクトリ
1.1 ptrace自身、android_サーバが添付されていません
void anti_ptrace()
{
ptrace(PTRACE_TRACEME, 0, 0, 0);
}
1.2.トレースpidの値を検出する
void anti_Tracepid()
{
try
{
const int bufsize = 1024;
char filename[bufsize];
char line[bufsize];
int pid = getpid();
sprintf(filename, “/proc/%d/status”, pid);
FILE* fd = fopen(filename, “r”);
if (fd !=NULL)
{
while (fgets(line, bufsize, fd))
{
if (strncmp(line, “TracerPid”, 9) == 0)
{
int statue = atoi(&line[10]);
if (statue != 0)
{
fclose(fd);
int ret = kill(pid, SIGKILL);
}
break;
}
}
fclose(fd);
} else
{
// LOGD(“open %s fail…”, filename);
}
} catch (…)
{
}
}
1.3ポート番号を検出android_serverというポート番号
void anti_serverport() {
const int bufsize=512;
char filename[bufsize];
char line[bufsize];
int pid =getpid();
sprintf(filename,"/proc/net/tcp");
FILE* fd=fopen(filename,“r”);
if(fd!=NULL){
while(fgets(line,bufsize,fd)){
if (strncmp(line, “5D8A”, 4)==0){
int ret = kill(pid, SIGKILL);
}
}
}
fclose(fd);
}
1.4これらのデバッグプロセスの名前を検出する
void anti_processstatus(){
const int bufsize = 1024;
char filename[bufsize];
char line[bufsize];
char name[bufsize];
char nameline[bufsize];
int pid = getpid();
// Tracepid
sprintf(filename, “/proc/%d/status”, pid);
FILE *fd=fopen(filename,“r”);
if(fd!=NULL){
while(fgets(line,bufsize,fd)){
if(strstr(line,“TracerPid”)!=NULL)
{
int statue =atoi(&line[10]);
if(statue!=0){
sprintf(name,"/proc/%d/cmdline",statue);
FILE *fdname=fopen(name,“r”);
if(fdname!= NULL){
while(fgets(nameline,bufsize,fdname)){
if(strstr(nameline,“android_server”)!=NULL){
int ret=kill(pid,SIGKILL);
}
}
}
fclose(fdname);
}
}
}
}
fclose(fd);
}
1.5.常放ディレクトリの検出:/data/local/tmp
void anti_localtmp(){
int pid=getpid();
const int bufsize=1024;
char line[bufsize];
char filename[bufsize];
sprintf(filename,"/data/local/tmp");
FILE *fd=fopen(filename,“r”);
if(fd!=NULL){
while(fgets(line,bufsize,fd)){
if(strstr(line,“android_server”)!=NULL){
int ret=kill(pid,SIGKILL);
}
}
}
fclose(fd);
}
1.6 break point指令の検出
unsigned long GetLibAddr() {
unsigned long ret = 0;
char name[] = “libptrace.so”;
char buf[4096], *temp;
int pid;
FILE *fp;
pid = getpid();
sprintf(buf, “/proc/%d/maps”, pid);
fp = fopen(buf, “r”);
if (fp == NULL) {
puts(“open failed”);
goto _error;
}
while (fgets(buf, sizeof(buf), fp)) {
if (strstr(buf, name)) {
temp = strtok(buf, “-”);
ret = strtoul(temp, NULL, 16);
break;
}
}
_error: fclose(fp);
return ret;
}
1.7 Linux inotifyプロパティを使用してファイルの読み書き、開くなどの権限を監視する
void anti_debug06() {
int ret, len, i;
int pid6 = getpid();
const int MAXLEN = 2048;
char buf[1024];
char readbuf[MAXLEN];
int fd, wd;
fd_set readfds;
fd = inotify_init();
sprintf(buf, “/proc/%d/maps”, pid6);
wd = inotify_add_watch(fd, buf, IN_ALL_EVENTS);
if(wd>=0){
while (1) {
i = 0;
FD_ZERO(&readfds);// readfds
FD_SET(fd, &readfds);// fd readfds
ret = select(fd + 1, &readfds, 0, 0, 0);
if(ret==-1){
break;
}
if (ret) {
len = read(fd, readbuf, MAXLEN);
while (i < len) {
struct inotify_event *event = (struct inotify_event *) &readbuf[i];
if ((event->mask & IN_ACCESS) || (event->mask & IN_OPEN)) {
int ret = kill(pid6, SIGKILL);
return;
}
i += sizeof(struct inotify_event) + event->len;
}
}
}
}
inotify_rm_watch(fd, wd);
close(fd);
}
1.8.デバッグされたコードの前後時間の差異を検出する;
int gettimeofday(struct timeval *tv,struct timezone *tz);
void anti_debug07(){
int pid=getpid();
struct timeval t1;
struct timeval t2;
struct timezone tz;
gettimeofday(&t1,&tz);
gettimeofday(&t2,&tz);
// int timeoff=gettimeofday(&t1,0)-gettimeofday(&t2,0);
int timeoff=(t2.tv_sec)-(t1.tv_sec);
if(timeoff>1){
int ret=kill(pid,SIGKILL);
return ;
}
}
より多くの安全技術の文章は、「ゲーム安全攻防」の公衆番号に注目し、一緒に交流し、一緒に進歩してください.