Android设备信息攻略之硬件信息build

来源:互联网 发布:unity3d 地图制作 编辑:程序博客网 时间:2024/06/06 21:44

最近又懒又忙,所以很久没写博客了~

因为项目需要,我把某社交软件稍微破解了下,重打包后实现了一机多开。本以为一劳永逸,没想到一周多之后,多开的那几个APP副本被告知“非法客户端”,账户都被强退,冻结了,这就有点尴尬了。

不过,从它没有立即处理,而是过了一周才处理,可以推测并不是本地检测,而是服务器检测。

那么,服务器是怎么把这些账户给毙了呢?实际上,不管它是用大数据分析检测,人工检测或者其他什么检测方式,它都少不了一个行为:数据收集。

通过逆向分析,从客户端的网络请求接口Hook到的数据可以分析出,里面包含了大量的Android设备信息,这无疑为服务器提供了检测的材料。

So,伪造数据,欺骗服务器呗~

后来,通过Hook技术一顿修改设备信息,现在的多开已基本稳定,总算解决了问题。


这里,先对设备的硬件信息进行研究,随笔一下~

-----------------------------知己知彼-------------------------------

build.prop文件

这个文件在手机的system目录下,可以通过adb shell把它copy到sdcard,再pull命令拉出来:


这里以ZTE手机为例,将build.prop文件打开,看看里面的信息。

因为文件内重要的信息就在前面,也就是一堆键值对,这里就不全弄出来了:

# begin build properties# autogenerated by buildinfo.shro.build.id=LMY47Vro.build.display.id=N928Dt_CNMobileB_1.18ro.build.sw_internal_version=N928Dt_Z78_CN_MSXPH1C500J118ro.build.sw_outer_version=N928Dt_CNMobileB_1.18ro.build.version.incremental=eng.jiangxiaojun.20150829.170221ro.build.version.sdk=22ro.build.version.codename=RELro.build.version.all_codenames=RELro.build.version.release=5.1.1ro.build.date=Sat Aug 29 17:03:44 CST 2015ro.build.date.utc=1440839024ro.build.type=userro.build.user=jiangxiaojunro.build.host=hipad25ro.build.tags=release-keysro.build.flavor=N928Dt-userro.product.model=ZTE N928Dtro.product.brand=ZTEro.product.name=N928Dtro.product.device=N928Dtro.product.board=msm8909# ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete,# use ro.product.cpu.abilist instead.ro.product.cpu.abi=armeabi-v7aro.build.display.dcc.version=N928Dt.user.V1.18.Rev14539.20150829ro.build.display.software.id=N928Dt_Z78_CN_MSXPH1C500J118ro.build.display.hardware.id=P1ro.build.display.hardware=P1ro.product.svn.info=14539ro.product.cpu.abi2=armeabiro.product.cpu.abilist=armeabi-v7a,armeabiro.product.cpu.abilist32=armeabi-v7a,armeabiro.product.cpu.abilist64=ro.product.manufacturer=ZTEro.product.locale.language=zhro.product.locale.region=CNro.wifi.channels=ro.board.platform=msm8909# ro.build.product is obsolete; use ro.product.devicero.build.product=N928Dt# Do not try to parse description, fingerprint, or thumbprintro.build.description=N928Dt-user 5.1.1 LMY47V eng.jiangxiaojun.20150829.170221 release-keysro.build.fingerprint=ZTE/N928Dt/N928Dt:5.1.1/LMY47V/jiangxiaojun08291703:user/release-keysro.build.characteristics=default# end build properties## from device/qcom/N928Dt/system.prop### system.prop for msm8909#
在文件中,我们可以看到了许多与设备硬件信息相关的参数。

当然,你可以通过修改build.prop文件后,再push回去覆盖源文件也是可以修改手机信息的,不过听说一不小心会变砖哦,不建议~


Build类获取参数

