● 对一款人脸识别自助储物柜逆向分析(二)

对一款人脸识别自助储物柜逆向分析(一)

1.人脸识别功能实现

face/FaceHelper.java里看到这句:

public static final KFFaceM mFace = new KFFaceM();

public boolean FaceDetection(byte[] bArr, int i, int i2) {
        synchronized (this.objectFaceDetection) {
            if (bArr == null) {
                return false;
            }
            ByteBuffer order = ByteBuffer.allocateDirect(3686400).order(ByteOrder.nativeOrder());
            order.put(bArr);
            float[] FindFace = mFace.FindFace(order, i, i2, true);
            return FindFace.length > 1 && ((int) FindFace[0]) > 0;
        }
    }

FaceDetection方法已经提示得很明显了,就是人脸识别。调用mFace.FindFace对比人脸数据。继续溯源,找到了

public class KFFaceM {
    public static String TAG = "KFFaceM";

    static {
        System.loadLibrary("Face");
    }
......
}

又加载了外部动态库libface

2.活体检测

在看face/FaceHelper.java时候发现,这个类初始化时,优先加载了LivingBodyHelper,不仅做了人脸识别,还做了活体检测,也就是说用手机或者照片欺骗摄像头是行不通的。如下图高亮所示:

有一段代码匪夷所思,把人脸识别的精度设置为了70%,也就是说跟之前摄像头抓取的照片有70%以上的相似度,即可通过。实际中很多APP都在95%以上,估计是从柜子本身的安全度或者提高识别速度考虑吧。

face/LivingBodyHelper.java人脸检测部分源码:

import cn.heils.detect.FaceCnn;

public class LivingBodyHelper {
    private static FaceCnn faceCnn = new FaceCnn();
}
......

活体检测又调用了cn.heils.detect.FaceCnn,heils为深圳禾思众成,还以为是 华为海思。人脸识别的源码底层是OpenCVTensorFlow——计算机视觉和机器学习软件库,比串口操作的难度高了几个等级。

import org.tensorflow.contrib.android.TensorFlowInferenceInterface;

public class c {
    private static c b;
    private TensorFlowInferenceInterface a;
    private String c = FaceCnn.a().getInput();
    private String d = FaceCnn.a().getActivation();
    private int e = FaceCnn.a().getGate();

    private c(Context context) {
        b(context);
    }

    public static void a(Context context) {
        b = new c(context);
    }

    public static float[] a(Bitmap bitmap) {
        float[] a;
        synchronized (c.class) {
            try {
                a = b.a(b.b(bitmap));
            } catch (Throwable th) {
                throw th;
            }
        }
        return a;
    }
    
......
}

3.结尾

虽然只在上一篇中做了一个android demo,真的非常不喜欢android开发,因为繁琐的配置文件。我觉得Linux+QT,甚至是Electron更干净一些。或许是android的资料更多吧...