TikTok逆向,全球的小姐姐们,我来啦!

2023-11-16

作者:AYJk

链接:https://juejin.im/post/5c19a38ae51d453e0a209256

开源地址

首先抛出GitHub地址吧~多多支持指点,谢谢。

AYTikTokPod:https://github.com/AYJk/AYTikTokPod

简述

iOS逆向工程指的是软件层面上进行逆向分析的过程。


在一般的软件开发流程中,都是过程导向结果。在逆向中,你首先拿到的是结果,然后是去分析实现这个结果的过程。理清过程之后,才开始进行逆向的代码编写,在整个流程中,分析过程的占比是90%,代码书写的过程只占10%。所以本篇更多的讲的是一个思路,代码其实很日常

前期准备

  • 一台Mac

  • 一台iPhone

  • frida-ios-dump

  • Hopper Disassembler

  • class-dump

  • MonkeyDev

  • Reveal


frida-ios-dump


用于脱壳,脱壳是逆向的第一步。直接AppStore上下载的应用都有带壳,导致我们无法对他进行任何操作。脱壳的ipa文件,也可以直接去一些越狱商店下载,但是可能版本上比较旧。


如果有一台已越狱的机器,按照frida-ios-dump的wiki来操作很简单。


Hopper Disassembler


Hopper Disassembler是Mac上的一款二进制反汇编器,基本上满足了工作上的反汇编的需要,包括伪代码以及控制流图(Control Flow Graph),支持ARM指令集并针对Objective-C的做了优化。


class-dump


class-dump是一款可以导出头文件的命令行工具,改程序用于检查Objective-C运行时信息存储在Mach-O文件,它生成类的声明,类别和协议。


MonkeyDev


MonkeyDev的前身是iOSOpenDev,在iOSOpenDev的基础上增加CaptainHook Tweak、Logos Tweak、Command-line Tool。


MonkeyDev为我们做的事情:


1、创建dylib,通过hook修改类的属性或方法

2、将dylib注入到App中

3、重签名ipa文件

静态分析

前期准备


拿到TikTok的脱壳ipa文件


由于自己的6s痛失越狱环境,于是脱壳这一步,是拜托了我的好哥们完成的。


只要有越狱手机,砸壳并不复杂,按照网上的教程步骤来就行。


640?wx_fmt=jpeg


class-dump导出头文件


通过命令

class-dump -H XXX.app -o /DumpHeaderClass


  • -H后跟的是脱壳后的app文件路径

  • -o是头文件输出的文件夹路径


如图所示为class-dump之后的项目中所有头文件,单从这里,我们就能看出,TikTok项目中,使用的几个第三方库:AFNetWorking、YYKit、FaceBook的SDK。


640?wx_fmt=jpeg


tips: 快速搜索对应的头文件或方法,可以新建个工程,将头文件文件夹拖入项目中。有什么工具能比Xcode检索更方便检索代码呢?


Hopper静态分析


直接将脱壳后的二进制可执行文件拖入Hopper,等待一段时间后,Hopper会完成反编译。


640?wx_fmt=jpeg


左边的展示的是对应的类和方法列表,通过搜索框可以快速定位到方法。


红色框框起来的是模式切换:分别是汇编模式、控制流图模式、伪代码模式、十六进制模式

通常我们用的最多的就是控制流图和伪代码。


Reveal查看界面


MonkeyDev会为我们自动注入RevealService.framework。RevealService.framework需要和对应版本Reveal使用。否则请更新替换注入的RevealService.framework。


640?wx_fmt=jpeg


Reveal能让我们快速定位到我们需要的控制器或视图。


如图,首页的ViewController就是AWEFeedTableViewController。

问题&处理问题

Question1


Q1:发现从其他区的AppStore下载的TikTok打开后什么都没有?

T1:初步怀疑是网络问题。

A1:全局代理之后打开还是一片漆黑,基本排除是网络的问题导致的。


Question2


