iOS反編譯-hook微信之艾特所有人

研究了一段時(shí)間反編譯逆向工程,只是略微了解了一些皮毛端朵,最近忙的事情太雜好芭,就簡單寫一下吧。
在文章開始之前,首先感謝"蒸米"大神,在烏云上的一些文章引領(lǐng)我進(jìn)入反編譯的,其次也感謝"east520" (http://www.reibang.com/p/189afbe3b429)
這篇文章給的一些方法和啟示.下面說一下我的一些做法,可能會(huì)有很多問題.

1.需求

眾所周知冲呢,在通常情況下舍败,微信只有是群主才能艾特所有人,發(fā)消息或者群公告敬拓,目前的需求就是非群主邻薯,也能艾特群里的所有人。

2.嘗試方法

1> 嘗試非群主編輯群公告乘凸,初步判定是微信發(fā)群公告是通過向微信發(fā)送一個(gè)網(wǎng)絡(luò)請(qǐng)求厕诡,然后由微信進(jìn)行通知(研究了一段,發(fā)現(xiàn)效果不是太好)
2>通過一一艾特群里每一個(gè)成員营勤,然后修改發(fā)送的內(nèi)容灵嫌,再調(diào)用微信的發(fā)消息方法進(jìn)行實(shí)現(xiàn)壹罚。

3.實(shí)現(xiàn)方法

1.首先要了解的微信一個(gè)很重要的類,<code>CMessageMgr</code>,看名字應(yīng)該是微信的一個(gè)消息管理的類,在<code>class-dump</code>微信頭文件之后,找到該類,然后看它的一些屬性和方法,下面這兩個(gè)方法大概就是微信發(fā)消息函數(shù)和消息處理函數(shù),我們要做的就是hook這兩個(gè)函數(shù),

Paste_Image.png

2.我在此處用的是通過<code>theos</code>來編寫hook,<code>theos</code>的一些安裝和使用方法,可以通過<code>iOS應(yīng)用逆向工程第2版</code>這本書來操作,使用方法已經(jīng)十分詳細(xì).

4.初始化工程

1.創(chuàng)建tweak工程
WechatIMG16.jpeg
2.打開目錄,會(huì)看見<code>makefile</code><code>control</code>

<code>Tweak.xm</code>三個(gè)文件.

2.1 makefile是指定工程用到的文件,框架,庫等信息.將整個(gè)過程自動(dòng)化,默認(rèn)的文件內(nèi)容
include theos/makefiles/common.mk

TWEAK_NAME = ioswechatselectall
ioswechatselectall_FILES = Tweak.xm // 包含的源文件,不包括頭文件

include $(THEOS_MAKE_PATH)/tweak.mk

after-install::                  // 安裝完成后殺死某個(gè)進(jìn)程,此處要hook微信,所以進(jìn)程是WeChat
    install.exec "killall -9 WeChat"

如果我們要導(dǎo)入frameork,需要添加下面的指令,后面要加的就是frameWork的名字

ioswechatselectall_FRAMEWORKS = UIKit CoreFoundation Foundation CoreGraphics QuartzCore Security

指定處理器架構(gòu)

ARCHS = armv7 arm64

指定SDK版本,最低7.0

TARGET = iphone:latest:7.0

可以設(shè)置安裝hook設(shè)備的ip地址 進(jìn)行安裝

THEOS_DEVICE_IP = 192.168.1.159

最終完整的makeFile文件為

THEOS_DEVICE_IP = 192.168.1.159
TARGET = iphone:latest:7.0
ARCHS = armv7 arm64

include theos/makefiles/common.mk

TWEAK_NAME = ioswechatselectall
ioswechatselectall_FILES = Tweak.xm
ioswechatselectall_FRAMEWORKS = UIKit CoreFoundation Foundation CoreGraphics QuartzCore Security

include $(THEOS_MAKE_PATH)/tweak.mk

after-install::
    install.exec "killall -9 WeChat"

2.2 control文件

control文件相比來說就比較簡單,記錄了deb包管理系統(tǒng)的所有的基本嘻嘻

Package: com.bykernel.selectall
Name: ioswechatselectall
Depends: mobilesubstrate,firmware(>=8.0) // 設(shè)置設(shè)備的最低版本號(hào)
Version: 1.0
Architecture: iphoneos-arm
Description: An awesome MobileSubstrate tweak!
Maintainer: tg
Author: tg
Section: Tweaks

2.3 Tweak.xm

通過theos創(chuàng)建的tweak工程,默認(rèn)源文件是Tweak.xm,x表示支持Logos語法只有x則標(biāo)識(shí)支持Logos和C語法,xm則標(biāo)識(shí)支持Logos和C/C++語法,與.m和.mm類似.

基本Logos語法,包含<code>%hook</code>,<code>%log</code>,<code>%orig</code>三個(gè)預(yù)處理指令
2.3.1
<code>%hook </code>指定要hook的class, 必須以end結(jié)尾
<code>%log</code>打印一些信息
<code>%orig</code>非常重要,使用在%hook內(nèi)部,執(zhí)行hook函數(shù)的原始代碼,如果不添加%orig,則原始函數(shù)不會(huì)得到執(zhí)行

4.編寫代碼

4.1先從一個(gè)簡單的hook代碼開始,

我們要做的是hook微信的收發(fā)消息函數(shù),在一開始,我已經(jīng)告訴大家微信收發(fā)消息函數(shù)是哪兩個(gè),現(xiàn)在我們就把他hook掉,看看他里面攜帶的一些參數(shù)

4.1.1Tweak.xm代碼


%hook CMessageMgr

- (void)AsyncOnAddMsg:(id)arg1 MsgWrap:(id )wrap{
    
    %orig;
    NSLog(@"AsyncOnAddMsg wrap ====== %@",wrap);
 
}

- (void)AddMsg:(id)arg1 MsgWrap:(id )wrap{
    %orig;
    NSLog(@"AddMsg wrap ====== %@",wrap);

}
%end

①然后通過 <code>make package install</code>方法,講hook注入,然后收發(fā)消息,查看終端打印結(jié)果

②當(dāng)我們發(fā)送一個(gè)普通文字消息時(shí),終端會(huì)打印

<Warning>: AsyncOnAddMsg wrap ====== {m_uiMesLocalID=7, m_ui64MesSvrID=0, m_nsFromUsr=wxi*r22~19, m_nsToUsr=tia*103~11, m_uiStatus=1, type=1, msgSource="(null)"} 

<Warning>: AddMsg wrap ====== {m_uiMesLocalID=7, m_ui64MesSvrID=0, m_nsFromUsr=wxi*r22~19, m_nsToUsr=tia*103~11, m_uiStatus=1, type=1, msgSource="(null)"} 

發(fā)送一個(gè)語音消息

<Warning>: AsyncOnAddMsg wrap ====== {m_uiMesLocalID=9, m_ui64MesSvrID=0, m_nsFromUsr=wxi*r22~19, m_nsToUsr=tia*103~11, m_uiStatus=1, type=34, msgSource=""} 
<Warning>: AddMsg wrap ====== {m_uiMesLocalID=9, m_ui64MesSvrID=0, m_nsFromUsr=wxi*r22~19, m_nsToUsr=tia*103~11, m_uiStatus=1, type=34, msgSource=""} 

可以初步判斷,type的類型,決定了發(fā)送消息的類型

③當(dāng)我們接收到一個(gè)普通文字消息時(shí),只會(huì)調(diào)用AsyncOnAddMsg方法.


Paste_Image.png
 AsyncOnAddMsg wrap ====== {m_uiMesLocalID=8, m_ui64MesSvrID=4596545622562551918, m_nsFromUsr=tia*103~11, m_nsToUsr=wxi*r22~19, m_uiStatus=3, type=1, msgSource=""} 

從里面可以得到一些基本的信息,<code>m_nsFromUsr</code>,<code>m_nsToUsr</code>,<code>m_uiStatus</code>,<code>type</code>

4.1.2 嘗試在群里艾特一個(gè)好友,然后看看打印結(jié)果是什么

<Warning>:AsyncOnAddMsg wrap ====== {m_uiMesLocalID=2, m_ui64MesSvrID=0, m_nsFromUsr=wxi*r22~19, m_nsToUsr=1234567890@chatroom, m_uiStatus=1, type=1, msgSource="<msgsource><atuserlist>weixinzhanghao</atuserlist></msgsource>"} 

<Warning>:AddMsg wrap ====== {m_uiMesLocalID=2, m_ui64MesSvrID=0, m_nsFromUsr=wxi*r22~19, m_nsToUsr=1234567890@chatroom, m_uiStatus=1, type=1, msgSource="<msgsource><atuserlist>weixinzhanghao</atuserlist></msgsource>"} 

會(huì)發(fā)現(xiàn),<code>m_nsToUsr</code>這個(gè)屬性的不再是一個(gè)人的id,而是<code>由一串?dāng)?shù)字+@+chatroom</code>組成的一個(gè)房間號(hào),暫且稱它為群號(hào),type的類型還是1,文本類型,而最后的<code>msgSource</code>也不再是一個(gè)空值,而是<code>"<msgsource><atuserlist>weixinzhanghao</atuserlist></msgsource>"</code>,類似于xml格式的一個(gè)字符串在<atuserlist></atuserlist>標(biāo)簽里的就是你要艾特好友的微信帳號(hào).

