package com.android.reverse.collecter; import java.util.HashMap; import java.util.Iterator; import com.android.reverse.util.Logger; import com.android.reverse.util.NativeFunction; public class NativeHookCollecter{ private static NativeHookCollecter collecter; private static HashMap<String, HashMap<String, Integer>> initSysLinkInfo; private NativeHookCollecter() { } public static NativeHookCollecter getInstance() { if (collecter == null) { collecter = new NativeHookCollecter(); } return collecter; } public void init() { if(initSysLinkInfo == null) initSysLinkInfo = NativeFunction.getSyslinkSnapshot(); } public void parserNativeHookInfo() { Logger.log("The parser native hook info start"); if (initSysLinkInfo == null) { Logger.log("the init syslink info == null"); return; } int hookcount =0; HashMap<String, HashMap<String, Integer>> currentInfo = NativeFunction .getSyslinkSnapshot(); Iterator<String> libkeys = currentInfo.keySet().iterator(); HashMap<String, Integer> currentlinks; HashMap<String, Integer> initlinks; while (libkeys.hasNext()) { String libName = libkeys.next(); if (initSysLinkInfo.containsKey(libName)) { currentlinks = currentInfo.get(libName); initlinks = initSysLinkInfo.get(libName); Iterator<String> sysNamekeys = currentlinks.keySet().iterator(); while (sysNamekeys.hasNext()) { String sysName = sysNamekeys.next(); if (initlinks.containsKey(sysName)) { int currentAddr = currentlinks.get(sysName); int initAddr = initlinks.get(sysName); if (currentAddr != initAddr) { Logger.log("The " + libName + " syslink:" + sysName + " oldAddr:" + initAddr + " newAddr:" + currentAddr); hookcount++; } } } } } if(hookcount == 0 ){ Logger.log("the app can't hook native function"); }else{ Logger.log("The app total hook native function = "+hookcount); } Logger.log("The parser native hook info end"); } }