Q2:如果不是网络问题,那问题会不会出现在请求参数上?

T2:使用Charles抓包看看

A2:刷新feed,拿到url


/aweme/v1/feed/?version_code=4.3.0&language=zh&pass-region=1&app_name=trill&vid=B196D171-B020-453E-A19C-9AAD845151BE&app_version=4.3.0&carrier_region=CN&is_my_cn=1&channel=App%20Store&mcc_mnc=46001&device_id=6631689375623284225&tz_offset=28800&account_region=&sys_region=CN&aid=1180&screen_width=750&openudid=63ceee2a26c0fd4501ebcf1f47a2311c5551f6e0&os_api=18&ac=WIFI&os_version=12.0&app_language=en&tz_name=Asia/Shanghai&device_platform=iphone&build_number=43004&device_type=iPhone8,1&iid=6635504889546049282&idfa=BFBB2BCA-9743-451B-95CC-F01292FC02F6&ad_user_agent=Mozilla%2F5.0%20%28iPhone%3B%20CPU%20iPhone%20OS%2012_0%20like%20Mac%20OS%20X%29%20AppleWebKit%2F605.1.15%20%28KHTML%2C%20like%20Gecko%29%20Mobile%2F16A366&count=6&feed_style=0&filter_warn=0&max_cursor=0&min_cursor=0&pull_type=1&type=0&volume=0.25&mas=01050af0364af36a45501b82b389f379ef3f8bda89739cc55924e8&as=a1157001fc8b2c2ce65057&ts=1544948924


其中有几个字段引起了怀疑:

640?wx_fmt=png


分析:


1、is_my_cn字面意思,是否是中国,很可能通过标记来判断是否是国内用户。

2、language语言类型,通过这个来判断可能性比较低,误伤几率很高。外区也可以设置语言中文,但你不可能去影响他使用吧。这么做,是不合理的。

3、account_region、carrier_region、sys_region,账号、运营商和系统的地区,可能通过所属地区来进行封锁。

4、mcc_mnc,mcc指的是移动国家码,mnc指的是移动网络码。

5、tz_name时区。


验证:

使用Charles的Rewrite或者Breakpoints来改变URL中传递的params。


640?wx_fmt=png


结果:

通过各种组合实验,发现真正产生作用的

640?wx_fmt=png


这里得到了第一个结论:说明TikTok服务器,是通过运营商来封锁用户的。既然是运营商,那就把mcc_mnc这个字段也一起处理。

640?wx_fmt=png


Question3


Q3:怎么处理carrier_region和mcc_mnc?

T3:上面是通过Charles完成了,可以正常观看TikTok的视频,勉强算是完成了部分修改,但局限性很大。


比如:

1、无法评论、关注等操作,因为只Rewrite了部分接口,其他接口没有Rewrite。

2、离开特定的WiFi就无法观看,无法通过蜂窝网观看视频。(PS:可以通过Thor这个软件的拦截器实现,和Charles的原理一致)

3、如果后续更新添加了接口签名校验,那这种方法就会失效。


A3:方案一:通过Hook第三方网络库AFNetWorking或内部封装的NetService类来修改carrier_region字段。这个方案基本可行,通过HookAFHTTPRequestSerializer类的requestWithMethod: URLString: parameters: error:方法。获取parameters,然后修改carrier_region的值。


优点:

方案简单,不需要过多的内部实现分析。

能完成所有接口的Hook。


缺点:

遇到接口签名校验将失效。

所有网络接口都被Hook,如果Hook函数里存在复杂耗时的操作,会严重影响性能。


方案二:


iOS系统的CoreTelephony.framework的CTCarrier类提供了carrier_region、mnc和mcc的获取。通过Hook他们来实现土突破地区限制。

/*
 * isoCountryCode
 *
 * Discussion:
 *   Returns an NSString object that contains country code for
 *   the subscriber's cellular service provider, represented as an ISO 3166-1
 *   country code string
 */


