編譯iOS10.x可用lsof(越獄)

lsof常用語法:

檢測本機(jī)端口開放 lsof -i:[port]
查找指定進(jìn)程開放端口 lsof -aPi -p [pid]
查找所有監(jiān)聽端口 lsof -aPi

為什么自己編譯?
目前沒發(fā)現(xiàn)針對iOS10.x可用的lsof贷帮,我用它來查找進(jìn)程占用的描述符氮惯,包括tcp端口

1.下載最新版本lsof
https://opensource.apple.com/tarballs/lsof/

2.Mac上解壓后編譯
根目錄下有Makefile lsof/ lsof.plist
切換到lsof/下執(zhí)行./Configure darwin(問題都選no)袜匿,得到以下結(jié)果:

Configuring libproc-based Darwin lsof

This configuration step (the Inventory script) takes inventory of
the lsof distribution.  The script runs for a minute or two while
it checks that all the subdirectories, information files, scripts,
header files and source files that should be present really are.

It's not absolutely necessary that you take inventory, but it's a
good idea to do it right after the lsof distribution has been
unpacked.  Once the inventory has been taken, this script creates
the file ./.ck00MAN as a signal that the inventory step has been
done.

You can call the Inventory script directly at any time to take
inventory.  You can inhibit the inventory step permanently by
creating the file ./.neverInv, and you can tell the Configure script
to skip the inventory and customization steps with the -n option.

Do you want to take inventory (y|n) [y]? n
rm -f ddev.c dfile.c dlsof.h dmnt.c dnode*.c dproc.c dproto.h dsock.c dstore.c dzfs.h kernelbase.h machine.h machine.h.old new_machine.h __lseek.s Makefile Makefile.zfs ./tests/config.cflags
rm -f ./tests/config.cc ./tests/config.xobj ./tests/config.ldflags
Testing C library for localtime() and strftime(), using cc ... npresent
ln -s dialects/darwin/libproc/dlsof.h dlsof.h
ln -s dialects/darwin/libproc/ddev.c ddev.c
ln -s dialects/darwin/libproc/dfile.c dfile.c
ln -s dialects/darwin/libproc/dmnt.c dmnt.c
ln -s dialects/darwin/libproc/dproc.c dproc.c
ln -s dialects/darwin/libproc/dproto.h dproto.h
ln -s dialects/darwin/libproc/dsock.c dsock.c
ln -s dialects/darwin/libproc/dstore.c dstore.c
ln -s dialects/darwin/libproc/dnetpolicy.c dnetpolicy.c
ln -s dialects/darwin/libproc/dchannel.c dchannel.c
ln -s dialects/darwin/libproc/dnexus.c dnexus.c
ln -s dialects/darwin/libproc/machine.h machine.h

Makefile and lib/Makefile created.
./tests/config.cc created
./tests/config.cflags created
./tests/config.ldflags created
./tests/config.xobj created

You may now customize the machine.h header file for this UNIX
dialect.  The customizations will take effect when you compile
lsof.  You may also choose to skip customization and proceed to
the compilation of lsof.

If you don't know if you need to customize or want to know more
about what you can customize, consult the 00DCACHE, 00FAQ, 00PORTING,
and 00README files of the lsof distribution.  You might also find
it helpful to examine the machine.h header file for the dialect
you're customizing.

You don't need to use this procedure to customize lsof; you can
edit the machine.h header file directly.  If you later decide you
want to use this procedure to customize machine.h, execute the
./Customize script.
Do you want to customize (y|n) [y]? #

執(zhí)行make得到如下結(jié)果:

