实习周记1(sdk了解、fiddler抓包、反编译工具)

文章目录

    • 本周知识清单
    • SDK为游戏提供哪些功能
        • 什么是SDK
        • SDK在游戏中提供的功能
    • SDK技术特点
        • 简洁易用
        • 稳定
        • 高效
        • 模块化开发
        • 组件化开发
        • 插件化开发
    • SDK各功能模块如何实现的
        • 制作SDK
        • 打包成jar
        • 打包成aar
        • arr包的使用
      • 关于注册/登录模块的思考
    • Window Fidder网络抓包工具
      • Fiddler抓包步骤
      • Fiddler常用功能
        • 1)抓包开启
        • 2)Statistics 性能分析
        • 3)Inspector查看数据内容
        • 4)AutoResponder拦截指定规则的请求
        • 5)Composer自定义请求
        • 6)Filters请求过滤规则
    • Android反编译
        • 常用的反编译工具
    • 一周小结
    • 参考资料

本周知识清单

  • SDK为游戏提供哪些功能
  • SDK技术特点
  • SDK各功能模块如何实现的
  • Window Fiddler网络抓包工具
  • Android反编译工具apktool、dex2jar、jd-gui、jadx

SDK为游戏提供哪些功能

什么是SDK

SDK(software development kit)
软件开发工具包,只是简单的为某个程序设计语言提供应用程序接口的一些文件,但也可能包括能与某种嵌入式系统通讯的复杂的硬件。一般的工具包括用于调试和其他用途的实用工具。SDK还经常包括示例代码、支持性的技术注解或者其他的为基本参考资料澄清疑点的支持文档。软件工程师通常从目标系统开发者那里获得软件开发包。为了鼓励开发者使用其系统或者语言,许多SDK是免费提供的。SDK经常可以直接从互联网下载。

SDK在游戏中提供的功能

  • 登录功能:登录(用户名,手机号);注册(一键注册,用户名注册,手机号注册);实名认证等。
  • 支付功能:支付宝;微信;银联;平台币;AppStore(iOS平台)。
  • 个人中心:修改密码;绑定手机号;交易记录;平台币充值;退出帐号等。
  • 礼包中心:礼包展示;礼包码领取等。
  • 后台管理系统:参数配置;权限管理;子渠道管理;游戏管理;用户管理;订单管理,补单;数据统计分析,报表;对账单,结算配置等。

SDK技术特点

简洁易用

SDK提供的文档和接口需要使用者容易理解和调用。

稳定

  • 对外提供稳定的API,无非常严重情况不可更改
  • 对外提供稳定的业务
  • SDK运行时的稳定
  • 版本稳定更新,相比面向普通用户的应用,SDK版本的迭代非常缓慢

高效

  • 更少的内存占用:因为SDK服务和宿主程序运行在同一个进程中,SDK需要避免占用进程过多资源
  • 更少的内存抖动:短时间内创建释放大量对象导致的(一般是循环内创建对象)易导致频繁的GC
  • 更少的电量消耗:减少使用耗电模块的时间
  • 更少的流量消耗

模块化开发

根据单一职责将系统拆分为不同的小模块,每个模块相对独立

组件化开发

对逻辑的封装,并具备单个可移植性

插件化开发

将SDK整体划分为两部分:宿主和插件.宿主只向开发者提供必要的服务接口,并提供了自定义插件加载器.而核心的逻辑则是存在于插件中.当需要采集数据的时候,只需要由开发人员开发好数据采集插件并下发到指定设备即可;当需要修复SDK缺陷时,同样也只需要下发新的插件包即可.

通过在SDK使用插件化方案,可以有效的对开发者屏蔽手动更新的过程.宿主相对稳定,一旦确定,一般不会变动,而后续的业务变化则只需要通过更新插件来支撑.

SDK各功能模块如何实现的

通过体验公司发布的游戏可以了解到SDK主要功能模块是登录功能、支付功能、个人中心等,在研究各功能模块怎么实现前应该了解一下如何制作一个SDK

制作SDK

首先要了解到,Android中使用的第三方库有.jar和.aar两种类型,这两种类型返回的区别如下

  • JAR文件(Java Archive File)是Java的一种文档格式,只包含class文件与清单文件,不含资源文件,解压后文件构成
文件夹名称 文件夹内文件功能
assets 原生资源文件
com 存放class文件
META-INF 配置
  • AAR(Android Archive)包是一个Android库项目的二进制归档文件,包含所有资源,class以及res资源文件。解压后文件构成如下
文件夹名称 文件夹内文件功能
aapt Android资源打包工具
aidl Android接口定义
assets 原生资源文件
jni java与natived的桥梁
libs
res 资源文件
AndroidManifest.xml 声明文件
classes java类文件
R 映射资源

打包成jar

