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_サーバが添付されていません
    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 ;
    }
    }
    
    
    

    より多くの安全技術の文章は、「ゲーム安全攻防」の公衆番号に注目し、一緒に交流し、一緒に進歩してください.