4.1.3 那么如何才能拿到群里,其他人的這個(gè)微信帳號(hào)呢?再次感謝http://www.reibang.com/p/189afbe3b429 這篇文章的作者,和蒸米大神,從他們的文章和代碼里,知道了微信另外一個(gè)很重要的類<code>CContactMgr</code>,看名字應(yīng)該是聯(lián)系人的管理類,在微信頭文件里可以看到,他的一些屬性和方法,

Paste_Image.png

獲取自己contant屬性然后再去查找有沒有<code>CContact</code>這個(gè)類,

Paste_Image.png

,再去看他里面的屬性和方法,

Paste_Image.png

通過<code>+ (id)getChatRoomMemberWithoutMyself:(id)arg1;</code>這個(gè)方法,可以獲取到處自己以外的所有群成員,后面要傳的參數(shù)就是前面提到的<code>1234567890@chatroom</code>微信群號(hào).得到一個(gè)數(shù)組,數(shù)組里面的值就是除你以外的所有群成員.

4.2 創(chuàng)建一個(gè).h文件,將需要的一些微信的類的頭文件導(dǎo)入,以求編譯通過,這里就不再太多描述.

通過打印wrap的class ,可以得知它是CMessageWrap類型,里面的一些屬性有
都是我們剛才打印得到的信息.而m_nsContent應(yīng)該就是發(fā)送消息的內(nèi)容,可以通過打印得到


