2024年最全恶意用户识别?——Java 层反模拟器、反Hook、反多开技巧,已拿offer

最后

为什么我不完全主张自学?
平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。

除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。

我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

应该学哪些技术才能达到企业的要求?(下图总结)

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

if (Build.BRAND.equals(“generic”) ||
Build.BRAND.equals(“generic_x86”) ||
Build.BRAND.equals(“TTVM”) ||
Build.BRAND.contains(“Andy”)) {
newRating++;
}

if (Build.DEVICE.contains(“generic”) ||
Build.DEVICE.contains(“generic_x86”) ||
Build.DEVICE.contains(“Andy”) ||
Build.DEVICE.contains(“ttVM_Hdragon”) ||
Build.DEVICE.contains(“Droid4X”) ||
Build.DEVICE.contains(“nox”) ||
Build.DEVICE.contains(“generic_x86_64”) ||
Build.DEVICE.contains(“vbox86p”)) {
newRating++;
}

if (Build.MODEL.equals(“sdk”) ||
Build.MODEL.contains(“Emulator”) ||
Build.MODEL.equals(“google_sdk”) ||
Build.MODEL.contains(“Droid4X”) ||
Build.MODEL.contains(“TiantianVM”) ||
Build.MODEL.contains(“Andy”) ||
Build.MODEL.equals(“Android SDK built for x86_64”) ||
Build.MODEL.equals(“Android SDK built for x86”)) {
newRating++;
}

if (Build.HARDWARE.equals(“goldfish”) ||
Build.HARDWARE.equals(“vbox86”) ||
Build.HARDWARE.contains(“nox”) ||
Build.HARDWARE.contains(“ttVM_x86”)) {
newRating++;
}

if (Build.FINGERPRINT.contains(“generic/sdk/generic”) ||
Build.FINGERPRINT.contains(“generic_x86/sdk_x86/generic_x86”) ||
Build.FINGERPRINT.contains(“Andy”) ||
Build.FINGERPRINT.contains(“ttVM_Hdragon”) ||
Build.FINGERPRINT.contains(“generic_x86_64”) ||
Build.FINGERPRINT.contains(“generic/google_sdk/generic”) ||
Build.FINGERPRINT.contains(“vbox86p”) ||
Build.FINGERPRINT.contains(“generic/vbox86p/vbox86p”)) {
newRating++;
}

try {
String opengl = android.opengl.GLES20.glGetString(android.opengl.GLES20.GL_RENDERER);
if (opengl != null) {
if (opengl.contains(“Bluestacks”) ||
opengl.contains(“Translator”)
)
newRating += 10;
}
} catch (Exception e) {
e.printStackTrace();
}

try {
File sharedFolder = new File(Environment
.getExternalStorageDirectory().toString()

  • File.separatorChar
  • “windows”
  • File.separatorChar
  • “BstSharedFolder”);

if (sharedFolder.exists()) {
newRating += 10;
}
} catch (Exception e) {
e.printStackTrace();
}
rating = newRating;
}
return rating > 3;//不能再少了,否则有可能误判,若增减了新的嫌疑度判定属性,要重新评估该值

Anti 多开

多开麻烦在于真机多开,具备真机特征,模拟器的检测就失效了,因为它就是真机。 应对方法:普通的软多开,一般绕不过uid,还是用宿主的。因此,如果满足同一uid下的两个进程对应的包名,在"/data/data"下有两个私有目录,则违背了系统 "只为一个应用创建唯一一个私有目录"的设定,则该应用被多开了。

public static boolean isRunInVirtual() {

String filter = getUidStrFormat();

String result = exec(“ps”);
if (result == null || result.isEmpty()) {
return false;
}

String[] lines = result.split(“\n”);
if (lines == null || lines.length <= 0) {
return false;
}

int exitDirCount = 0;

for (int i = 0; i < lines.length; i++) {
if (lines[i].contains(filter)) {
int pkgStartIndex = lines[i].lastIndexOf(" “);
String processName = lines[i].substring(pkgStartIndex <= 0
? 0 : pkgStartIndex + 1, lines[i].length());
File dataFile = new File(String.format(”/data/data/%s",
processName, Locale.CHINA));
if (dataFile.exists()) {
exitDirCount++;
}
}
}

return exitDirCount > 1;
}

这个方法是在简书 JZaratustra 大佬的文章里学到的:Android虚拟机多开检测。 但是有一些多开,比如小米自带的多开这种,进程好像都是隔离的独立uid的,暂时没有好办法识别。

Anti Hook

不多说了,方法都被你Hook了,你就是大爷,你说啥就是啥。 应对方法:检测是否安装了xposed相关应用,检测调用栈道的可疑方法,检测并不应该native的native方法,通过/proc/[pid]/maps检测可疑的共享对象或者JAR。

检测是否安装了xposed相关应用

PackageManager packageManager = context.getPackageManager();
List applicationInfoList = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);

for(ApplicationInfo applicationInfo : applicationInfoList) {
if(applicationInfo.packageName.equals(“de.robv.android.xposed.installer”)) {
Log.wtf(“HookDetection”, “Xposed found on the system.”);
}
if(applicationInfo.packageName.equals(“com.saurik.substrate”)) {
Log.wtf(“HookDetection”, “Substrate found on the system.”);
}
}

检测调用栈道的可疑方法

try {
throw new Exception(“blah”);
} catch (Exception e) {
int zygoteInitCallCount = 0;
for (StackTraceElement stackTraceElement : e.getStackTrace()) {
if (stackTraceElement.getClassName().equals(“com.android.internal.os.ZygoteInit”)) {
zygoteInitCallCount++;
if (zygoteInitCallCount == 2) {
Log.wtf(“HookDetection”, “Substrate is active on the device.”);
isHook = true;
}
}
if (stackTraceElement.getClassName().equals(“com.saurik.substrate.MS$2”) &&
stackTraceElement.getMethodName().equals(“invoked”)) {
Log.wtf(“HookDetection”, “A method on the stack trace has been hooked using Substrate.”);
isHook = true;
}
if (stackTraceElement.getClassName().equals(“de.robv.android.xposed.XposedBridge”) &&
stackTraceElement.getMethodName().equals(“main”)) {
Log.wtf(“HookDetection”, “Xposed is active on the device.”);
isHook = true;
}
if (stackTraceElement.getClassName().equals(“de.robv.android.xposed.XposedBridge”) &&
stackTraceElement.getMethodName().equals(“handleHookedMethod”)) {
Log.wtf(“HookDetection”, “A method on the stack trace has been hooked using Xposed.”);
isHook = true;
}

}
}

通过/proc/[pid]/maps检测可疑的共享对象或者JAR:

try {
Set libraries = new HashSet();
String mapsFilename = “/proc/” + android.os.Process.myPid() + “/maps”;
BufferedReader reader = new BufferedReader(new FileReader(mapsFilename));
String line;
while ((line = reader.readLine()) != null) {
if (line.endsWith(“.so”) || line.endsWith(“.jar”)) {
int n = line.lastIndexOf(" ");
libraries.add(line.substring(n + 1));
}
}
for (String library : libraries) {

总结

总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。

如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

111781294)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值