可以直接在工具里输入Build类后加个“.”,可以显示出Build类能获取到的所有参数,下面列举出来,其中注释的是比较重要的,也就是服务器喜欢校验的数据:

    public void printDeviceHardwareInfo(){        Log.d("zz", "---------------Build------------");        Log.d("zz", "Build.BOARD: "+Build.BOARD);        Log.d("zz", "Build.BOOTLOADER: "+Build.BOOTLOADER);        Log.d("zz", "Build.BRAND: "+Build.BRAND);//设备牌子        Log.d("zz", "Build.DEVICE: "+Build.DEVICE);//设备名        Log.d("zz", "Build.DISPLAY: "+Build.DISPLAY);//显示设备号        Log.d("zz", "Build.FINGERPRINT: "+Build.FINGERPRINT);//设备指纹        Log.d("zz", "Build.HARDWARE: "+Build.HARDWARE);        Log.d("zz", "Build.HOST: "+Build.HOST);        Log.d("zz", "Build.ID: "+Build.ID);//设备硬件id        Log.d("zz", "Build.MANUFACTURER: "+Build.MANUFACTURER);//厂商        Log.d("zz", "Build.MODEL: "+Build.MODEL);//设备型号        Log.d("zz", "Build.PRODUCT: "+Build.PRODUCT);//产品名,和DEVICE一样        Log.d("zz", "Build.SERIAL: "+Build.SERIAL);//设备序列号        Log.d("zz", "Build.TAGS: "+Build.TAGS);        Log.d("zz", "Build.TYPE: "+Build.TYPE);        Log.d("zz", "Build.UNKNOWN: "+Build.UNKNOWN);        Log.d("zz", "Build.USER: "+Build.USER);        Log.d("zz", "Build.CPU_ABI: "+Build.CPU_ABI);        Log.d("zz", "Build.CPU_ABI2: "+Build.CPU_ABI2);        Log.d("zz", "Build.RADIO: "+Build.RADIO);        Log.d("zz", "Build.TIME: "+Build.TIME);//出厂时间        Log.d("zz", "Build.VERSION.CODENAME: "+Build.VERSION.CODENAME);        Log.d("zz", "Build.VERSION.INCREMENTAL: "+Build.VERSION.INCREMENTAL);//不详,重要        Log.d("zz", "Build.VERSION.RELEASE: "+Build.VERSION.RELEASE);//系统版本号        Log.d("zz", "Build.VERSION.SDK: "+Build.VERSION.SDK);//api级数        Log.d("zz", "Build.VERSION.SDK_INT: "+Build.VERSION.SDK_INT);//api级数,int型返回    }
结果就不打印了,基本上上面的信息都能在build.prop文件里找到,也非常好找。

当然,服务器一般不会单独的校验某一项,有可能会把一堆信息拼接起来,然后做个MD5编码出来进行校验。


SystemProperties类获取Build参数

SystemProperties这个类是不对上层开放的,所以要通过反射机制获取到该类的“get”方法,然后通过该方法获取手机Build.prop文件中的参数。

P.S.有一些客户端就是那么阴险,喜欢绕过Build类,通过下层接口来获取硬件信息~

就拿Build.FINGERPRINT这个参数来举个栗子吧,这个参数在build.prop文件里对应的key为“ro.build.fingerprint”,那么:

try{Class systemProperties=Class.forName("android.os.SystemProperties");Method get=systemProperties.getDeclaredMethod("get", String.class);String fingerprint=(String)get.invoke(null, "ro.build.fingerprint");Log.d("zz", "Fingerprint:"+fingerprint);}catch (Exception e){}
结果我就不打印了,基本也就这样,很简单。

SystemProperties类还能获取到Build类获取不到的信息,有兴趣的可自行研究一下或者百度一下,这里就不多说了。

----------------------------攻---------------------------

下面的内容业内人士一看就懂,我就不多说了。关于Xposed使用,可以自行百度,我也写过相关博客。

对于Build类:

直接修改Build类的static变量

XposedHelpers.setStaticObjectField(className, fieldName, object);

对于SystemProperties类:

hook其get方法,直接setResult修改返回值

         XposedHelpers.findAndHookMethod("android.os.SystemProperties",         lpparam.classLoader, "get", String.class, new XC_MethodHook() {                     @Override                     protected void afterHookedMethod(MethodHookParam param) throws Throwable {                         //param.setResult(value);                     }                  });

把build.prop里面的参数都修改一遍,基本上就把硬件都换了一遍,这样一来,可以防止服务器对硬件信息的检测了。

然而,build里的硬件信息作为服务器检测数据也只能是冰山一角而已,更多的如唯一标识,sim卡信息,网络信息,位置信息会在后面博客继续随笔~





0 0
原创粉丝点击