Paste_Image.png
wrap ====== CMessageWrap

4.3 現(xiàn)在大概的了解的內(nèi)容就做完了,然后開始編寫代碼,我們需要自己定義一個(gè)格式,來規(guī)范在輸入什么時(shí)進(jìn)行艾特所有人操作,此刻我們定義的一個(gè)格式是以 <code>!all</code> 開頭.

在<code>- (void)AddMsg:(id)arg1 MsgWrap:(CMessageWrap *)wrap</code>里,加入hook
4.3.1 首先我們要拿到當(dāng)前我們自身的CContact,
4.3.2 然后判斷wrap的消息類型type是否為1,也就是文本消息類型,如果是
4.3.3 判斷CMessageWrap的fromUsr是不是selfContact的m_nsUsrName
4.3.4 判斷toUsr的是否以@chatroom結(jié)尾,也就是判斷是否為群聊天
4.3.5 判斷wrap.m_nsMsgSource是否為nil,前面打印過,在正常發(fā)普通文本消息的時(shí)候m_nsMsgSource是空的.
4.3.6 通過<code>[wrap.m_nsContent hasPrefix:@"!all"]</code>判斷是否為約定的格式

如果以上幾個(gè)條件都滿足,那么可以再進(jìn)行我們的hook操作.

4.4 修改wrap的格式內(nèi)容

4.4.1 通過上面說過的getChatRoomMemberWithoutMyself方法得到群里除自己以外的所有人,遍歷數(shù)組,取出數(shù)組每個(gè)屬性(CContact)的m_nsUsrName值,拼接成一個(gè)字符串.
4.4.2 修改wrap.m_nsContent 的內(nèi)容,我們不希望被別人看到我們約定的艾特所有人格式,所以通過<code>subStringFromIndex</code>方法, 去掉前綴,取后面的內(nèi)容作為wrap.m_nsContent 的內(nèi)容
4.4.3 最重要的設(shè)置m_nsMsgSource為<code>[NSString stringWithFormat:@"<msgsource><atuserlist>%@</atuserlist></msgsource>",sourceString];</code>sourceString就是拼接好的字符串,