1、先使用Android Studio创建项目工程;

2、在项目里面新建一个module;新建一个Class文件,然后添加一个方法(即后面jar包里要调用的方法)

3、在module的gradle里面添加下面的内容(注:文件最外层添加),如下:

task makeJar(type:org.gradle.api.tasks.bundling.Jar) {
//指定生成的jar名
    baseName 'sdk'
//从哪里打包class文件/TestRxJava/testlibrary/
    from('build/intermediates/classes/debug/com/example/mymodule/')
//打包到jar后的目录结构TestRxJava/testlibrary/libs/
    into('TestRxJava/testlibrary/libs/')
//    into('org/cmdmac/cloud/pluginsdk/')
//去掉不需要打包的目录和文件
    exclude('test/', 'BuildConfig.class', 'R.class')
//去掉R开头的文件
    exclude{ it.name.startsWith('R');}
}
makeJar.dependsOn(build)

4、点击Sync Now,等Android Studio运行完成后,点击右上角的Gradle按钮,然后点开我们的module(就是之前建的 sdklibrary),你取的什么名字在这就是什么名字,点开只有在点开other,然后再展开的方法里面,找到我们的makeJar

5、双击makeJar按钮,等到运行结束,就可以看到build/libs/这个文件夹下面生成了classes.jar文件,就算完成了。

6、将jar包导入你想要用的工程里,然后调用相应的方法就好了

打包成aar

1、首先使用Android Studio通过new Module建立一个lib项目

2、编码,配置,混淆

3、点击最右边的gradle,选择对应的module点击build/assembleRelease脚本
系统会在module目录下的build/outputs/aar下面生成一个release.aar
然后你把这个压缩包解压,把里面的classes.jar作为lib导入到一个项目中(Android Studio自带反编译功能)查看下项目代码是否已经混淆,混淆的程度是否满足你的预期(辛辛苦苦写的代码 随随便便给别人拿走可不好),记住你提供的入口API文件千万不要混淆

arr包的使用

1、点击【File>New>New Module】

2、选择 【Import .JAR/.AAR Package,点击【Next】

3、输入.arr文件所在路径并点击【finish】.

4、点击【File>Project Settings 】(或者使用快捷键[Ctrl+Shift+Alt+S](适用于Windows)).

5、在左侧菜单【Modules】栏目下,选择需要依赖.aar包的module(通常为app).

6、点击Dependencies分页

7、点击右上角绿色的【+】

8、选择【Module Dependency】

9、选择你导入的ARR所在的【Module】

关于注册/登录模块的思考

思路从用户第一次打开游戏出发

1、游戏客户端调用SDK提供的注册页面,用户输入注册信息,SDK将用户信息提交给SDK服务器

2、SDK服务器接受SDK传递过来的用户注册信息 ,为新用户注册,返回用户的token令牌

3、SDK接受到token令牌,将token令牌里的内容解析,然后将信息传递给游戏客户端,游戏客户端向游戏服务端传递该信息

4、游戏客户端接收到该信息,向SDK服务端匹配用户信息,匹配成功后生成该用户唯一标识USERID,然后返回给游戏客户端

5、游戏客户端获取USERID,缓存到本地,使用该ID进行其他操作

6、用户第二次打开游戏客户端,访问缓存的USERID,获取到USERID,然后进行其他操作

Window Fidder网络抓包工具

Fiddler是一个使用C#实现的抓包调试工具,它可以对网络中发送和接受的数据包进行截获、重发、编辑、转存等操作,不仅对电脑本身的数据的抓取,还可以对处于同一局域网内的Android/iphone手机的数据进行操作。是一个非常常用的抓包工具。

### Fiddler的抓包原理
客户端和服务器之间建立一个代理服务器,监听本机发出的请求和服务器返回的响应结果。iddler是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888.当Fiddler启动后将自己变成一个代理服务器,这个代理服务器默认监听127.0.0.1:8888.
Fiddler原理

Fiddler抓包步骤

1、Fiddler抓取客户端向服务器发送请求

2、fiddler向服务器发送请求进行握手, 获取到服务器的CA证书, 用根证书公钥进行解密, 验证服务器数据签名, 获取到服务器CA证书公钥

3、fiddler伪造自己的CA证书, 冒充服务器证书传递给客户端浏览器, 客户端浏览器做跟fiddler一样的事。

4、客户端浏览器生成https通信用的对称密钥,用fiddler伪造的证书公钥加密后传递给服务器, 被fiddler截获。

5、fiddler将截获的密文用自己伪造证书的私钥解开, 获得https通信用的对称密钥。

6、fiddler将对称密钥用服务器证书公钥加密传递给服务器, 服务器用私钥解开后建立信任, 握手完成, 用对称密钥加密消息, 开始通信。

