tcpdump

前言

正文

截获分析网络数据包

  • rvictl -s udid,创建虚拟网卡
devzkndeMacBook-Pro:com.wl..git devzkn$ rvictl -s bea23bf46e21509946b4e31

Starting device bea23bf46e21509beca7f9dd4e31 [SUCCEEDED] with interface rvi0
  • 启动tcpdump监控流量
devzkndeMacBook-Pro:com.wl..git devzkn$ sudo tcpdump -i rvi0 -AAl
Password:
tcpdump: WARNING: rvi0: That device doesn't support promiscuous mode
(BIOCPROMISC: Operation not supported on socket)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on rvi0, link-type PKTAP (Apple DLT_PKTAP), capture size 262144 bytes

分析tcpdump输出

  • 基本的tcp包结构
13:41:20.634990 IP 192.168.2.154.49552 > 198.7.58.74.http: Flags [S], seq 2038222836, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 361925289 ecr 0,sackOK,eol], length 0
............en0...................... ..............~...http...........................................................Zn.	....................................`w.$.t..y..E..@lV@.@.
.......:J...Py|.........................
............

13:50:05.758568 IP 192.168.2.154.49548 > 17.252.156.14.5223: Flags [F.], seq 1847, ack 3641, win 4096, options [nop,nop,TS val 362449061 ecr 3067529640], length 0
............en0...................... ..............]................................................................	.Z(......................................`w.$.t..y..E..4..@.@..............g.
...t.}....?......
........