4.5 將以上內(nèi)容修改好后,然后在函數(shù)的結(jié)尾調(diào)用<code>%orig</code>也就是調(diào)用原始函數(shù),由于經(jīng)過我們hook,我們發(fā)的帶格式的消息的m_nsMsgSource已經(jīng)附有新值,微信就會(huì)以為我們艾特每個(gè)好友,從而實(shí)現(xiàn)艾特所有人的功能.

5.實(shí)現(xiàn)效果

1.我不是測試11的群主,我也沒有辦法艾特所有人

Paste_Image.png

2.按照格式輸入測試之后,就會(huì)實(shí)現(xiàn)艾特所有人的功能

Paste_Image.png

3.其他成員收到的信息

Paste_Image.png
Paste_Image.png

應(yīng)很多人要求把代碼貼一下,很久以前的東西了寿羞,不知道現(xiàn)在是否能繼續(xù)使用

#import <UIKit/UIKit.h>
#import "WeChatRedEnvelop.h"
#import <Foundation/Foundation.h>




%hook NewMainFrameViewController
- (void)viewDidLoad
{
    %orig;
    
    UIButton *transparentButton = [UIButton buttonWithType:UIButtonTypeCustom];
    transparentButton.frame = CGRectMake(0, 64, 44, 44);
    transparentButton.layer.cornerRadius = 8;
    transparentButton.clipsToBounds = YES;
    transparentButton.backgroundColor = [UIColor blueColor];
    [transparentButton addTarget:self action:@selector(clickImage) forControlEvents:UIControlEventTouchUpInside];
    [((UIViewController *)self).view addSubview:transparentButton];
}
%new
- (void)clickImage{
    
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"請(qǐng)輸入文本" message:@"" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定",nil];
    [alert setAlertViewStyle:UIAlertViewStylePlainTextInput];
    [alert show];

}


%new
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if(buttonIndex == 1){
        
        UITextField *field = [alertView textFieldAtIndex:0];
        NSLog(@"txt ====  %@",field.text);
        
        NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
        NSString *plistPath =  [path stringByAppendingPathComponent:@"data.plist"];
        
        NSMutableArray *roomArray = [NSMutableArray arrayWithContentsOfFile:plistPath];
        NSLog(@"roomArray ===== %@",roomArray);
        
        
        CMessageMgr *messager = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("CMessageMgr") class]];
        CMessageWrap *wrap = [[%c(CMessageWrap) alloc] initWithMsgType:1];
        
        //
        for(NSString *roomID in roomArray){
            
            
            NSLog(@"順序測試-----%@",roomID);
            //
            NSTimeInterval time = [[NSDate date] timeIntervalSince1970];
            long long int date = (long long int)time;
            
            
            NSString *name =[%c(SettingUtil) getLocalUsrName:0];
            wrap.m_nsFromUsr = name;
            wrap.m_nsContent = [NSString stringWithFormat:@"#所有人 %@",field.text];
            wrap.m_nsToUsr = roomID;
            wrap.m_uiCreateTime = date;
            wrap.m_uiStatus = 1;
            wrap.m_nsMsgSource = nil;
            [messager AddMsg:roomID  MsgWrap:wrap];
            
            
        }
    }

}

%end


%hook CMessageMgr

- (void)AsyncOnAddMsg:(id)arg1 MsgWrap:(CMessageWrap *)wrap{
  
    NSLog(@"接收到消息%@",wrap);
    NSString *fromUser = wrap.m_nsFromUsr ;
    if ([fromUser  hasSuffix:@"@chatroom"])
    {
        NSLog(@"chatroom found");
      
        NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
        NSString *plistPath =  [path stringByAppendingPathComponent:@"data.plist"];
        NSMutableArray *arrayM = [NSMutableArray array];
        NSArray *storArray = [NSArray arrayWithContentsOfFile:plistPath];
        [arrayM addObjectsFromArray:storArray];
        
        if (![arrayM containsObject:fromUser]){
            
            [arrayM addObject:fromUser];
            NSLog(@"存儲(chǔ)數(shù)據(jù)");
            NSLog(@"arrayM ==== %@",arrayM);
            [arrayM writeToFile:plistPath atomically:YES];
        }

                          
    }
      %orig;
}

