精华内容
下载资源
问答
  • 抖音设备注册device_register签名加密流程device_id,...获取device_id有几个重点: (1) carrier、display_name字段:这个字段不是utf-8编码,是GBK编码,要做编码转换 (2) Idfa、VendorID字段:标准UUID算法生成即可 ...

    接口:/service/2/device_register/

    抖音生成设备id算法
    获取device_id有几个重点:
    (1) carrier、display_name字段:这个字段不是utf-8编码,是GBK编码,要做编码转换
    (2) Idfa、VendorID字段:标准UUID算法生成即可
    (3) Openudid:随机生成的
    device_register接口中post包体是加密的,算法实际上是AES,加密的参数是一些基础信息
    过程:
    首先使用标准Gzip压缩参数然后调AES进行加密。Android和iOS加密方法相同。
    8系列版本针对设备注册的最新风控多了一个log算法。

    测试地址
    https://www.showdoc.cc/527312186916410?page_id=3113306537235933

    更多了解
    邮箱:
    giulenkas@outlook.com

    展开全文
  • 了解到前一段时间,火山小视频升级为了抖音火山版,想必其相应的安全措施也升级了吧,笔者本着学术交流的目的研究了一下抖音火山版的设备注册方法,也就是生成device_id与iid(install_id)的过程。从而找到了如何...

    前言

    了解到前一段时间,火山小视频升级为了抖音火山版,想必其相应的安全措施也升级了吧,笔者本着学术交流的目的研究了一下抖音火山版的设备注册方法,也就是生成device_id与iid(install_id)的过程。从而找到了如何能够模拟生成这两个id,生成出来的这两个id在访问抖音火山版网络接口的时候证明有效,但是能否用于其他头条系应用就不得而知了,可供参考。

    逆向

    静态分析

    静态分析也就是反编译,反编译软件很多,从基本的Apktool工具,到强大的jadx,还有也比较强大的JEB,有时候Android studio也能帮忙分析,之前也试过GDA也不错,笔者比较常用的还是jadx和JEB。工欲善其事,必先利其器,这句话在逆向分析的研究中太适配了。废话不多说,下面就开始吧。

    jadx打开抖音火山版的apk文件,可以先找到AndroidManifest.xml文件,记录一下它的包名package=”com.ss.android.ugc.live”,然后呢?一脸懵,要不是看了前辈的工作才不知道要看什么,可以得知有个api很关键:https://log.snssdk.com/service/2/device_register/ ,那么就先搜索这个字符串吧,可以尝试搜索device_register或者service/2/device_register/等等可能的字符串都行,看看能找到什么代码。使用jadx具体操作的时候需要选择导航-》搜索文本,然后要等一会儿,因为它正在反编译,如下图所示:

    Alt pic
    反编译完之后可以试试查找文本:service/2/device_register/,发现有个类很可疑:…deviceregister.b.a.URL_DEVICE_REGISTER(),如下图所示:

     

     

     

     

    点进去仔细瞧瞧。发现这是个构造url列表的函数,肯定有什么地方调用它了。然后按着control键寻找该函数的用例,发现除了它自己就只有一个地方调用它了,进入调用它的函数发现是未能正常反编译的函数,如下图所示:


    可以看到有个DeviceRegisterThread字符串映入眼帘,然后就能大概知道这个类比较重要了,上面能看到它继承的Thread类,那么这就应该是设备注册请求网络部分的子线程了。唉,其实一开始笔者找到别的地方去了,一开始专注于分析这个device_id所在的本地缓存了,因为本地有缓存的时候会优先加载本地缓存而不是发起这个网络请求,后来发现分析完了本地缓存之后并没有什么用,不过倒是把附近的几个类整明白了一点。扯远了,下面还是继续分析这个继承自Thread类的com.ss.android.deviceregister.b.c.a类吧,这个类其实可以从头分析,这里不再详细说了,先把jadx正常反编译的部分仔细过一遍,然后就能发现上图那个反编译失败的函数很重要,应该就是发起网络请求相关的部分。但是jadx反编译失败了,而且这个伪码看起来也不适合分析,那么就想着看smail代码呗,但是发现竟然找不到这个类对应的smail代码,只能说是jadx的bug了吧。那怎么办?这时候JEB就可以出场了。

    笔者之前用的是JEB2,这次搞这个的时候搜了一下这个工具发现JEB3也出来了,上面提到的JEB超链接给的就是一个JEB3的地址,虽然好像是个beta版本,但是也不影响使用。之前用JEB2的时候就遇到过一个问题,那就是直接打开一个apk安装包的时候,特别是体积比较大的安装包的时候会提示内存溢出而无法打开的情况,解决方法是找到想要具体分析的dex文件,然后只打开该dex文件分析即可。所以这次笔者也是先找到了上面要分析的代码所在的dex文件,然后单独分析该dex文件即可。那么问题来了,怎么找到代码所在的dex文件呢?这时候想到jadx反编译的时候好像在shell上面输出了一些日志信息,可以看看这些信息能不能有所帮助。重新使用jadx打开apk文件,然后从源代码目录中找到com.ss.android.deviceregister.b.c.a类,进行反编译,如下图所示:


    从上图中能够看到,日志中输出了该类所在的dex文件为classes4.dex。那么就用JEB打开classes4.dex吧,然后找到这个类,分析一下上面那个重要的函数,如下图所示:

     


    这个看起来就不错了,jeb对匿名内部类的反编译效果的确比jadx好一些,那就仔细分析一下这个函数吧,jeb的改名功能还是很好用的,经过笔者手动改名之后的函数,如下图所示:


    这样看起来就舒服一些了,但是有些跳转还是很奇怪,经过笔者的手动重写,代码提取如下:

    private boolean is_successful_get_app_config_from_net(String args_json_string) {
        String response = null;
        Object args_bytes_clone;
        String url;
        int url_index;
        String default_response = null;
        boolean is_in_10min_from_last_request;
        long now_time;
        byte[] args_bytes;
        try {
            args_bytes = args_json_string.getBytes("UTF-8");
            now_time = System.currentTimeMillis();
            if(now_time - this.b.mLastGetAppConfigTime < 600000) {
                is_in_10min_from_last_request = true;
            }
            else {
                is_in_10min_from_last_request = false;
            }
        }
        catch(Throwable v0) {
            return false;
        }
     
        try {
            this.b.mLastGetAppConfigTime = now_time;
            String[] url_list = com.ss.android.deviceregister.b.a.URL_DEVICE_REGISTER();
            if(url_list == null) {
                throw new IllegalArgumentException("url is null");
            }
     
            int urls_length = url_list.length;
            url_index = 0;
            while(true) {
                if(url_index >= urls_length) {
                    break;
                }
     
                url = url_list[url_index];
                args_bytes_clone = args_bytes.clone();
                if(StringUtils.isEmpty(url)) {
                    ++url_index;
                    continue;
                }
     
                url = NetUtil.addCommonParams(SemUtils.updateUrl(this.b.mContext, url), true);
                Logger.debug();
     
                try {
                    if(!this.is_encrypt()) {
                        if(is_in_10min_from_last_request) {
                            url = url + "&config_retry=b";
                        }
     
                        response = NetworkClient.getDefault().post(url, args_bytes, true, "application/json; charset=utf-8", false);
                        break;
                    }
     
                    try {
                        response = NetUtil.sendEncryptLog(url, ((byte[])args_bytes_clone), this.b.mContext, is_in_10min_from_last_request);
                        break;
                    }
                    catch(RuntimeException v0_3) {
                        if(is_in_10min_from_last_request) {
                            try {
                                url = url + "&config_retry=b";
                                response = NetworkClient.getDefault().post(url, args_bytes, true, "application/json; charset=utf-8", false);
                                break;
                            }
                            catch(Throwable v0) {
                                try {
                                    if(!this.b.shouldRetryWhenError(v0)) {
                                        throw v0;
                                    }
                                    ++url_index;
                                    continue;
                                }
                                catch(Throwable v0) {
                                    return false;
                                }
                            }
                        }
     
                        response = NetworkClient.getDefault().post(url, args_bytes, true, "application/json; charset=utf-8", false);
                        break;
                    }
                }
                catch(Throwable v0) {
                    try {
                        if(!this.b.shouldRetryWhenError(v0)) {
                            throw v0;
                        }
                        ++url_index;
                        continue;
                    }
                    catch(Throwable v0) {
                        return false;
                    }
                }
            }
        }
        catch(Throwable v0) {
            return false;
        }
     
        if(response != null) {
            try {
                if(response.length() != 0) {
                    this.parse_net_config(new JSONObject(response));
                    return true;
                }
            }
            catch(Throwable v0) {
                return false;
            }
        }
     
        return false;
    }

     

    这样就基本上能明白它在干什么了。

    简单来说就是先拿到一个设备注册的url地址列表,然后遍历访问,如果访问成功了就结束,访问的时候先添加公共参数,然后判断是否需要加密请求,如果需要加密请求则调用加密请求函数,否则调用普通请求函数,另外如果调用加密请求函数抛异常时也会去调用普通请求函数,还有一些重试参数等等。这时候想到之前抓包的时候找到的设备注册请求都是加密的,那么可以判断is_encrypt()这个函数的都是返回的true,那么如果这个函数返回false的时候是不是就是不加密的请求了呢?好了,静态分析部分就先到这里,下面来动态分析一下,也就是尝试一下这个函数返回false的时候的效果。

    动态分析

    动态分析也就是在app运行时,对其进行分析,比较常见的是分析app的网络请求行为,调用系统API的行为,访问文件的行为等等。由于本文是研究设备id的生成,其实也就是研究设备注册时的一个网络接口,那么就只分析网络请求行为即可。笔者比较常用的网络抓包工具是Charles,需要在手机端配置代理和安装Charles的证书,这部分也不详细说了。

    上文也提到了,本文主要是研究这个接口:https://log.snssdk.com/service/2/device_register/ ,正常情况下设备在注册的时候会加密访问这个接口,比如新安装了app或者app被清理数据之后,再打开app时就会去访问这个接口,访问时是个POST请求,参数是明文,但是带的data是加密的,如下图所示:


    通过上文静态分析可知is_encrypt()这个函数能够控制是否加密传输,所以可以想到利用Xposed进行Hook函数,使得该函数的返回值固定为false。

    Xposed很强大,它能够在其他app运行时注入代码,具体原理和使用教程这里也不再详述,下面笔者贴一下hook部分的代码吧,其实很短:

    findAndHookMethod("com.ss.android.deviceregister.b.a", param.classLoader, "isEncrypt", new XC_MethodHook() {
        @Override
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
            boolean oldResult = (boolean) param.getResult();
            Log.i(TAG, "com.ss.android.deviceregister.b.a.isEncrypt(), oldResult=" + oldResult + ", newResult=" + false);
            param.setResult(false);
        }
    });
     
    
    可以看到这里的data部分已经变成明文了。
    
    

    至此,找到了设备注册的明文接口,但是看前辈的工作,他用密文请求注册的方式模拟生成的device_id和iid不能用,所以笔者用这种明文注册方式进行了模拟生成设备id,模拟方式同前辈的代码类似,然后用模拟生成的设备id进行了其他接口的访问测试,貌似可以用。

    总结

    整体来看,抖音火山版比之前的火山小视频的安全强度要高一些,或许是和抖音有一些关系吧,毕竟都是头条系产品,技术上复用一下也不太困难,而且感觉在关键的代码逻辑部分应该存在一定的反反编译,就像上面笔者手动还原的那个函数。本文只是针对一个小功能进行了较为详细的逆向分析,还并没有涉及到native层,那一块的对抗估计更加强烈,所以,先这样吧。

    声明

    请勿使用本技术于商用或大量抓取!

    若因使用本技术与抖音火山版官方造成不必要的纠纷,本人盖不负责,存粹技术爱好,若侵犯抖音火山版相关公司的权益,请告知!

    转载请注明出处,谢谢!

    展开全文
  • struct usb_device_id 详解 usb匹配

    千次阅读 2020-02-19 17:51:53
    struct usb_device_id 详解 struct usb_device_id 结构提供了这个驱动支持的一个不同类型 USB 设备的列表. 这个列表被USB 核心用来决定给设备哪个驱动, 并且通过热插拔脚本来决定哪个驱动自动加载, 当特定设备被插入...

    struct usb_device_id 详解

    struct usb_device_id 结构提供了这个驱动支持的一个不同类型 USB 设备的列表. 这个列表被USB 核心用来决定给设备哪个驱动, 并且通过热插拔脚本来决定哪个驱动自动加载, 当特定设备被插入系统时.

    结构定义

    struct usb_device_id {  
        /* which fields to match against? */  
        __u16       match_flags; //说明使用哪种匹配方式
      
        /* Used for product specific matches; range is inclusive */  
        __u16       idVendor;                   //供应商ID  
        __u16       idProduct;                  //产品ID  
        __u16       bcdDevice_lo;  
        __u16       bcdDevice_hi;  
      
        /* Used for device class matches */  
        __u8        bDeviceClass;               //设备类型  
        __u8        bDeviceSubClass;            //设备子类型  
        __u8        bDeviceProtocol;            //协议  
      
        /* Used for interface class matches */  
        __u8        bInterfaceClass;            //接口类  
        __u8        bInterfaceSubClass;         //接口子类  
        __u8        bInterfaceProtocol;         //接口协议  
      
        /* not matched against */  
        kernel_ulong_t  driver_info;  
    };
    

    初始化方式

    有几个宏可用来初始化这个结构:

    USB_DEVICE(vendor, product)
    创建一个 struct usb_device_id, 可用来只匹配特定供应商和产品 ID 值,
    对于需要特定驱动的 USB 设备,这是非常普遍用的。
    
    USB_DEVICE_VER(vendor, product, lo, hi)
    创建一个 struct usb_device_id, 用来在一个版本范围中只匹配特定供应商和产品 ID 值。
    
    USB_DEVICE_INFO(class, subclass, protocol)
    创建一个 struct usb_device_id, 可用来只匹配一个特定类的 USB 设备。
    
    USB_INTERFACE_INFO(class, subclass, protocol)
    创建一个 struct usb_device_id, 可用来只匹配一个特定类的 USB 接口。
    

    查看usb信息

    Usage: lsusb [options]...
    List USB devices
      -v, --verbose
          Increase verbosity (show descriptors)
      -s [[bus]:][devnum]
          Show only devices with specified device and/or
          bus numbers (in decimal)
      -d vendor:[product]
          Show only devices with the specified vendor and
          product ID numbers (in hexadecimal)
      -D device
          Selects which device lsusb will examine
      -t
          Dump the physical USB device hierarchy as a tree
      -V, --version
          Show version of program
    
    

    example:

    xhr@xhr-desktop:~$ lsusb 
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 002 Device 002: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    xhr@xhr-desktop:~$ lsusb -v -d 0x1d6b:
    
    展开全文
  • struct usb_device_id

    千次阅读 2017-02-23 00:25:31
    struct usb_device_id { /* which fields to match against? */ __u16 match_flags; /* Used for product specific matches; range is inclusive */ __u16 idVendor; __u16 idProduct; __u16 bcdDevice_l
    struct usb_device_id {
    	/* which fields to match against? */
    	__u16		match_flags;
    
    	/* Used for product specific matches; range is inclusive */
    	__u16		idVendor;                   //供应商ID
    	__u16		idProduct;                  //产品ID
    	__u16		bcdDevice_lo;
    	__u16		bcdDevice_hi;
    
    	/* Used for device class matches */
    	__u8		bDeviceClass;               //设备类型
    	__u8		bDeviceSubClass;            //设备子类型
    	__u8		bDeviceProtocol;            //协议
    
    	/* Used for interface class matches */
    	__u8		bInterfaceClass;            //接口类
    	__u8		bInterfaceSubClass;         //接口子类
    	__u8		bInterfaceProtocol;         //接口协议
    
    	/* not matched against */
    	kernel_ulong_t	driver_info;
    };

    相关宏:

    /* Some useful macros to use to create struct usb_device_id */
    #define USB_DEVICE_ID_MATCH_VENDOR		0x0001
    #define USB_DEVICE_ID_MATCH_PRODUCT		0x0002
    #define USB_DEVICE_ID_MATCH_DEV_LO		0x0004
    #define USB_DEVICE_ID_MATCH_DEV_HI		0x0008
    #define USB_DEVICE_ID_MATCH_DEV_CLASS		0x0010
    #define USB_DEVICE_ID_MATCH_DEV_SUBCLASS	0x0020
    #define USB_DEVICE_ID_MATCH_DEV_PROTOCOL	0x0040
    #define USB_DEVICE_ID_MATCH_INT_CLASS		0x0080
    #define USB_DEVICE_ID_MATCH_INT_SUBCLASS	0x0100
    #define USB_DEVICE_ID_MATCH_INT_PROTOCOL	0x0200

    #define USB_DEVICE_ID_MATCH_DEVICE \
    		(USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT)
    #define USB_DEVICE_ID_MATCH_DEV_RANGE \
    		(USB_DEVICE_ID_MATCH_DEV_LO | USB_DEVICE_ID_MATCH_DEV_HI)
    #define USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION \
    		(USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_RANGE)
    #define USB_DEVICE_ID_MATCH_DEV_INFO \
    		(USB_DEVICE_ID_MATCH_DEV_CLASS | \
    		USB_DEVICE_ID_MATCH_DEV_SUBCLASS | \
    		USB_DEVICE_ID_MATCH_DEV_PROTOCOL)
    #define USB_DEVICE_ID_MATCH_INT_INFO \
    		(USB_DEVICE_ID_MATCH_INT_CLASS | \
    		USB_DEVICE_ID_MATCH_INT_SUBCLASS | \
    		USB_DEVICE_ID_MATCH_INT_PROTOCOL)
    
    /**
     * USB_DEVICE - macro used to describe a specific usb device
     * @vend: the 16 bit USB Vendor ID
     * @prod: the 16 bit USB Product ID
     *
     * This macro is used to create a struct usb_device_id that matches a
     * specific device.
     */
    #define USB_DEVICE(vend, prod) \
    	.match_flags = USB_DEVICE_ID_MATCH_DEVICE, \
    	.idVendor = (vend), \
    	.idProduct = (prod)
    /**
     * USB_DEVICE_VER - describe a specific usb device with a version range
     * @vend: the 16 bit USB Vendor ID
     * @prod: the 16 bit USB Product ID
     * @lo: the bcdDevice_lo value
     * @hi: the bcdDevice_hi value
     *
     * This macro is used to create a struct usb_device_id that matches a
     * specific device, with a version range.
     */
    #define USB_DEVICE_VER(vend, prod, lo, hi) \
    	.match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, \
    	.idVendor = (vend), \
    	.idProduct = (prod), \
    	.bcdDevice_lo = (lo), \
    	.bcdDevice_hi = (hi)
    
    /**
     * USB_DEVICE_INTERFACE_PROTOCOL - describe a usb device with a specific interface protocol
     * @vend: the 16 bit USB Vendor ID
     * @prod: the 16 bit USB Product ID
     * @pr: bInterfaceProtocol value
     *
     * This macro is used to create a struct usb_device_id that matches a
     * specific interface protocol of devices.
     */
    #define USB_DEVICE_INTERFACE_PROTOCOL(vend, prod, pr) \
    	.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
    		       USB_DEVICE_ID_MATCH_INT_PROTOCOL, \
    	.idVendor = (vend), \
    	.idProduct = (prod), \
    	.bInterfaceProtocol = (pr)
    
    /**
     * USB_DEVICE_INFO - macro used to describe a class of usb devices
     * @cl: bDeviceClass value
     * @sc: bDeviceSubClass value
     * @pr: bDeviceProtocol value
     *
     * This macro is used to create a struct usb_device_id that matches a
     * specific class of devices.
     */
    #define USB_DEVICE_INFO(cl, sc, pr) \
    	.match_flags = USB_DEVICE_ID_MATCH_DEV_INFO, \
    	.bDeviceClass = (cl), \
    	.bDeviceSubClass = (sc), \
    	.bDeviceProtocol = (pr)
    
    /**
     * USB_INTERFACE_INFO - macro used to describe a class of usb interfaces
     * @cl: bInterfaceClass value
     * @sc: bInterfaceSubClass value
     * @pr: bInterfaceProtocol value
     *
     * This macro is used to create a struct usb_device_id that matches a
     * specific class of interfaces.
     */
    #define USB_INTERFACE_INFO(cl, sc, pr) \
    	.match_flags = USB_DEVICE_ID_MATCH_INT_INFO, \
    	.bInterfaceClass = (cl), \
    	.bInterfaceSubClass = (sc), \
    	.bInterfaceProtocol = (pr)
    
    /**
     * USB_DEVICE_AND_INTERFACE_INFO - describe a specific usb device with a class of usb interfaces
     * @vend: the 16 bit USB Vendor ID
     * @prod: the 16 bit USB Product ID
     * @cl: bInterfaceClass value
     * @sc: bInterfaceSubClass value
     * @pr: bInterfaceProtocol value
     *
     * This macro is used to create a struct usb_device_id that matches a
     * specific device with a specific class of interfaces.
     *
     * This is especially useful when explicitly matching devices that have
     * vendor specific bDeviceClass values, but standards-compliant interfaces.
     */
    #define USB_DEVICE_AND_INTERFACE_INFO(vend, prod, cl, sc, pr) \
    	.match_flags = USB_DEVICE_ID_MATCH_INT_INFO \
    		| USB_DEVICE_ID_MATCH_DEVICE, \
    	.idVendor = (vend), \
    	.idProduct = (prod), \
    	.bInterfaceClass = (cl), \
    	.bInterfaceSubClass = (sc), \
    	.bInterfaceProtocol = (pr)


    展开全文
  • of_device_id

    千次阅读 2016-10-13 10:43:21
    of_device_id 用于device和driver的match,其在kernel\linux-3.10.y\include\linux\mod_devicetable.h中定义 /* Struct used for matching a device */ struct of_device_id {  char name[32];  char type...
  • 杨过听她说这几句话时眼神凄楚,一颗心怦的一跳,胸口一痛,失声叫道:“姑姑!” 就在此时,完颜萍已横刀自刎。耶律齐抢上两步,右手长出,又伸两指将她柳叶刀夺了过来,随手点了她臂上穴道,说道:“好端端的,...
  • acpi_device_id 中cls的作用

    千次阅读 2017-06-20 10:51:35
    acpi_device_id 其实是有四个变量组成的,定义如下: ... __u8 id[ACPI_ID_LEN];  kernel_ulong_t driver_data;  __u32 cls;  __u32 cls_msk; }; 但是我们一般定义的时候 static const struct acpi_dev
  • i2c_device_id数据结构分析

    千次阅读 2013-05-03 22:17:26
    在学习I2c设备驱动drivers/misc/eeprom/at24.c文件中有下面一个数据结构体...static const struct i2c_device_id at24_ids[] = {  /* needs 8 addresses as A0-A2 are ignored */  { "24c00", AT24_DEVICE_MAGIC(12
  • Android_获取手机设备信息device_id

    千次阅读 2016-10-25 20:01:59
    执行:getDeviceInfo(Context context) 方法,返回结果就是设备信息 ... json.put("device_id", device_id); return json.toString(); } catch (Exception e) { e.printStackTrace(); } return null; }
  • Linux I2C驱动:i2c_device_id

    千次阅读 2013-04-09 16:08:12
    Linux I2C设备驱动中,是通过i2c device id名字进行i2c device和i2c driver匹配的。 例如以下在板级代码定义"twl4030"作为device名字信息。 static struct i2c_board_info __initdata omap3evm_i2c_boardinfo[] = ...
  • i2c_device_id数据结构分析 .

    千次阅读 2013-07-01 08:31:06
    在学习I2c设备驱动drivers/misc/eeprom/at24.c文件中有下面一个数据...static const struct i2c_device_id at24_ids[] = {  /* needs 8 addresses as A0-A2 are ignored */  { "24c00", AT24_DEVICE_MAGIC(128
  • 获取Android设备的mac 和device_id

    千次阅读 2014-05-30 14:56:52
    // 获取设备的mac 和device_id public static String getDeviceInfo(Context context) { try{ org.json.JSONObject json = new org.json.JSONObject(); android.telephony.TelephonyManager tm = (android....
  • of_match_device

    千次阅读 2018-07-27 20:15:00
    ">/*如果在平台驱动中定义了id_table项,则通过对比id_table来判断*/ return (51,255,51);">platform_match_id(pdrv->id_table, pdev) != NULL; /* fall-back to driver name match */return (strcmp(pdev-...
  • linux驱动结构pci之pci_device_id

    千次阅读 2011-01-13 14:50:00
    linux驱动结构之pci之pci_device_id原型、解释及调用
  • device_node到并入设备驱动模型 此篇博客有很多参考其他文章的内容,由于参考内容繁杂,不一一标注角标了,在末尾会贴上所有参考博客的link,如有侵权,请联系本人处理,谢谢。 深入,并且广泛 -沉默犀牛...
  • DEVICE_ATTR是一个宏,其定义在include/linux/device.h文件: #define DEVICE_ATTR(_name, _mode, _show, _store) \ struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) __ATTR...
  • 内核添加dts后,devicedevice_driver的match匹配的变动: 先看platform总线: /driver/base/platform.c文件: static int platform_match(struct device *dev, struct device_driver *drv) { struct platform_...
  • device_id

    千次阅读 2013-02-17 23:06:03
    有些apk为了区分唯一设备,需要用到一个device id。 1. 取得设备的MAC address  如果用户没有通过wifi连网路的话,就无法取得。 2. 使用TelephonyManager的getDeviceId() 3. 另外还有一个android系统的唯一区分...
  • Linux 驱动中MODULE_DEVICE_TABLE的理解

    千次阅读 2019-06-03 13:47:11
    在LinuxIIC驱动中看到一段代码: ------------------------------------------------------------------------- ...static struct platform_device_id xx_driver_ids[] = { { .name = "s3c2410-i2c", .drive...
  • MODULE_DEVICE_TABLE的用法

    千次阅读 2016-05-17 19:15:06
    MODULE_DEVICE_TABLE (usb, skel_table) 这个宏有两个参数,第一个参数设备名,第二个参数该设备加入到模块中时对应产生的设备搜索符号,这个宏生成了一个名为__mod_pci_device_table局部变量,这个变量指向第...
  • Linux kernel的思路很简单:驱动开发,就是要开发指定的软件(driver)以驱动指定的设备(device),所以kernel就为设备和驱动它的driver定义了两个数据结构,分别是devicedevice_driver。因此本文将会围绕这两个...
  • 在使用MXNet多个GPU的时候,突然报 了Check failed: exec_ctx.dev_id < device_count_错误,因为电脑上有4个GPU,所以之前用mx.gpu(0)、mx.gpu(1)、mx.gpu(2)、mx.gpu(3)的时候都是正常的,今天突然报错了。 ...
  •  driver->probe(client, i2c_match_id(driver->id_table, client))  i2c总线i2c_bus_type的定义如下: structbus_type i2c_bus_type = {  .name ="i2c",  .match =i2c_device_match,  ....
  • 前言:以前写驱动程序时候,一般把驱动程序分成两部分platform_device跟platform_driver这两部分, platform_device:描述硬件使用的资源; 在前面文章介绍过设备树dts文件最终在linux内核中会转化成platform_...
  •  2、keyboard.c handler->id 中的 flag == INPUT_DEVICE_ID_MATCH_EVBIT ,前面4个if条件同样不成立。然后是 MATCH_BIT 函数。handler->id.evdev = BIT_MASK(EV_KEY),首先是第一条,MATCH_BIT(evbit, EV_MAX);...
  • python生成Androd deviceid

    千次阅读 2019-05-11 14:57:00
    在模拟Android手机登录steam并...所以跟具steamid来生成deviceid from Cryptodome.Hash import HMAC,SHA1 from binascii import hexlify #返回的二进制数据的十六进制表示 def sha1_hash(data): ''' param input ...
  • 抖音通信协议的加密算法是目前最完善的了,一些关键函数都被VM混淆过 ,比如设备注册、视频信息等常用接口,只能通过动态调试跟踪去理解其过程。...https://log.snssdk.com/service/2/device_register/? method...
  • Flutter中使用device_info获取设备信息

    千次阅读 2021-01-10 22:22:29
    配置device_info插件。 dependencies: flutter: sdk: flutter # 设备信息 device_info: ^1.0.0 在pubspec.yaml中配置保存后,在VS Code环境中会自动下载依赖包。 如果无法正常下载,执行flutter pub get。 ...
  • 今天有空分享一下抖音的加密算法,作为拥有庞大用户量的App,其...测试地址:https://www.showdoc.cc/527312186916410?page_id=3113306537235933 6.其他 有快手、小红书、tiktok等其他技术问题,也可随时交流。
  • Device ID的用处和读取方法

    万次阅读 2018-07-13 19:17:53
    DEVICE ID的用途和读取方法 1 用途概述 DEVICE ID可唯一标识一个存储设备,这对于多盘掉电等功能非常重要,因为无论是判定一个盘是否已掉盘还是已上盘都必须知道是哪一个盘。利用这个唯一标识,可以做的事情就很...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 470,294
精华内容 188,117
关键字:

device_id

友情链接: 765567.zip