7.4.3轮询检测(第五十二课)
以下为图文内容:7.4.3 轮询检测
从进程名称反调试中我们可以看到,在android 中,在调试状态下,linux 会
向/proc/"进程PID"/status 中写入状态信息,既然这样,那么轮询检测的原理也是如此,
但是对于java层实现与C语言层是不完全一样的。
0x01 原理
在java层实现相关的命令,举个例子还是通过getpid();来获取pid的值,然后就是
查看返回读取status 的值, 利用exec 函数执行系统命令
Runtime.getRuntime().exec("cat /proc/"+ss+"/status");。
然后再将判断相关的数据进行处理,整合,最后根据结果得出是否结束相关程序,但
是轮询检测的意义,就是在so层进行的检测的时候,与java不一样的是,由java层实现
的轮询检测时间上是随机的,但同时也因为实现层是java层,就方便了进行逆向绕过。
0x02 相关代码
代码实现后,就是先实现一个执行循环的类
public final class RootCmd {
public static String GetTracePid(){
int pid =getpid();
String ss=String.valueOf(pid);
Process p = null;
try {
p = Runtime.getRuntime().exec("cat /proc/"+ss+"/status");
} catch (IOException e) {
e.printStackTrace();
}
String data = null;
BufferedReader ie = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
BufferedReader in = new BufferedReader(new
InputStreamReader(p.getInputStream()));
String error = null;
try {
while ((error = ie.readLine()) != null
&& !error.equals("null")) {
data += error + "\n";
}
} catch (IOException e) {
e.printStackTrace();
}
String line = null;
try {
while ((line = in.readLine()) != null
&& !line.equals("null")) {
data += line + "\n";
}
} catch (IOException e) {
e.printStackTrace();
}
Log.v("ls", data);
String tmp=data.split("\n");
tmp=tmp.replace("TracerPid:","");
// Log.i("TracePid",tmp);
return tmp;
}
在MainActivity中利用线程不断轮询执行该函数,因为toast只能在主线程中执行,
所以利用handleMessage向主线程发送消息。**** Hidden Message *****
感谢楼主 看来到吾爱汇编论坛学习是真的对了 感谢楼主 是不是啊?这么强?看看~~ 谢谢分享 感谢楼主 甘拜下风,谢谢分享 感谢楼主 阔以阔以,我觉得很好!