(cd lib; /Applications/Xcode.app/Contents/Developer/usr/bin/make DEBUG="-O" CFGF="-DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"")
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o ckkv.o ckkv.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o cvfs.o cvfs.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o dvch.o dvch.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o fino.o fino.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o isfn.o isfn.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o lkud.o lkud.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o pdvn.o pdvn.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o prfp.o prfp.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o ptti.o ptti.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o rdev.o rdev.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o regex.o regex.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o rmnt.o rmnt.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o rnam.o rnam.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o rnch.o rnch.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o rnmh.o rnmh.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR="16.7.0"  -O   -c -o snpf.o snpf.c
ar cr liblsof.a ckkv.o cvfs.o dvch.o fino.o isfn.o lkud.o pdvn.o prfp.o ptti.o rdev.o regex.o rmnt.o rnam.o rnch.o rnmh.o snpf.o
ranlib liblsof.a
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o ddev.o ddev.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o dfile.o dfile.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o dmnt.o dmnt.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o dproc.o dproc.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o dsock.o dsock.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o dstore.o dstore.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o arg.o arg.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o main.o main.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o misc.o misc.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o node.o node.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o print.o print.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o proc.o proc.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o store.o store.c
Constructing version.h
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o usage.o usage.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o util.o util.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o dnetpolicy.o dnetpolicy.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o dchannel.o dchannel.c
dchannel.c:52:7: error: use of undeclared identifier 'PROC_CHANNEL_TYPE_USER_PIPE'
        case PROC_CHANNEL_TYPE_USER_PIPE:
             ^
dchannel.c:55:7: error: use of undeclared identifier 'PROC_CHANNEL_TYPE_KERNEL_PIPE'
        case PROC_CHANNEL_TYPE_KERNEL_PIPE:
             ^
dchannel.c:58:7: error: use of undeclared identifier 'PROC_CHANNEL_TYPE_NET_IF'
        case PROC_CHANNEL_TYPE_NET_IF:
             ^
dchannel.c:61:7: error: use of undeclared identifier 'PROC_CHANNEL_TYPE_FLOW_SWITCH'
        case PROC_CHANNEL_TYPE_FLOW_SWITCH:
             ^
dchannel.c:78:16: error: use of undeclared identifier 'PROC_CHANNEL_FLAGS_MONITOR'
        if ((flags & (PROC_CHANNEL_FLAGS_MONITOR)) != 0) {
                      ^
dchannel.c:80:17: error: use of undeclared identifier 'PROC_CHANNEL_FLAGS_MONITOR'
                if ((flags & (PROC_CHANNEL_FLAGS_MONITOR))
                              ^
dchannel.c:81:10: error: use of undeclared identifier 'PROC_CHANNEL_FLAGS_MONITOR'
                    == PROC_CHANNEL_FLAGS_MONITOR) {
                       ^
dchannel.c:83:23: error: use of undeclared identifier 'PROC_CHANNEL_FLAGS_MONITOR_TX'
                } else if ((flags & PROC_CHANNEL_FLAGS_MONITOR_TX) != 0) {
                                    ^
dchannel.c:88:16: error: use of undeclared identifier 'PROC_CHANNEL_FLAGS_MONITOR_NO_COPY'
                if ((flags & PROC_CHANNEL_FLAGS_MONITOR_NO_COPY) != 0) {
                             ^
dchannel.c:93:15: error: use of undeclared identifier 'PROC_CHANNEL_FLAGS_EXCLUSIVE'
        if ((flags & PROC_CHANNEL_FLAGS_EXCLUSIVE) != 0) {
                     ^
dchannel.c:102:15: error: use of undeclared identifier 'PROC_CHANNEL_FLAGS_USER_PACKET_POOL'
        if ((flags & PROC_CHANNEL_FLAGS_USER_PACKET_POOL) != 0) {
                     ^
dchannel.c:123:24: error: variable has incomplete type 'struct channel_fdinfo'
        struct channel_fdinfo ci;
                              ^
dchannel.c:123:9: note: forward declaration of 'struct channel_fdinfo'
        struct channel_fdinfo ci;
               ^
dchannel.c:131:31: error: use of undeclared identifier 'PROC_PIDFDCHANNELINFO'
        nb = proc_pidfdinfo(pid, fd, PROC_PIDFDCHANNELINFO, &ci, sizeof(ci));

如上们何,下面著手解決這些錯(cuò)誤惭婿,這些錯(cuò)誤都是類型和值未定義箕昭,其實(shí)可以通過逆向mac自帶lsof來還原彬呻,這里為了簡便衣陶,直接將dchannel.c這些發(fā)生錯(cuò)誤語句刪掉,最終dchannel.c中的代碼如下:

#include "lsof.h"
void process_channel(int pid, int32_t fd){}

再次執(zhí)行make

(cd lib; /Applications/Xcode.app/Contents/Developer/usr/bin/make DEBUG="-O" CFGF="-DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"")
make[1]: Nothing to be done for `all'.
Constructing version.h
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o usage.o usage.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o dchannel.o dchannel.c
cc  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o dnexus.o dnexus.c
cc -o lsof  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O ddev.o dfile.o dmnt.o dproc.o dsock.o dstore.o arg.o main.o misc.o node.o print.o proc.o store.o usage.o util.o dnetpolicy.o dchannel.o dnexus.o -L./lib -llsof  -lcurses

成功編譯lsof的x86_64版本废岂,可以直接在Mac上運(yùn)行祖搓。下面來編譯arm/arm64的版本make CC="$(xcrun --sdk iphoneos --find clang) -isysroot $(xcrun --sdk iphoneos --show-sdk-path) -arch armv7 -arch armv7s -arch arm64"得到如下結(jié)果:

(cd lib; /Applications/Xcode.app/Contents/Developer/usr/bin/make DEBUG="-O" CFGF="-DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"")
make[1]: Nothing to be done for `all'.
Constructing version.h
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk -arch armv7 -arch armv7s -arch arm64  -DHASIPv6 -mdynamic-no-pic -DHASUTMPX -DDARWINV=1600 -DHAS_STRFTIME -DLSOF_VSTR=\"16.7.0\"  -O   -c -o usage.o usage.c
In file included from usage.c:39:
In file included from ./lsof.h:213:
./dlsof.h:56:10: fatal error: 'netinet/tcp_fsm.h' file not found
#include <netinet/tcp_fsm.h>
         ^~~~~~~~~~~~~~~~~~~
1 error generated.
make: *** [usage.o] Error 1

該錯(cuò)誤是iphone對應(yīng)SDK /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/缺少頭文件導(dǎo)致,這些缺少的頭文件從/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include拷貝即可湖苞,這些文件包括:

netinet/tcp_fsm.h
rpc/pmap_prot.h
libproc.h
sys/proc_info.h
sys/kern_control.h
net/route.h

再次make此時(shí)編譯成功拯欧,執(zhí)行file命令:

lsof: Mach-O universal binary with 3 architectures: [arm_v7: Mach-O executable arm_v7] [arm_v7s: Mach-O executable arm_v7s] [arm64: Mach-O 64-bit executable arm64]
lsof (for architecture armv7):  Mach-O executable arm_v7
lsof (for architecture armv7s): Mach-O executable arm_v7s
lsof (for architecture arm64):  Mach-O 64-bit executable arm64

拷貝到越獄iphone上執(zhí)行,會(huì)出現(xiàn)killed: 9财骨,需要對lsof進(jìn)行簽名:
創(chuàng)建文件entitlement.xml

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
     <key>com.apple.springboard.debugapplications</key>
     <true/>
     <key>get-task-allow</key>
     <true/>
     <key>task_for_pid-allow</key>
     <true/>
     <key>run-unsigned-code</key>
     <true/>
</dict>
</plist>

執(zhí)行簽名:ldid -Sentitlement.xml lsof

此時(shí)再將lsof拷貝到越獄iphone上镐作,可以執(zhí)行了!

我自己用的放在git上https://github.com/lichao890427/codesegment/blob/master/lsof_10.x

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隆箩,一起剝皮案震驚了整個(gè)濱河市该贾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捌臊,老刑警劉巖杨蛋,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異理澎,居然都是意外死亡逞力,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門糠爬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寇荧,“玉大人,你說我怎么就攤上這事执隧】眨” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵镀琉,是天一觀的道長峦嗤。 經(jīng)常有香客問我,道長滚粟,這世上最難降的妖魔是什么寻仗? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮凡壤,結(jié)果婚禮上署尤,老公的妹妹穿的比我還像新娘戳表。我一直安慰自己肯污,他們只是感情好押蚤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布尊浓。 她就那樣靜靜地躺著止潘,像睡著了一般奔脐。 火紅的嫁衣襯著肌膚如雪躯舔。 梳的紋絲不亂的頭發(fā)上彭雾,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天滞谢,我揣著相機(jī)與錄音串稀,去河邊找鬼。 笑死狮杨,一個(gè)胖子當(dāng)著我的面吹牛母截,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播橄教,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼清寇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了护蝶?” 一聲冷哼從身側(cè)響起华烟,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎持灰,沒想到半個(gè)月后盔夜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堤魁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年喂链,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姨涡。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衩藤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涛漂,到底是詐尸還是另有隱情赏表,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布匈仗,位于F島的核電站瓢剿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悠轩。R本人自食惡果不足惜间狂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望火架。 院中可真熱鬧鉴象,春花似錦忙菠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淆游,卻和暖如春傍睹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犹菱。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工拾稳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腊脱。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓访得,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虑椎。 傳聞我的和親對象是個(gè)殘疾皇子震鹉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容