7、fiddler接收到服务器发送的密文, 用对称密钥解开, 获得服务器发送的明文。再次加密, 发送给客户端浏览器。

8、客户端向服务器发送消息, 用对称密钥加密, 被fidller截获后, 解密获得明文。

Fiddler常用功能

1)抓包开启

打开Fiddler,自动设置好了http/https的代理,关闭时候,代理还原。开启时确保File –> Capture Traffic开启着。需要Https的话需要开启Tools –> Fiddler Options –> HTTPS 的Decrypt HTTPS Traffic

2)Statistics 性能分析

在使用fiddler代理监听访问时,可以使用statistics分页去统计请求和响应的一些信息。
说明:

1、request count:请求数,表示该session总共发起了多少个请求。

2、Bytes sent:发送请求的字节数(包括请求头和请求体)

3、Bytes received:接收到的字节数(包括响应头和响应体)


4、clientconnected:客户端连接的时间;

5、clientbeginrequest:客户端开始发送请求的时间;

6、gotrequestheaders:获得请求头文件的时间;

7、clientdonerequest:客户端完成请求的时间;

8、determine gateway:确定网关使用的时间;

9、dns lookup:查看dns使用的时间;

10、tcp/ip connect:tcp/ip 连接使用的时间;

11、https handshake:https握手使用的时间;

12、serverconnected:服务连接发生的时间;

13、fiddlerbeginrequest:fiddler开始请求的时间;

14、servergotrequest:服务器得到请求的时间;

15、serverbeginresponse:服务器开始响应的时间;

16、gotresponseheaders:得到响应头文件的时间;

17、serverdoneresponse:服务器完成响应的时间;

18、clientbeginresponse:客户端开始响应的时间;

19、clientdoneresponse:客户端完成响应的时间;

20、overall elapsed:全部花掉的时间(使用客户端完成响应的时间-客户端开始请求的时间)


response bytes(by content-type)–响应的字节(内容格式)


estimated worldwide performance

(世界其他地方的性能–即其他地方访问该网站需要的时间)

可以使用statistics分页,完成简单的性能测试。查看其接口的响应时间。

3)Inspector查看数据内容

该页可以查看当前请求的会话内容,上半部分是请求的内容,下半部分是响应的内容

4)AutoResponder拦截指定规则的请求

AutoResponder允许你拦截指定规则的求情,并返回本地资源或Fiddler资源,从而代替服务器响应。匹配规则有两种匹配方式

  • 字符串匹配(默认):只要包含指定字符串(不区分大小写),全部认为是匹配

  • 正则表达式匹配:以“regex:”开头,使用正则表达式来匹配,这个是区分大小写的

5)Composer自定义请求

该页中可以自定义网络请求

6)Filters请求过滤规则

用于过滤无用的请求信息。有两种方式进行过滤

  • Zone 指定只显示内网(Intranet)或互联网(Internet)的内容:

  • Host 指定显示某个域名下的会话:

Android反编译

无论是开发APP还是SDK,反编译都是非常重要。反编译自己的应用,查看自己代码的混淆。防止其他人利用反编译手段对自己的应用进行破坏。分析其他应用的实现原理。无论是对安全还是自身都有着无可厚非的重要。

常用的反编译工具

目前常用的反编译软件有apktool、dex2jar、jd-gui、jadx。想完全编译一个应用,用一个工具的效果是不足够分析的,因为每个工具都各有所长,综合几个工具一起使用,效果最好。

  • apktool

    资源文件的获取,简单直接的资源文件查看

  • dex2jar

    对修改后缀.apk->.zip的文件解压,获得classes.dex,对classes.dex反编译成jar包

  • jd-gui

    打开dex2jar反编译后jar包,获得java源代码

  • jadx

    这个工具和apktool相似,但拥有gui界面。在apktool中,对应的java类会被反编译成smali文件,jadx使用asm这个工具来生成class文件,实现Java代码的可视化。总体相对apktool来说,性能差一点,不能修改代码和不能进行回编译。

一周小结

这一周的工作主要是针对SDK开发开展一系列知识学习的知识了解,如要SDK的用途,性能特征,如何打包封装等。从开始对SDK开发的懵懵懂懂到现在的略懂还是有很大的帮助。还有针对应用安全的网络抓包,反编译等。这些知识在平时学习中确实是容易忽略的部分。这一周的学习中也了解Android开发代码规范,为打造可维护易扩展的产品做了充足的准备。

参考资料

[1]便捷的将你的项目作为SDK—用aar代替过时的jar

[2]AndroidStudio打包jar包

[3]AndroidStudio封装SDK的那些事

[4]Fiddler 工作原理

[5]fiddler之数据统计(statistics)

[6]抓包工具总结

[7]Android逆向之旅—反编译利器Apktool和Jadx源码分析以及错误纠正

你可能感兴趣的:(实习随笔)