@property (nonatomicreadonlyretainnullableNSString* isoCountryCode __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);

/*
 * mobileCountryCode
 *
 * Discussion:
 *   An NSString containing the mobile country code for the subscriber's 
 *   cellular service provider, in its numeric representation
 */

@property (nonatomicreadonlyretainnullableNSString *mobileCountryCode __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);

/*
 * mobileNetworkCode
 *
 * Discussion:
 *   An NSString containing the  mobile network code for the subscriber's 
 *   cellular service provider, in its numeric representation
 */

@property (nonatomicreadonlyretainnullableNSString *mobileNetworkCode __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);


代码编写:

// MARK: - Hook CTCarrier
CHDeclareClass(CTCarrier)

CHMethod0(NSString *, CTCarrier, isoCountryCode) {
    NSDictionary *areaDic = [UserDefaults valueForKey:HookArea];
    NSString *code = [areaDic objectForKey:@"code"];
    return code;
}
CHMethod0(NSString *, CTCarrier, mobileCountryCode) {
    NSDictionary *areaDic = [UserDefaults valueForKey:HookArea];
    NSString *mcc = [areaDic objectForKey:@"mcc"];
    return mcc;
}
CHMethod0(NSString *, CTCarrier, mobileNetworkCode) {
    NSDictionary *areaDic = [UserDefaults valueForKey:HookArea];
    NSString *mnc = [areaDic objectForKey:@"mnc"];
    return mnc;
}

CHConstructor {
    CHLoadLateClass(CTCarrier);
    CHHook0(CTCarrier, isoCountryCode);
    CHHook0(CTCarrier, mobileCountryCode);
    CHHook0(CTCarrier, mobileNetworkCode);
}


CaptainHook为我们提供了完善的Hook宏。


  • CHDeclareClass作用是声明需要Hook的类

  • CHMethod作用是对应的方法Hook的实现

  • CHConstructor作用是用于加载Hook的方法和所在的类

  • CHLoadLateClass加载Hook类

  • CHHook注册Hook方法


这个framework底层通过runtime接口实现对应功能,比如

class_getInstanceMethod(Class _Nullable cls, SEL _Nonnull name)

method_setImplementation(Method _Nonnull m, IMP _Nonnull imp)

method_getImplementation(Method _Nonnull m)

method_getTypeEncoding(Method _Nonnull m) 

class_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, 
                const char * _Nullable types)


结果:

640?wx_fmt=jpeg


到这里区域限制的突破已经完成了。


Question4


Q4:使用过程中发现其他地区TikTok都能下载视频,日区TikTok不能

T4:使用的是同一部手机,只Hook了carrier_region和mcc_mnc,出现了下载限制问题,那肯定是地区版权策略导致的(11区对版权的重视,佩服了)。


A4:点开分享按钮

640?wx_fmt=jpeg


发现判断是否有下载权限是发生在按钮点击之前的。考虑是在请求返回的JSON数据中存储的flag,然后把这个flag传给AWEAwemeShareViewController。


使用Reveal对界面分析,发现TableView的Cell类名是AWEFeedViewCell,然后查找class-dump出的AWEFeedViewCell.h,有一个可疑的方法是- (void)configWithModel:(id)arg1;


使用MDMethodTrace进行方法跟踪,确认了方法被调用,同时arg1的类型是AWEAwemeModel,这个Model里又发现了可疑的属性@property(nonatomic, assign) BOOL preventDownload;,意思是禁止下载。


代码编写:

// MARK: - AWEAwemeModel
CHDeclareClass(AWEAwemeModel)

CHMethod1(void, AWEAwemeModel, setPreventDownload, BOOL, arg1) {
    arg1 = ![UserDefaults boolForKey:HookDownLoad];
    CHSuper1(AWEAwemeModel, setPreventDownload, arg1);
}

CHConstructor {
    CHLoadLateClass(AWEAwemeModel);
    CHHook1(AWEAwemeModel, setPreventDownload);
}


