Android 真机抓包

在 Android 开发过程中,可能会遇到和服务端交互有问题的情况,这时候就得拿出证据来和服务端撕逼, 而最有力的证据自然是抓取的网络数据包;又或者是遇到很诡异的网络问题,这时候就可以借助抓包来分析和定位问题。

如果我们和服务端的交互没有通过 VPN, 而且也不是视频流这种网络性能要求苛刻的情况,我们可以通过 tPacketCapture 这种应用来抓包;

其他情况我们可以通过 root 手机,然后安装 tcpdump 来抓包。

下面我们详细介绍下 通过 tcpdump 抓包这种方法:

  • Root 手机

Root 手机的原理是利用系统存在的漏洞来获得 root 权限,XDA Developers 上有不少 root 工具,很多手机都可以用它们 root。

  • 安装 tcpdump

可以到网上搜索为 Android 编译好的 tcpdump 二进制包,例如这里就有一个。

1
2
3
4
5
6
7
8
9
10
11
// Copy tcpdump to device
$ adb -d push /path/to/tcpdump /sdcard/tcpdump

// Device shell
$ adb -d shell

// Switch to root
$ su

// Copy tcpdump to /data/local/
# cat /sdcard/tcpdump /data/local/tcpdump
继续阅读

如何搭建一个带 Dovecot 的 Postfix 邮件服务器

作为一个软件开发人员,我们可能需要一个自己的 VPS ,在上面可以跑我们的 side project,或者做一些实验。VPS 在运行过程中可能会遇到问题,这时我们可能希望在发生问题时能收到通知。使用邮件通知是个不错的方式,这样我们的服务挂掉了能及时处理,所以学会搭建邮件服务器还是很有价值。另外我一直觉得软件技术人员有个自己域名的邮箱很酷,所以我决定自己动手搭建一个邮件服务器。本文记录了如何搭建一个自己域名的邮件服务器,并让这个邮箱可以通过 Mac 和 iPhone 自由收发邮件(测试过 sina 和 QQ)。

邮件系统是怎么工作

开始之前我觉得有必要了解下邮件系统是怎么工作的,鸟哥在他的博文:第二十二章、郵件伺服器: Postfix作了很详细的介绍,建议熟读之后再开始。

准备材料

  • VPS
  • 域名

我服务器跑的是 CentOS 8。

继续阅读

Photos 框架的基本使用

从 iOS 9 开始 Apple 把 Asset Library 标记为废弃状态,并建议开发者使用 Photos 框架。

The Assets Library framework is deprecated as of iOS 9.0. Instead, use the Photos framework instead, which in iOS 8.0 and later provides more features and better performance for working with a user’s photo library.

不幸的是 Apple 并没有发布相关的使用指导文档,只有一个相关 Demo。使用的时候固然可以回头参考这个 Demo,但这样的效率不是很高,很多概念也容易忘记,所以这里做个简单的总结。

Photos 中有不少类,其中几个犹为关键。PHPhotoLibary 是我们操作 Photo Library 里面资源的入口对象,所有的操作都通过它完成。PHCollectionList 表示相册中的专题列表;PHAssetCollection 表示专题;PHAsset 表示资源,如 images, videos, and Live Photos.

我们基本的需求就是 CRUD, 这些操作是需要用户授权的,记得先获取权限再操作, 下面我们展示相关的代码片段。

Create

  1. 创建一个资源
1
2
3
4
5
PHPhotoLibrary.shared().performChanges({
            PHAssetChangeRequest.creationRequestForAsset(from: image)
        }, completionHandler: {success, error in
            if !success { print("error creating asset: \(error)") }
        })
  1. 创建一个资源到指定的专题
1
2
3
4
5
6
7
8
9
PHPhotoLibrary.shared().performChanges({
            let creationRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
            if let assetCollection = self.assetCollection {
            let addAssetRequest = PHAssetCollectionChangeRequest(for: assetCollection)
            addAssetRequest?.addAssets([creationRequest.placeholderForCreatedAsset!] as NSArray)
            }
        }, completionHandler: {success, error in
            if !success { print("error creating asset: \(error)") }
        })
继续阅读