- (void)AddMsg:(id)arg1 MsgWrap:(CMessageWrap *)wrap{
    
    NSLog(@"time ===%ld",(unsigned long)wrap.m_uiCreateTime);
    
    
    
    int type = wrap.m_uiMessageType;
    NSString *knFromUser = wrap.m_nsFromUsr;
    NSString *knToUsr = wrap.m_nsToUsr;
    NSString *knContent = wrap.m_nsContent;
    NSString *knSource = wrap.m_nsMsgSource;
    NSString *message = [NSString stringWithFormat:@"type=%d--knFromUser=%@--knToUsr=%@--knContent=%@--knSource=%@",type,knFromUser,knToUsr,knContent,knSource];
    
    CContactMgr *contactManager = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("CContactMgr") class]];
    CContact *selfContact = [contactManager getSelfContact];
    

    
    NSLog(@"message =======  %@",message);
    if (type == 1){
        
        if ([knFromUser isEqualToString:selfContact.m_nsUsrName]) {
            
            if ([knToUsr hasSuffix:@"@chatroom"])
            {
                NSLog(@"selfContact ==== %@",selfContact);
                if( knSource == nil){
                    NSString *aaa = [selfContact.m_nsUsrName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
                    NSLog(@"length=%lu,%@",(unsigned long)aaa.length,aaa);
                    NSArray *result = (NSArray *)[objc_getClass("CContact") getChatRoomMemberWithoutMyself:knToUsr];
                    
                    
                    
                    if ([knContent hasPrefix:@"#所有人"]){ // 前綴要求
                        NSString *subStr = [knContent substringFromIndex:4];
                        
                        
                        NSMutableString *string = [NSMutableString string];
                        [result enumerateObjectsUsingBlock:^(CContact *obj, NSUInteger idx, BOOL * _Nonnull stop) {
                            
                            [string appendFormat:@",%@",obj.m_nsUsrName];
                        }];
                        
                        
                        NSString *sourceString = [string substringFromIndex:1];
                        wrap.m_uiStatus = 3;
                        wrap.m_nsContent = subStr;
                        wrap.m_nsMsgSource = [NSString stringWithFormat:@"<msgsource><atuserlist>%@</atuserlist></msgsource>",sourceString];

                        
                        int type2 = wrap.m_uiMessageType;
                        NSString *knFromUser2 = wrap.m_nsFromUsr;
                        NSString *knToUsr2 = wrap.m_nsToUsr;
                        NSString *knContent2 = wrap.m_nsContent;
                        NSString *knSource2 = wrap.m_nsMsgSource;
                        NSString *message2 = [NSString stringWithFormat:@"type=%d--knFromUser=%@--knToUsr=%@--knContent=%@--knSource=%@",type2,knFromUser2,knToUsr2,knContent2,knSource2];
                        
                          NSLog(@"message2 =======  %@",message2);
                    }
                    
                }
                //
                //
                
                //                }
                
                
            }
            
        }
    }
    NSLog(@"wrap =====  %@,=====%@",wrap.m_nsContent,wrap);
    %orig;
    //    NSString *userName = wrap.m_nsUsrName;
    
    
}
%end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末猖凛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绪穆,更是在濱河造成了極大的恐慌辨泳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玖院,死亡現(xiàn)場離奇詭異菠红,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)司恳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門途乃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扔傅,你說我怎么就攤上這事耍共。” “怎么了猎塞?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵试读,是天一觀的道長。 經(jīng)常有香客問我荠耽,道長钩骇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任铝量,我火速辦了婚禮倘屹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘慢叨。我一直安慰自己纽匙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布拍谐。 她就那樣靜靜地躺著烛缔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轩拨。 梳的紋絲不亂的頭發(fā)上践瓷,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音亡蓉,去河邊找鬼晕翠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛寸宵,可吹牛的內(nèi)容都是我干的崖面。 我是一名探鬼主播元咙,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼巫员!你這毒婦竟也來了庶香?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤简识,失蹤者是張志新(化名)和其女友劉穎赶掖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體七扰,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奢赂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颈走。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膳灶。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖立由,靈堂內(nèi)的尸體忽然破棺而出轧钓,到底是詐尸還是另有隱情,我是刑警寧澤锐膜,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布毕箍,位于F島的核電站,受9級(jí)特大地震影響道盏,放射性物質(zhì)發(fā)生泄漏而柑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一荷逞、第九天 我趴在偏房一處隱蔽的房頂上張望媒咳。 院中可真熱鬧,春花似錦种远、人聲如沸伟葫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谭胚,卻和暖如春掐禁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辉浦。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工弄抬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宪郊。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓掂恕,卻偏偏與公主長得像拖陆,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子懊亡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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