效果:

640?wx_fmt=jpeg


下载按钮没被禁用了!怀着激动的心情点下去!

640?wx_fmt=jpeg


WTF !!!


640?wx_fmt=jpeg


继续:


对比日区和其他区的AWEAwemeModel。发现AWEAwemeModel的某一个数据结构是这个样的

@interface AWEURLModel
@property(retainnonatomicNSArray *originURLList;
@end

@interface AWEVideoModel
@property(readonlynonatomic) AWEURLModel *playURL;
@property(readonlynonatomic) AWEURLModel *downloadURL;
@end

@interface AWEAwemeModel
@property(nonatomicassignBOOL preventDownload;
@property(retainnonatomic) AWEVideoModel *video;
@end


一顿分析得到日区的downloadURL只有两个接口,不包含视频地址。其他能下载的地区,downloadURL有四个接口,前两个为视频地址。进一步发现playURL和downloadURL的参数一直。直接尝试将playURL赋值给downloadURL。


代码编写:

// MARK: - AWEAwemeModel
CHDeclareClass(AWEAwemeModel)

CHMethod1(void, AWEAwemeModel, setPreventDownload, BOOL, arg1) {
    arg1 = ![UserDefaults boolForKey:HookDownLoad];
    CHSuper1(AWEAwemeModel, setPreventDownload, arg1);
}

CHMethod1(void, AWEAwemeModel, setVideo, AWEVideoModel *, arg1) {
    BOOL isHookDownLoad = [UserDefaults boolForKey:HookDownLoad];
    if (isHookDownLoad) {
        arg1.downloadURL.originURLList = arg1.playURL.originURLList;
    }
    CHSuper1(AWEAwemeModel, setVideo, arg1);
}

CHConstructor {
    CHLoadLateClass(AWEAwemeModel);
    CHHook1(AWEAwemeModel, setPreventDownload);
    CHHook1(AWEAwemeModel, setVideo);
}


再次运行,成功下载日区TikTok视频。


Question5


Q5:视频down下来发现有水印?

T5:对比原地址,发现原视频是没有水印的,那么水印就是在下载完成后添加了的。


640?wx_fmt=jpeg


目录搜索watermark,验证了猜想。

在头文件中,发现了带watermark名称的类。


640?wx_fmt=jpeg


最终发现AWEDynamicWaterMarkExporter这个类的+ (id)watermarkLogoImageArray;返回了对应的水印图片。


代码编写

#pragma mark WaterMark
CHDeclareClass(AWEDynamicWaterMarkExporter)
CHOptimizedClassMethod0(selfNSArray *, AWEDynamicWaterMarkExporter, watermarkLogoImageArray) {
    BOOL isHookWaterMark = [UserDefaults boolForKey:HookWaterMark];
    if (isHookWaterMark) {
        return @[];
    }
    return CHSuper0(AWEDynamicWaterMarkExporter, watermarkLogoImageArray);
}
CHConstructor {
    CHLoadLateClass(AWEDynamicWaterMarkExporter);
    CHClassHook0(AWEDynamicWaterMarkExporter, watermarkLogoImageArray);
}

总结

整个逆向过程中,完整的Hook代码并不复杂,开发工作也是站在巨人的肩膀上完成的,草草几行就能完成功能逆向。


他是令人振奋,因为最终证明了你的逆向想法是对的,通往成功的路不只有一条,切入点可能不一样,思路可能不一样,方法可能不一样,但是都能成功。


公众号内回复“1”带你进粉丝群640?wx_fmt=gif&wx_lazy=1&wxfrom=5&&&

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TikTok逆向,全球的小姐姐们,我来啦! 的相关文章

  • React & JSX 入门

    React JSX 入门 div div
  • 1600*D. Road Map(数学

    解析 记录每个点的父节点和子节点 从新的根节点开始遍历 遍历所有的非父结点即可 include
  • (一)大彩屏幕 进行串口通信

    一 简介 大彩屏幕通过串口收发信息 主要用来显示 装好软件 官网有或找技术人员要 VisualTFT 虚拟串口驱动 USB驱动 1 大彩屏幕来自大彩科技 使用该屏幕时 需要注意获取最新的软件版本 最新的Demo 这一点 你可以直接联系客服或
  • Vue刻度尺组件

    1 安装刻度尺组件 npm install cs ruler 2 在main js中全局引入组件 import CsRuler from cs ruler 刻度尺组件 Vue use CsRuler 3 组件使用
  • C#序列化和反序列化(json)

    一 什么是Json json是存储和交换文本信息的方法 类似xml 但是json比xml更小 更快 j更易于解析 并且json采用完全独立于语言的文本格式 即不依赖于各种编程语言 这些特性使json成为理想的数据交换语言 json使用Jav
  • UE4 命令工具打包

    用cmd进入UE4引擎的目录 Engine Build BatchFiles找到RunUAT bat cmd中输入以下命令 RunUAT BuildCookRun project F VidaUpdater VidaUpdater upro
  • QT 语言的学习 day10 数据库的学习 增删改 (QT 自带的数据库 QSqlDatabase数据库)

    1 基本知识的学习 Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操作 这里我们所说的 平台独立 既包括操作系统平台 有包括各个数据库平台 另外 我们强调了 基于 SQL 因为 NoSQL 数据库至今没有一个通用查询方
  • 1分钟让您的.NET WinForm应用程序变成现代互联网浏览器

    目录 前言 一 WebRuntime是什么 二 使用步骤 三 具体案例 总结 前言 让自己的应用拥有对接互联网的能力 应该是绝大多数开发者的愿望 这里给大家推荐一个开源项目 WebRuntime 通过这个项目 开发者可以在完全保留自己应用架
  • ISO/IEC技术标准-RFID

    ISO IEC技术标准规定了RFID有关技术特征 技术参数和技术规范 主要包括ISO IEC 18000 空中接口参数 ISO IEC 10536 密耦合 非接触集成电路卡 ISO IEC 15693 疏耦合 非接触集成电路卡 和ISO I
  • html框架-----标签(上)

    目录 前言 标签简介 1 HTML的基本结构 1 html标签 2 head标签 3 body标签 2 标题标签 3 段落标签 4 文本格式化标签 前言 现在学前端工程师的都很难找工作 懂的都懂了 因为学前端一般去做那些页面可视化处理 而学
  • 微信红包实现原理

    微信红包实现原理 以下内容来源于QCon某高可用架构群聊天记录整理 背景 有某个朋友咨询微信红包的架构 在官方或非官方同学的解释和讨论中得出以下讨论内容 在此期间有多个同学发红包做现网算法测试 抢红包过程 当有人在群里发了一个N人的红包 总
  • js 正则替换隐藏部分身份证或手机号以及隐藏部分名字

    1 手机号隐藏中间4位 var phone 18200002111 phone replace d 3 d d 4 1 2 输出结果 2 身份证隐藏中间数字 2 1兼容尾数后面携带字母的 隐藏身份证中间8位数 param data 传入数据
  • opengles3.0_win10

    前部分的配置主要参考 https blog csdn net mmy545237835 article details 80762150 但是还会出现一系列问题 需要把下载的模拟器文件夹中的 一个文件夹和两个动态链接库放到当前的工程目录下
  • 自动化输出带数据的文件名称

    背景说明 为实现数据统计 输出文件名称中带变化的数据名称 可以进行向量变化的输出 程序说明如下 library readxl library sqldf library openxlsx library dplyr length iris
  • Kubernetes入门Day2 ~ 一步一步手工构建metrics-server 0.5.0 镜像

    i m not only a DBA k8 gcr io异步同步工具配置 一步一步编辑metrics server 0 5 0镜像 1 配置好jq 2 clone 官方metrics server 3 编辑metrics server 0
  • 软件工程和计算机科学与技术的区别在哪?

    计科专业毕业已经从事软件开发多年 说到当初选择这个专业还是遵从父母的意愿 老人家们觉得计算机是个未来的趋势 如果做个计算机的老师岂不是很不错 于是在报考志愿的时候就给选择上了 主要自身也对计算机感兴趣 所以也没有过多的干预 至于学到之后当不
  • 网络技术期末复习~重点考题

    解题思路 标准答案 11 如图所示 网络145 13 0 0 16划分为四个子网N1 N2 N3 N4 它们与路由器R相连的接口分别是m0 m1 m2 m3 R的第五个接口m4连接到互联网路由器 接口地址为1 1 1 1 1 请给出路由器R
  • uniapp 基础知识学习

    uniapp 基础知识学习 uniapp 基础知识学习 uniapp 介绍 https uniapp dcloud io README 有哪些uni app的作品 uni app的社区规模 为什么要去学习uni app 快速体验 功能框架
  • js显示服务器路径下的图片,JS处理文件流(如果是图片,显示在当前页面)

    用ajax请求图片资源 服务器以文件流的形式返回 1 返回类型需要设置为 blob 所以需要用原生ajax 不能使用jq 原因 jquery将返回的数据转换为了string 不支持blob类型 当然 你也可以引入组件拓展jq的能力 我知道的
  • leetcode----121.买卖股票的最佳时机

    给定一个数组 它的第 i 个元素是一支给定股票第 i 天的价格 如果你最多只允许完成一笔交易 即买入和卖出一支股票一次 设计一个算法来计算你所能获取的最大利润 注意 你不能在买入股票前卖出股票 示例 1 输入 7 1 5 3 6 4 输出

随机推荐

  • 电脑快捷键大全表格_【Mac新手必看基础篇】Mac电脑快捷键大全

    Mac电脑以卓越的性能和出色的外表获得了越来越多的用户 你是Mac新手吗 你是否能熟练使用Mac电脑呢 刚接触Mac电脑的小伙伴千万不要错过这篇文章 小编给大家准备了Mac使用必看基础篇 Mac快捷键大全 对于新手用户很有帮助哦 一 开机相
  • Git如何合并分支到主干及合并主干到分支

    Git如何合并分支到主干及合并主干到分支 文章目录 Git如何合并分支到主干及合并主干到分支 零 预备知识 一 创建分支 二 合并分支到主干 三 合并主干到分支 参考资料 精益开发实践用看板管理大型项目 Git如何合并分支到主干及合并主干到
  • 合并两个有序数组(超详细)

    合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums1 中 使合并后的数组同样按 非递减顺序
  • 一文读懂毫米波/激光/超声波雷达的区别(转)

    不知何时 自动驾驶技术从电影中跳出来 直接被拉到人们视野中 不过 去年特斯拉却因为几起自动驾驶事故 官网不得不把自动驾驶字眼改为辅助驾驶 本期 汽车总动员 讨论的不是自动驾驶 而是被称为自动驾驶汽车 眼睛 的雷达 目前主流的 眼睛 有四类
  • 在ubuntu下编译opencv程序后,执行报下面到错误: error while loading shared libraries: libopencv_core.so.2.4: cannot op

    转自 https www douban com note 327349156 在ubuntu下编译opencv程序后 执行报下面到错误 error while loading shared libraries libopencv core
  • 使用Python 进行分析

    在当今竞争激烈的互联网时代 对于网站的SEO优化至关重要 本文将介绍一种强大的秘密武器 使用Python 进行竞争对手网站分析 通过这种技术 您可以深入了解竞争对手的网站结构 关键词排名和优化策略 为您的SEO优化工作提供有力支持 1 为什
  • 神经网络随手记-1

    目录 sigmod函数主要缺点 Relu 线性整流函数 Leaky ReLU 随机梯度下降法 sigmod函数主要缺点 在输入值变大时 梯度会变得非常小甚至消失 这意味着 在训练神经网络时 如果发生这种饱和 我们将无法根据梯度来更新权重 函
  • 传感器尺寸与像素密度对相片分辨率的影响

    在人们日常生活摄影中 相机的传感器尺寸以及像素素往往决定了一幅图像的清晰度 当然 不同的镜头 不同的CMOS质量等等都会对相片的质量产生影响 今天就简单讨论讨论传感器尺寸和像素密度对图像分辨率的影响 当传感器尺寸一定时 像素越多 也就是像素
  • Python-集合

    探索Python集合的奇妙世界 在Python编程中 集合 Set 是一种强大且有用的数据结构 它用于存储多个不重复的元素 集合的独特之处在于它的元素是无序的 并且每个元素都是唯一的 这使得集合在处理去重和进行快速成员检查时非常有效 创建集
  • 手把手带你打造自己的UI样式库(第五章)之常用页面切图的设计与开发

    常用页面切图的设计与开发 在一些大的前端团队中 前端工程师这个职位会出现一个分支 叫做重构工程师 重构工程师主要负责 HTML 和 CSS 的制作 也就是把设计稿转换成 HTML 和 CSS 代码 重构工作完成以后 把制作好的 HTML 和
  • 【第十四届蓝桥杯单片机组底层驱动测试】

    第十四届蓝桥杯单片机组底层驱动测试 下面分享的是第十四届蓝桥杯单片机组底层驱动代码的测试和相关说明 今年官方提供的资料包中底层驱动代码和以往有了变化 主要代码还是提供给了我们 只是此次没有了相关头文件iic h ds1302 onewire
  • win10剪贴板快捷键win+v

    win v可以出现最近10多次粘贴的数据
  • Ioc容器refresh总结(3)--- Spring源码从入门到精通(三十三)

    上篇文章介绍了 调用bean工厂的后置处理器 主要分为两步 他是在beanFactory预准备标准初始化之后执行invokBeanFactoryPostProcessor 先调用beanDefinitionRegistryPostProce
  • [paper] MTCNN

    MTCNN 论文全称 Joint Face Detection and Alignment using Multi task Cascaded Convolutional Networks 论文下载链接 https arxiv org ab
  • vue.js基础学习(模板语法)

    基础入门 vue js模板语法 1 模板语法 methods 给vue定义方法 this 指向当前vue实例 v html 让内容以HTML形式编译 v bind 绑定动态数据 v noce 当数据发生改变时 插值处内容不发生改变 动态属性
  • maven相关

    1 webxml attribute is required or pre existing WEB INF web xml if executing in update 原因 web项目下缺少 WEB INF web xml 在servl
  • 【AWS】API Gateway创建Rest API--从S3下载文件

    一 背景 在不给AK SK的前提下 用户查看s3上文件 从s3下载文件 二 创建API 1 打开API Gateway 点击创建API 选择REST API REST API和HTTP API区别 来自AWS官网 REST API 和 HT
  • 算法——查找

    文章目录 一 基本概念和评价 1 相关概念 2 查找表 2 1 常见操作 2 2 分类 3 查找算法的评价指标 二 线性结构查找 1 顺序查找算法 1 1 定义 1 2 算法思想 1 3 特点 1 4 分类 1 无哨兵的无序线性表的顺序查找
  • Unity 安卓报错 failed to extract resources needed by IL2cpp

    Unity打出来的包在自己的PC放置好文件后 运行能够正常运行 但是git提交之后 别的机器拉代码下来报错 failed to extract resources needed by IL2cpp 这里推测原因是 安卓包打出来的Asset
  • TikTok逆向,全球的小姐姐们,我来啦!

    作者 AYJk 链接 https juejin im post 5c19a38ae51d453e0a209256 开源地址 首先抛出GitHub地址吧 多多支持指点 谢谢 AYTikTokPod https github com AYJk