13:50:22.997209 ARP, Request who-has 192.168.2.154 (24:a0:74:10:9c:79 (oui Unknown)) tell 192.168.2.100, length 46
............en0...................... ...............................................................................	.ZY7..................................$.t..y4...............4........d$.t..y......................
13:50:22.997221 IP 199.239.182.243.http > 192.168.2.154.49568: Flags [.], ack 184, win 235, options [nop,nop,TS val 452319868 ecr 362465594,nop,nop,sack 1 {1:184}], length 0
............en0...................... ..................apsd.........................................................	.Ze7..................................$.t..y...`w...E..@.\@.3..7.........P..#=...|......f......
...|...:...
.|.2.|..
13:50:22.997250 ARP, Reply 192.168.2.154 is-at 24:a0:74:10:9c:79 (oui Unknown), length 28
............en0...................... ...............................................................................	.Z.7..................................4.....$.t..y..........$.t..y....4........d
13:50:23.032243 30:b4:9e:5e:f8:f5 (oui Unknown) > Broadcast, RRCP-0x23 query
............en0...................... ...............................................................................	.Z.}........................................0..^....#... .I7.3....................................
13:50:23.234212 IP 199.239.182.243.http > 192.168.2.154.49568: Flags [.], seq 5761:7201, ack 184, win 235, options [nop,nop,TS val 452319890 ecr 362465975], length 1440: HTTP
............en0...................... ..................apsd.........................................................	.Z....................................$.t..y...`w...E....]@.3............P..#=.X.|......j......
........ZXk+QVBOU0FXRFzMDwvaW50Z
13:50:23.234220 IP 199.239.182.243.http > 192.168.2.154.49568: Flags [P.], seq 7201:8187, ack 184, win 235, options [nop,nop,TS val 452319890 ecr 362465975], length 986: HTTP
............en0...................... ..................apsd.........................................................	.Z....................................$.t..y...`w...E....^@.3..f.........P..#=...|.............
........QVBOU01pbmN0Pgo=</data>

	</dict>
</plist>
13:50:23.234225 IP 17.179.252.32.https > 192.168.2.154.49569: Flags [S.], seq 2904281612, ack 1674281315, win 65535, options [mss 1460,nop,nop,TS val 1613497001 ecr 362466182,nop,wscale 11], length 0
............en0...................... ..................akd..........................................................	.Z....................................$.t..y...`w...E..<..@.-.|.... ............c..c.....-.........
`,..........


<!-- 13:50:23.234212 该包接收到的时间 -->

<!-- 199.239.182.243.http  发送方的ip地址及端口号(243)-->

<!-- 192.168.2.154.49568  是我iphone的ip地址及端口号-->

<!-- Flags [P.] 是tcp包header部分的第14个字节的P位。这个字节所包含的几个flag很重要。这里P位表示接受方需要马上将包push到应用层。 -->

<!-- seq 1:54 tcp包的seq号,1是起始值,54结束值。tcp之所以被认为是流,是因为tcp包所携带的每一个字节都有标号(seq号)。1:54表明总共有54个字节被接受,其中一个字节是三次握手阶段所使用,所以一共发送的长度是53字节。 -->
<!-- seq 5761:7201 -->

<!-- ack 101 tcp包的ack号,ack 101表明seq号为100的字节已被确认收到,下一个期望接收的seq号从101开始。 -->
<!-- ack 184 -->

<!-- options [nop,nop,…] options[…]表示的是该tcp包的options区域,nop是no opertion的缩写,没什么实际用途,主要是用做padding,因为options区域按协议规定必须是4字节的倍数。 -->

<!-- options[… TS val 2381386761] ts val这个值是tcp包的时间戳,不过这个时间戳和设备的系统时间没啥关系,刚开始是随机值,后面随着系统时钟自增长。这个时间戳主要用处是seq序列号越界从0重新开始后,可以确认包的顺序。 -->


<!-- win 65535 win表示的是tcp包发送方,作为接受方还可以接受的字节数。这里win 65535 表明ip为192.168.2.154的主机还可以接受65535个字节。 -->

<!-- options[… ecr 427050796] ts ecr这个值主要用来计算RTT。比如A发送一个tcp包给B,A会在包里带上TS val,B收到之后在ack包里再把这个值原样返回,A收到B的ack包之后再根据本地时钟就可以计算出RTT了。这个值只在ack包里有效,非ack包ecr的值就为0. -->


<!-- length 53 这个length是应用层传过来的数据大小,不包括tcp的header。这个值和我们上面分析的seq 1:54是一致的。 -->
<!-- length 1440  -->

<!-- 2、 http请求的例子-->

14:01:50.621466 IP 192.168.2.154.54015 > public1..com.domain: 33369+ A? open-api..com. (37)
............en0...................... ..................mDNSResponder...................SpringBoard.................N..Z.{	....................................`w.$.t..y..E..A.Y.....+....rrrr...5.-.J.Y...........open-api..com.....
14:01:50.682419 IP com.wl..com.domain > 192.168.2.154.54015: 33369 1/0/0 A 120.27.83.144 (53)
............en0...................... ..................mDNSResponder...................SpringBoard.................N..Z.i
.................................$.t..y...`w...E..Q......yurrrr.....5...=...Y...........open-api..com..............X..x.S.
14:01:50.684827 IP 192.168.2.154.49589 > 120.27.83.144.http: Flags [S], seq 4174354258, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 363153415 ecr 0,sackOK,eol], length 0
............en0...................... ..................SpringBoard.................................................N..Z.s
....................................`w.$.t..y..E..@.u@.@."U....x.S....P...R.........:.............
..H.........
14:01:50.729213 IP 120.27.83.144.http > 192.168.2.154.49589: Flags [S.], seq 1197848712, ack 4174354259, win 64240, options [mss 1444,nop,nop,sackOK,nop,wscale 11], length 0
............en0...................... ..................SpringBoard.................................................N..Z} ..................................$.t..y...`w...E..4..@.2...x.S......P..Ge.....S....................
14:01:50.729411 IP 192.168.2.154.49589 > 120.27.83.144.http: Flags [.], ack 1, win 8192, length 0
............en0...................... ..................SpringBoard.................................................N..ZC!.....................................`w.$.t..y..E..(..@.@.......x.S....P...SGe..P. .....
14:01:50.733450 IP 192.168.2.154.49589 > 120.27.83.144.http: Flags [P.], seq 1:518, ack 1, win 8192, length 517: HTTP: GET ////?Brand=iPhone&Height=568&NetworkType=Wifi&OS=iOS&OSVersion=10.2&Platform=2&VersionCode=1&VersionName=1.1.0&Width=320&channel=default&deviceid=&time=1521093710&v=1521093710.602857 HTTP/1.1
............en0...................... ..................SpringBoard.................................................N..Z
1.....................................`w.$.t..y..E..-.-@.@.......x.S....P...SGe..P. ..J..GET ////?Brand=iPhone&Height=568&NetworkType=Wifi&OS=iOS&OSVersion=10.2&Platform=2&VersionCode=1&VersionName=1.1.0&Width=320&channel=default&deviceid=&time=1521093710&v=1521093710.602857 HTTP/1.1
Host: open-api..com
Platform: 2
Uuid: 
Accept: */*
Version: 1.0
User-Agent: SpringBoard/1.0 (iPhone; iOS 10.2; Scale/2.00)
Accept-Language: zh-Hans-CN;q=1
Accept-Encoding: gzip, deflate
Connection: keep-alive


14:01:50.779518 IP 120.27.83.144.http > 192.168.2.154.49589: Flags [.], ack 518, win 32, length 0
............en0...................... ..................SpringBoard.................................................N..Z....................................$.t..y...`w...E..(Ma@.2.l.x.S......P..Ge.....XP.. ....
14:01:50.806873 IP 120.27.83.144.http > 192.168.2.154.49589: Flags [.], seq 1:1453, ack 518, win 32, length 1452: HTTP: HTTP/1.1 200 OK
............en0...................... ..................SpringBoard.................................................N..Z.O..................................$.t..y...`w...E...Mb@.2.f.x.S......P..Ge.....XP.. ....HTTP/1.1 200 OK
Server: openresty
Date: Thu, 15 Mar 2018 06:01:50 GMT
Content-Type: image/png
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: PHPSESSID=6cc3becb6e026be3e2a4a2f39a5300fa14cf193a; path=/; domain=.open-api.abuyun.com
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified: Thu, 15 Mar 2018 06:01:50GMT
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Content-Encoding: gzip

58a
...........s....PNG
.
....IHDR...`............m...:IDATX..Y.K3M.....F.,.....F..X......P.... .SXi.=..#..XID..EA.......X..........e.....(..j.;.;.....M(.H.B....0M..T.%.L.J.[.z
.4..T*.....$.P(..
%.	Y.u].h.i.eY.Pgg.o.IUU...VxQ.......J...............^^^l.~~~>99......../;..=>>V.U.S....5....T*eY..........&`.Ky.q$I...u...V.`v@...4....|.a.(.......f..`5.>.c......k...5...;......"D/'].&.....&.14.Rg...`.lfS
(.....}zz:.&a..u].e..i....T7.L.
.EQ@...R`.......}%5M...B.\...777.....;.............b.....477....u.\..uU/....z.WTew.{...7X..Z..1.m...J.7W.4.......8v\.hmm...A.[L..F.5..1.....S^M...s.A.]..EA..G.h$.....yp-..H$....d.0./....'..=.[..W*.,.RU..UQ...3.....x.l6K.pk*......|$.iii).J...........v&.......b..=....)...B ~Su...O......J....}..............T*.NMYX.$h`...r>..... B...b]]..?.. [a.}....JR...w...i..M.B...X...$I_.Z.1...(2....I.yD...BA.e.k..h4
........D1.t:M...9...r9n......Q.3ZP...2m...d:...u.....S.TU.......o.....TU....,.........N........-....|..
.*.>P.Z.+R.!...e..0...............
14:01:50.933441 IP 192.168.2.154.49589 > 120.27.83.144.http: Flags [.], ack 1453, win 8192, length 0
............en0...................... ..................SpringBoard.................................................N..ZA>.....................................`w.$.t..y..E..(L.@.@._.....x.S....P...XGe.5P. .....
14:01:51.007958 IP 120.27.83.144.http > 192.168.2.154.49589: Flags [P.], seq 1453:1905, ack 518, win 32, length 452: HTTP
............en0...................... ..................SpringBoard.................................................O..Z....................................$.t..y...`w...E...Mc@.2.j.x.S......P..Ge.5...XP.. .N...E.....H&.....=...P....B..,...x.i)I.!...b..z.....}../x).O...64...].(..i.r$......P
.8.///..4.....A>....\1A...>. o&..lv......en......\..J.....J:A..f.....b....i. h.v....m...W..PUU..B....9.e.c.....Z+;,....B.x\ S3A.....l6...T__...1.ms.M.4.1Dhn5/6..|9...Bh..]....z|>5.........wBQ..4....k....3.....1.........lGG.X..@........;.(...6..>........Z...B...........	^/y.O....6..G^...~}}......e..A..(.#..?%.....G.;..i4......F._..B.?..h.`.......IEND.B`...!.s...
0


14:01:51.008127 IP 192.168.2.154.49589 > 120.27.83.144.http: Flags [.], ack 1905, win 8177, length 0
............en0...................... ..................SpringBoard.................................................O..Z.......................................`w.$.t..y..E..(A.@.@.j ....x.S....P...XGe..P....h..

-i, 要监听的网卡名称,-i rvi0监听虚拟网卡。不设置的时候默认监听所有网卡流量。

-A, 用ASCII码展示所截取的流量,一般用于网页或者app里http请求。-AA可以获取更多的信息。

-X,用ASCII码和hex来展示包的内容,和上面的-A比较像。-XX可以展示更多的信息(比如link layer的header)。

-n,不解析hostname,tcpdump会优先暂时主机的名字。-nn则不展示主机名和端口名(比如443端口会被展示成https)。

-s,截取的包字节长度,默认情况下tcpdump会展示96字节的长度,要获取完整的长度可以用-s0或者-s1600。

-c,只截取指定数目的包,然后退出。

-v,展示更多的有用信息,还可以用-vv -vvv增加信息的展示量。

src,指明ip包的发送方地址。

dst,指明ip包的接收方地址。

port,指明tcp包发送方或者接收方的端口号。

and,or,not,
<!-- 例子 -->
tcpdump ‘tcp[13] & 16!=0’

tcpdump src port 80 and tcp

tcpdump -vv src baidu and not dst port 23

tcpdump -nnvvS src 192.0.1.100 and dst port 443

  • 例子devzkndeMacBook-Pro:com.wl..git devzkn$ sudo tcpdump -i rvi0 -AAl src 192.168.2.54 or dst 101.227.169.159
tcpdump: WARNING: rvi0: That device doesn't support promiscuous mode
(BIOCPROMISC: Operation not supported on socket)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on rvi0, link-type PKTAP (Apple DLT_PKTAP), capture size 262144 bytes

............en0...................... ...............................................................................$.Z............................................ZF.[............ZF.[...6..........
15:45:04.201643 IP 192.168.2.54.49525 > 218.75.177.11.https: Flags [F.], seq 1966557688, ack 1968545729, win 4096, options [nop,nop,TS val 1005623903 ecr 2012104264], length 0
............en0...................... ...............................................................................$.Z.......................................`w...ZF.[..E..4..@.@......6.K...u..u7I.uU.............
;.._w.FH
15:45:04.216860 IP 192.168.2.54.49525 > 218.75.177.11.https: Flags [FP.], seq 4294967211:0, ack 1, win 4096, options [nop,nop,TS val 1005623943 ecr 2012134515], length 85
............en0...................... ...............................................................................$.Z.O.....................................`w...ZF.[..E....m@.@.*....6.K...u..u7I.uU.............
;...w..s....P'._..c..)L..b....X....[....m.)"k.*7...'x.....P$.......1...)....?t+._ny4..UQd/..3
15:45:04.232246 IP 192.168.2.54.49525 > 218.75.177.11.https: Flags [.], ack 1, win 4096, options [nop,nop,TS val 1005623957 ecr 2012134519], length 0
............en0...................... ...............................................................................$.Z6......................................`w...ZF.[..E..4X.@.@......6.K...u..u7I.uU......v#.....
;...w..w
15:45:04.232328 IP 192.168.2.54.49525 > 218.75.177.11.https: Flags [.], ack 2, win 4096, options [nop,nop,TS val 1005623957 ecr 2012134519], length 0
............en0...................... ...............................................................................$.Z.......................................`w...ZF.[..E..4)L@.@..B...6.K...u..u7I.uU......v".....
;...w..w
15:45:18.443362 IP 192.168.2.54 > 192.168.2.100: ICMP 192.168.2.54 udp port weblogin unreachable, length 36
............en0...................... ...............................................................................$.Z....................................4.......ZF.[..E..8*...@..>...6...d..	.....E..8...........d...6.5...$..
15:45:23.372847 ARP, Reply 192.168.2.54 is-at f4:f1:5a:46:97:5b (oui Unknown), length 28
............en0...................... ...............................................................................$.Zo...................................4.......ZF.[............ZF.[...64........d
15:46:18.444230 IP 192.168.2.54 > 192.168.2.100: ICMP 192.168.2.54 udp port weblogin unreachable, length 36
............en0...................... ...............................................................................$.ZF...................................4.......ZF.[..E..8$...@..U...6...d..
o....E..8./.........d...6.c...$..
15:46:23.372414 ARP, Reply 192.168.2.54 is-at f4:f1:5a:46:97:5b (oui Unknown), length 28
............en0...................... ...............................................................................$.Z....................................4.......ZF.[............ZF.[...64........d
15:46:56.202113 ARP, Request who-has 192.168.2.1 tell 192.168.2.54, length 28
............en0...................... ...............................................................................$.Z............................................ZF.[............ZF.[...6..........
15:46:56.231715 IP 192.168.2.54.62927 > public1.114dns.com.domain: 39203+ A? minorshort.weixin.qq.com. (42)
............en0...................... ...............................................................................$.Z#......................................`w...ZF.[..E..F.A..@.,....6rrrr...5.2.;.#..........
minorshort.weixin.qq.com.....
15:46:56.593275 IP 192.168.2.54.49527 > 41.224.151.61.dial.xw.sh.dynamic.163data.com.cn.https: Flags [S], seq 2997068169, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 1005736282 ecr 0,sackOK,eol], length 0
............en0...................... ...............................................................................$.Z{.	....................................`w...ZF.[..E..@.i@.@.q....6=..).w.............................
;.QZ........

<!-- rvictl -x fa6770acd2e0625 -->

tcpdump 基础知识

  • tcp header
  • TCP Flags(tcp header第十四个字节)–这8个flag首字母分别是:C E U A P R S F
flags位于tcp header的第十四个字节,包含8个比特位,也就是上图的CWR到FIN。
这8个比特位都有特定的功能用途,分别是:CWR,ECE,URG,ACK,PSH,RST,SYN,FIN。

<!-- CWR((Congestion Window Reduced)) ,ECE 两个flag是用来配合做congestion control; -->
发送方的包ECE(ECN-Echo)为0的时候表示出现了congestion,
接收方回的包里CWR(Congestion Window Reduced)为1表明收到congestion信息并做了处理。

<!-- URG URG代表Urgent,表明包的优先级高,需要优先传送对方并处理。像我们平时使用terminal的时候经常ctrl+c来结束某个任务,这种命令产生的网络数据包就需要urgent。 -->


<!-- ACK:用来告诉对方上一个数据包已经成功收到。在下一个要发送的packet里设置ack位,这属于tcp的优化机制 -->
参见delayed ack:https://en.wikipedia.org/wiki/TCP_delayed_acknowledgment

<!-- PSH Push接收方接收到P位的flag包需要马上将包交给应用层处理 -->
一般我们在http request的最后一个包里都能看到P位被设置。

<!-- RST Reset位,表明packet的发送方马上就要断开当前连接了。 -->
在http请求结束的时候一般可以看到一个数据包设置了RST位。


<!-- SYN位在发送建立连接请求的时候会设置,我们所熟悉的tcp三次握手就是syn和ack位的配合:syn->syn+ack->ack。 -->

<!-- FIN Finish位设置了就表示发送方没有更多的数据要发送了,之后就要单向关闭连接了,接收方一般会回一个ack包。接收方再同理发送一个FIN就可以双向关闭连接了。 -->
<!-- ps:[S],[P],[R],[F],[.]; -->
[.]特殊点,是个占位符,没有其他flag被设置的时候就显示这个占位符,一般表示ack

rvictl

Remote Virtual Interface Tool starts and stops a remote packet capture instance for any set of attached mobile devices. It can also provide feedback on any attached devices that are currently relaying packets back to this host.

  • -l
devzkndeMacBook-Pro:com.wl..git devzkn$ rvictl -l

Current Active Devices:

	[1] bea23bf46e215fd9beca7f9dd4e31 with interface rvi0

  • rvictl help
Options:
	-l, -L		List currently active devices
	-s, -S		Start a device or set of devices
	-x, -X		Stop a device or set of devices
  • -x
devzkndeMacBook-Pro:com.wl..git devzkn$ rvictl -x bea23be5fd9beca7f9dd4e31

Stopping device bea23b5fd9beca7f9dd4e31 [SUCCEEDED]
tcpdump: pcap_loop: The interface went down
14135 packets captured
20178 packets received by filter
6043 packets dropped by kernel

see alsos


<!-- https://github.com/FrozenGene/LLVMPascalCompiler -->
词法分析器,读取源文件的字符,然后将这些字符组成一个一个符合特定程序语言的词素,最后生成输出一个有效的词法单元(Token)序列。

<!-- Token具有的属性 -->

1、词法单元类型(Token Type),词法单元值(Token Value),词法单元所在源文件位置(Token Location),词法单元符号优先级(Token Symbol Precedence),词法单元名称(Token Name)

2、词法单元类型包括了Integer,Real(即对应C/C++的double),Identifier等;

词法单元值则为词法单元本身在编译器的编码;
如读取到if这个关键字,会对应到TokenValue::If,而这个编码对于用户是不可见的,

词法单元名称这个属性则是做显示词法单元值的事情。

每个词法单元在源文件也具有着位置信息,其具体表现为词法单元所在的行号与列号。

<!-- http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml -->
LLVM暴露的接口是指针

<!-- https://github.com/FrozenGene/LLVMPascalCompiler/blob/master/LLVMPascal/LLVMPascal/token.cpp -->

token.h: 词法单元类型、与词法单元值、词法单元的位置信息(TokenLocation:源文件名字,行号,列号)、

<!-- 面对三个及其以上的元素则没有标准库容器对应,而tuple则是为了解决这个问题而引入的。有了tuple,我们就可以把三个及其以上的元素绑定在一起 -->
dictionary将会具有一个std::string, std::tuple<TokenValue, TokenType, int>的map


<!-- 词法分析器则分布在了scanner.h和scanner.cpp中,使用class Scanner表示。 -->

Scanner的核心实现方法则是getNextToken,这是整个词法分析器的核心所在

<!-- 读取源文件的字符,然后将这些字符组成一个一个符合特定程序语言的词素,最后生成输出一个有效的词法单元序列 -->
词法分析是一个将字符流转换为单词流的一个过程,而识别这些单词流为有意义的句子流的过程则交给了词法分析的下一个阶段——语法分析

<!-- 词法分析器会将每一个识别出来的词素进行归类,而归类的结果我们称其为词法单元 -->
1、词法分析器归类的依据则是程序设计语法规范说明,也即我们经常谈到的语言标准

2、程序设计语言将会具有一个特殊的词法单元——关键字(Keywords),也叫做保留字(Reserved Words)
https://www.quora.com/Where-is-the-definition-of-keywords-available-in-C-C%2B%2B-language/answer/Wu-Zhao-2

<!-- 词法分析器应该如何识别出词素组成词法单元呢? -->

一个词法分析器的状态机是由多种状态以及转移方程组成的,最后构成了一个“宏观”的状态机。




<!-- 编译器前端部分的词法分析、语法分析、中间代码生成, ;编译器后端的目标代码生成、代码优化。 -->

<!-- 别人看语言的时候,看到的是语法,而对于编译器开发者来说,第一直觉就是我知道如何实现它 -->
#进行单行注释在词法分析器中如何实现

<!-- 设计实现一个编译器的过程中,能用到的知识很多,更像是一个计算机科学的缩影 -->
在寄存器分配中将会使用到贪心算法,死代码消除中将会使用到图论算法,数据流分析中使用到定点算法(Fixed-Point Algorithm),词法分析与语法分析中使用到有限状态机与递归下降这样的重要思想


<!-- 这次仅仅是使用LLVM现成的优化算法而已 -->
优化算法的具体分析与实现,如Lazy Code Motion, Region-Based Analysis, Dynamic Code Optimization, Data Flow Analysis, Pointer Alias;不是此次讨论的内容。

<!-- 编译器是一个能将某种语言(源语言)编写的程序转换为另外一种语言(目标语言)的程序 -->

1、将便于开发人员编写与阅读的高级程序语言(如C、C++、Pascal等)转换为另一种低级语言(如汇编语言)
2、而产生的汇编语言将会通过汇编器转换为各种机器平台(如Intel 的x86平台,IBM的Power平台等)所能执行的机器语言,最后产生计算机可以执行的目标文件。

<!-- 从组织结构上,可以将编译器分为编译器前端与编译器后端 -->

1、编译器前端主要包括了词法分析、语法分析、语意分析、中间代码生成部分,
2、编译器后端则包括了分析与优化中间代码,进行目标代码的生成。
3、然而发展到现在,其实在编译器前端与编译器后端的衔接处往往会有优化器层:优化器层的主要目的在于将前端产生的中间代码表示(Intermediate Representation,简称IR)进行分析与转换,从而产生更高效的代码,然后传给编译器后端

----很多时候编译器后端做的优化往往与目标平台有关了,而与机器无关的优化往往都在优化器层中进行



编译器是原理与实现高度结合的项目
<!-- 一、词法分析是编译器的第一个步骤 -->

主要为将输入的代码转换为一系列符合特定语言的词法单元,这些词法单元类型包括了关键字,操作符,变量等。

1、举个例子,Pascal语言包含了关键字if,那么在词法分析步骤时,遇到i与f组合在一起的时候,需要将这两个字母组合为关键字if这个词法单元。


<!-- 二、编译器的第二个步骤为语法分析 -->

1、将词法分析器所产生的一系列词法单元组合起来,以其验证是否符合特定语言的语法规则,并且产生抽象语法树(Abstract Syntax Tree)

2、举个例子,Pascal语言的全局变量声明语句的语法格式为 var variableName : variableType; 其中variableName代表变量名,如a。variableType代表变量类型,如Integer。那么var a : Integer; 则为一个合法的语法声明,然而var 1 : Integer; 则非一个合法的语法声明,因为1为数字类型,而这里需要一个变量名,那么语法分析器应该报错。而通常用于语法分析器的语法表达方法为上下文无关表示法(Context-free Grammar)

<!-- 三、语义分析主要为收集类型信息,并将这些信息放入符号表或者抽象语法树中,以便在随后的中间代码生成过程中调用 -->

这里面一个重要工作就是类型检测与类型转换。如在数组中,规定下标需要整数类型。而在一些语言中,允许类型提升,如C/C++语言中的int类型向double类型的自动提升。

<!-- 四、中间代码生成是整个编译器前后端联系的纽带,属于核心的地位 -->

从源语言翻译为目标语言的过程中,编译器可能会有一到多个中间表示,而这个中间表示也可以有多种的形式,这种形式包括了三地址表示法,IBM编译器的WCode,LLVM的LLVM IR

<!-- 五、代码优化则将会运用一系列优化算法与措施来让代码执行的更加高效:Constant Folding -->

Constant Folding 实属于了Local Optimization里面的优化技术。例如常量的相加


<!-- 六、目标代码生成主要则是中间代码生成目标平台的汇编代码,而这与目标平台息息相关 -->

LLVM,可以很轻易的将LLVM IR转化为x86, PowePC等平台的汇编代码。

<!-- 七、通过汇编器与链接器(如GCC的as与ld)进行汇编加载,生成可执行的目标文件 -->

http://en.wikipedia.org/wiki/LLVM

<!-- 词法分析、语法分析、中间代码(LLVM IR)、代码优化(除死代码、常量合并、置换,消除公共表达式)、代码生成(x86、其他平台)

<!-- 以Pascal为原型,方便做编译原理的阐释 -->
<!-- 开发语言与平台工具:使用C++11的新特性(如智能指针,auto等) 需要一个支持C++11的编译器;C++的确比较适合开发编译器,并且LLVM API是C++的,自然与C++比较贴切  -->
mach-o中加入__restrict的section,防止dylib注入

调用ptrace防止动态调试

字符串使用异或加密防止反编译被看到,从而跟踪到关键函数

对类名方法名函数名加密

<!-- 使用llvm混淆编译增加代码流程复杂度----http://iosre.com/t/7-llvm/8260  需要实现的常量文本加密的话,把原来的GV CDA替换成加密的;然后在所有的Instrution类User那里插入allocainst后解密 -->
混淆的目的就是为了拿体积和性能换攻击者的开销


<!-- 使用md5文件自检,防止对二进制文件直接进行修改 -->

对可疑的越狱设备判断,可查找关键文件比如debugserver

<!-- 退出程序不要使用exit或abort可使用无限alloc等方式 -->

<!-- xcode配置strip编译时删除符号表 -->
用clang生成语法树,然后拿到节点,然后再进行加密

<!-- Clang生成语法树: -->

xcrun -sdk iphoneos clang -arch arm64 -Xclang -ast-dump -fsyntax-only -F UIKit ViewController.m


<!--  利用Clang的一些API进行分析与加密(例子源码见附件,感谢Monkey的开源源码)-->

<!-- 1.首先需要dlopen一个动态库:libclang.dylib -->
	void *hand = dlopen("/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libclang.dylib",RTLD_LAZY);

<!-- 2.初始化函数指针:initlibfunclist(void* handle); -->
 //初始化函数指针
        initlibfunclist(hand);

<!-- 3.在这个函数enum CXChildVisitResult printVisitor(CXCursor cursor, CXCursor parent, CXClientData client_data) 里遍历出文件名,变量名,类型,以及字符是OC字符串还是C字符串,最重要的是我们可以在这个函数里拿到字符串的开始和结束的位置,然后再进行字符串加密操作。这样子就可以把整个项目的字符串进行加密。 -->
	myclang_visitChildren(rootCursor, printVisitor, NULL);

__attribute__((constructor)) static void entry()方法是项目的入口,当MobileSubstrate注入dylib后会调用此方法。libFlex类会监听UIApplicationDidBecomeActiveNotification,所以当被注入的App变为激活状态后,FLEX就会显示出来。

<!-- /libFlex/libFlex/Package/Library/MobileSubstrate/DynamicLibraries/ -->

<!-- coolstar的Electra越狱的iOS 11  /bootstrap/Library/SBInject  对应之前的系统的路径DynamicLibraries -->


<!--1、 标识符混淆 -->
<!--  -->
<!-- #define SYMBOL(name) asm(name) // 使用asm label语法修改符号名称 -->
<!-- asm label的语法解释,可以参考gcc的onlinedocs:https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html  -->
void func1() SYMBOL(_func1);    ==>   void func1();
           ||               不混淆时的展开
          \||/ SYMBOL宏展开
           \/
void func1() asm(_func1);
           ||
          \||/ _func1宏展开
           \/
void func1() asm("UvftVFTxsweCSElpqLPmjiMJIb");


<!-- 2、字符串混淆 -->

将源代码中的字符串通过函数宏手动标记

备份源代码

将源代码中所有标记过的字符串,替换成decrypt("密文")的形式

在适当的位置,插入decrypt函数的实现(或者事先在源代码中写好)

编译

还原备份的源代码

<!-- 说明: -->

如果把字符串"Hello"转化为char[]{'H','e','l','l','o',0}的形式进行编译,字符串就会从__cstring中的明文字符,变为__text中的一段代码,可以防止被搜索到。因此如果要兼顾执行效率和混淆的效果,
<!-- 只需要把字符串转换成char数组的形式就可以了,不需要再添加解密的步骤。 -->

0、大多数App,只有核心功能需要混淆,不需要全文件混淆,不然运行过程中的内存加解密也是一大开销

1、挖个坟,实际上最大的原因是影响出错的调试,拿到CrashLog之后难以对应源代码

2、核心代码用c来写,内部多用指针,可以增加逆向难度---加壳其实保护也不太大,可以内存dump

3、一是将涉及业务的代码用别的语言实现,二,将业务交给后台服务器;

<!-- iOS安全攻防(二十四):敏感逻辑的保护方案(1) http://blog.csdn.net/yiyaaixuexi/article/details/29210413 -->
函数名隐藏在结构体里,以函数指针成员的形式存储。这样做的好处是,编译后,只留了下地址,去掉了名字和参数表,提高了逆向成本和攻击门槛。

<!-- iOS安全攻防(二十三):Objective-C代码混淆 -->

<!-- iOS代码混淆 http://xelz.info/blog/2016/11/20/ios-code-obfuscation/ -->
如果用了第二种方式,将函数改用c实现,虽然通过class-dump得不到有价值的信息,但通过nm命令或者IDA/Hopper等工具仍然能从符号表中找到这些c函数以及衍生出的一些静态变量。针对这种情况,我们还是可以通过宏定义的方式,将这些c的标识符(函数名、变量名)替换为随机字符串。


<!-- sysctl 用以查询内核状态的接口,并允许具备相应权限的进程设置内核状态 -->

TensorFlow是Google开源的深度学习框架。


<!-- 简单的方法就是通过github进行安装,https://github.com/radare/radare2 clone下来直接执行sys下面的install.sh -->


r2 – 主程序

rabin2 – 分析文件(导入、导出、字符串...)

rax2 – 数据格式转换

radiff2 – 查找不同

rahash2 – 从文件块或整个文件创建哈希

rasm2 – 汇编指令帮助

<!-- 简单的命令 -->
aaa 反编译所有

is 查看符号信息

afl 查看所有的函数列表

s 定位函数

pdf 打印逆向的代码

VV 逻辑视图

p 进入逻辑视图后更改视图类型

tab 切换视图查看函数



<!-- 0x01 组成 -->

爬、解、存,爬是爬取页面,解是解析页面,存当然是存储结果。


<!-- 爬 :request/response-->
请求、并发请求、分布式并发请求。

两个维度去重:URL本身的去重以及html页面的去重。

<!-- 把URL基于域名归一化:更进一步可以把常见项做编号, -->
比如 com标号为0,org标号为1,www 标号为0, blog编号为1,http:// 标号为1,https:// 标号为0,这样http://www.mi.com 可以编号为 10mi0,然后把日期编号为0,字母表编号为1,html编号为+,那么20170315.html归一化后就是0+。->大大缩小存储,过滤也相对准确.

<!-- 2.页面去重: chrome版的headless浏览器,当然也有基于firefox的slimerjs->casperjs,也就是把上述二者包装了一下,统一并简化下API, -->
nightmare 、 Ghost.py -》专门解析js动态页面的服务集群;
phontomjs/ghost/splash都是基于qt webkit,而nightmare则是基于electron

<!-- 解  :jQuery、PyQuery、BeautifulSoup -->

<!-- 0x02 反反爬 -->
UA、限速(随机)、多IP、验证码识别(使用机器学习中的图像识别技术,这样更加自动化智能化,任何图片集都可以作为学习样本)
滑动条识别、遵守robots.txt







1、基础知识框架的搭建,官方文档是最好的起点了。

2、精读:对于技术术语的学习只做适度延伸,最终的目的还是在于完成根部文章的阅读。---克制对于知识的求索欲,重点放在学习和解决问题的能力。

3、完完整整的阅读一些大部头的英文原版技术书,这才是知识学习的正餐;别人写的零散文章更适合作为饭后甜点。






iOS上实现网络抓包可以用Charles(针对http和https),tcpdump(快速分析网络包),和Wireshare
<!-- 分析包结构:http header, tcp header, ip header-->
应用层(http),

传输层(tcp or udp),tcp header的学习--典型的tcp header一般长度为20个字节

网络层(ip)---IP Header

<!-- 1、使用Filter过滤包:Capture Filter、Display Filter http://link.zhihu.com/?target=https%3A//www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html -->

Capture Filter: 与tcpdump的filter语法是一致
//只捕获HTTP流量
 port 80 or port 443
 //只捕获DNS流量
port 53
//只捕获和特定主机的流量
host 171.10.191.10


Display Filter:等式关系描述
ip.addr==171.10.191.10
tcp.port == 80 || tcp.port == 443

<!--2、 包颜色规则: View->Coloring Rules-->
技巧:对http,tcp,udp包上色;
tcp三次握手中的Sync包是使用灰色标记的,这样我就可以在下图的包中迅速定位一次tcp连接的开始包位置

把Sync包和FIN包设置一个高亮的颜色,方便判断一次HTTP会话的起始和结束


<!-- 3、流量跟踪:选中某个包之后,右键弹出的菜单里Follow Stream;  Statistics->Flow Graph -->
TCP,UDP,HTTP,SSL
Follow Stream更适合分析针对某一个服务器地址的流量,

而FlowGraph更适合分析某个App的整体网络行为,包含从DNS解析开始到和多个服务器交互等。

ps:Statistics->HTTP->Requests


<!-- 4、HTTPS包分析:HTTP建立连接之初的tcp三次握手所产生的三个包 -->

Sync: iPhone发送Sync。

Sync+Ack: Server发送Sync+Ack。

Ack: iPhone Ack。


三次握手之后是ssl handshake:Client Hello(ssl握手的起始包,携带当前会话所依赖的一些关键信息,包括上次的Session ID)、

Server Hello(带上服务器这一端的一些信息,Server所选择的tls版本、带上可以重用的Session ID避免重新握手、在Client传过来的Cipher Suites当中挑选一个Cipher Suite进行后续的安全通话)、

Server 下发Certificate(Server同时会下发自己的Certificate)、

-》Client和Server基于上面交换的信息协商最后使用的密钥

Server Key Exchange、Client Key Exchange、Change Cipher Spec、Send Application Data





ps:http://link.zhihu.com/?target=http%3A//www.moserware.com/2009/06/first-few-milliseconds-of-https.html

Wireshark虽然支持配置RSA私钥,但我们没办法直接获取iPhone设备上各个App所使用的私钥,这种场景下我们一般使用MITM(Man In The Middle)中间人攻击来破解HTTPS包内容,收费工具Charles可以通过代理的方式来实现此功能
lsof ——列出当前系统打开的文件列表,别忘记一切皆文件,包括网络连接、硬件等
devzkndeMacBook-Pro:.git devzkn$ lsof
COMMAND     PID   USER   FD      TYPE             DEVICE   SIZE/OFF       NODE NAME
loginwind   113 devzkn  cwd       DIR                1,4        992          2 /
loginwind   113 devzkn  txt       REG                1,4    1241072 8590278373 /System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow
<!-- otool ① ——查看程序依赖哪些动态库信息,反编代码段……等等等等 -->
otool -l xxx, 可查看可执行文件链接了哪些库
otool -tv xxx ,反编译 xx 的TEXT段内容
<!-- nm ② ——显示符号表    nm -g  -->
devzkndeMacBook-Pro:.git devzkn$ nm /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm
00000001005158f9 s _.str.1.llvm.1685F4E9
<!-- ldid ③ ——签名工具 -->
ldid -e tmp
ldid -S helloworld

<!-- arm-apple-darwin10-llvm-gcc-4.2    -isysroot用来指定build时的SDK-->

<!-- symbolicatecrash 还原符号表 -->

<!--  strings /Users/devzkn/Downloads/kntmp/itunesstored2.sqlitedb -->



针对http和https可以使用Charles设置代理来做,对于更广泛的协议可以使用tcpdump或者wireshark。wireshark提供GUI,方便做深入全面的数据分析。tcpdump则输出原始的包内容,好处是快速高效
<!-- rvictl: 不像代理,不会干扰iOS设备正常的网络访问。 -->
-l 当前的活跃设备
-x 创建虚拟网卡
-s 结束虚拟网卡


<!-- 打开Wireshark,在捕获选项里面选择rvi0这个设备,这个时候,iPhone所有TCP和UDP流量,都会打印到Mac上 -->
<!-- 4.在Wireshark里面输入合适的过滤器,便于追踪目标流量。 -->

转载请注明: > tcpdump

在操作过程或者文章有问题的话欢迎在 原文 里提问或指正。

赞赏支持

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少
最近的文章

OutlineOfChineseHistory

前言 六个模块 <!-- 古代历史部分 -->1、封建社会、豪族社会、古代平民社会<!-- 近代 -->近代转型、现代革命、中国崛起与世界秩序的互动正文历史学才是正确的未来学思考未来的时候,最重要的事情是对未来目标的设定-》理解自己、世界的过去,搞清楚自己的位置 历史的功用 <!-- 通过过去看到未来 --> 理解中国和世界关系的变迁过程 <!-- 时间和空间两条线索 -->1、从内部来说,中国一直是一个超...…

OutlineOfChineseHistory继续阅读
更早的文章

document-ch-controlfields

前言 本文重点说明Syntax of control files的three types of fields:simple、folded、multiline; ---因为一不小心就容易出错:missing final newline、Status: install ok half-configured、 EOF before value of field `Icon' (missing final newline) end of file during value of fie...…

iOSre继续阅读
更多