一个人的闲言碎语

dr0v

blog.drov.com.cn
一个人碎碎念。
About Me
A lazy security employee.

2018年9月12日星期三

当前主要工作是做一些流量黑产方面的研究,所以就近整理一下相关的基础技术知识。
一般来说,从业者会通过各种各样的方式制造黑色或低廉流量,流量往往是最容易变现的,
360在流量黑产方面有两篇较为出名的报告:
威胁猎人也有关于流量黑产的总结报告:
360通过监控色情软件产生的异常流量对其背后巨大的流量黑产进行了深入探究:整个产业链从开发到分发再到变现,参与者呈规模化、体系化、集团化,黑产对抗之激烈,此处体现尤为明显。
流量黑产的一些恶意代码相关技术以后再谈,这篇主要讲一些基础的东西。

移动互联网阶段,移动端流量价值越来越高,也促使了流量黑产大量涌入移动互联网;早期黑产大多通过模拟器产生流量进行变现——诸如下载推广、注册、抢红包等,导致开发者们在开发之初就要头疼识别模拟器的问题。
最早的识别方案简单粗暴:
  • 通过判断IMEI是否全部为0000000000格式
  • 判断手机号是否为155552*
  • 判断电池电量是否永远是50%
  • 判断Build中的一些模拟器特征值
这些往往也是恶意代码早期最常用来对抗模拟器逆向分析的方法;实践证明黑产在对抗上往往会走在前列,譬如到了后期,黑产对于手机是否连接usb线、是否有sim卡等都有严格的限制,就是为了对抗逆向分析。
所以多向黑产的同胞们学习往往是有很大好处的。
那么到了对抗后期,黑产也知道了这些简单粗暴的识别方法了,在其模拟器上往往通过修改ROM,构造各种符合真实设备特性的数据返回给采集APP,以假乱真。
比如,有的会直接通过IMEI的生成算法(IMEI最后一位为校验位,需要计算生成),构造相关IMEI:

这种IMEI一般开发者无法辨别真假,因为黑产往往会配合提供足以乱真的设备品牌、型号、sim卡序列号等信息;总之,目的就是你要啥我给啥,但你想要真实设备信息——抱歉,这个真没有。

当然,app开发者们也有对抗方法:
  • 匹配Qemu的一些特征文件:/system/lib/ttVM-prop、/system/lib/nox-prop等
  • 通过获取cpu信息,将x86的给过滤掉(真机一般都是基于ARM)
其中,值得一提的就是通过识别CPU架构是否为ARM来鉴别模拟器,其原理参考CacheEmulatorChecker:
ARM和X86架构的不同 —— ARM将指令和数据分开存储,而x86则只有一块缓存;所以在X86上可以做到的指令覆盖在ARM上无法实现,利用这种差异,即可完成对ARM架构和X86架构的区分,进而识别模拟器。
具体代码如下:
void (*asmcheck)(void);
int detect() {
    char code[] =
        "\xF0\x41\x2D\xE9"
        "\x00\x70\xA0\xE3"
        "\x0F\x80\xA0\xE1"
        "\x00\x40\xA0\xE3"
        "\x01\x70\x87\xE2"
        "\x00\x50\x98\xE5"
        "\x01\x40\x84\xE2"
        "\x0F\x80\xA0\xE1"
        ...
        "\xF0\x81\xBD\xE8";

    void *exec = mmap(NULL, (size_t) getpagesize(), PROT, MAP_ANONYMOUS | MAP_SHARED, -1, (off_t) 0);
    memcpy(exec, code, sizeof(code) + 1);
    asmcheck = (void *) exec;
    asmcheck();
    __asm __volatile (
    "mov %0,r0 \n"
    :"=r"(a)
    );
    munmap(exec, getpagesize());
    return a;
}
具体详解可以阅读源项目进行学习。
该方法目前在64位机上存在兼容性问题,望谨慎使用。
以上。
Categories: ,

0 评论:

发表评论