【JS 逆向百例】W店UA樟澜,OB反混淆,抓包替換CORS跨域錯(cuò)誤分析

聲明

本文章中所有內(nèi)容僅供學(xué)習(xí)交流掐场,抓包內(nèi)容往扔、敏感網(wǎng)址、數(shù)據(jù)接口均已做脫敏處理熊户,嚴(yán)禁用于商業(yè)用途和非法用途萍膛,否則由此產(chǎn)生的一切后果均與作者無關(guān),若有侵權(quán)嚷堡,請(qǐng)聯(lián)系我立即刪除蝗罗!

逆向目標(biāo)

  • 目標(biāo):W 店登錄接口 UA 參數(shù)加密艇棕,JS 代碼經(jīng)過了 OB 混淆
  • 主頁:aHR0cHM6Ly9kLndlaWRpYW4uY29tLw==
  • 接口:aHR0cHM6Ly9zc28xLndlaWRpYW4uY29tL3VzZXIvbG9naW4=
  • 逆向參數(shù):Form Data:ua: H4sIAAAAAAAAA91ViZUbMQhtiVOIcnRRxRafr%2FGuN5ukgoyfLUZC...

OB 混淆簡介

OB 混淆全稱 Obfuscator,Obfuscator 其實(shí)就是混淆的意思串塑,官網(wǎng):https://obfuscator.io/ 沼琉,其作者是一位叫 Timofey Kachalov 的俄羅斯 JavaScript 開發(fā)工程師,早在 2016 年就發(fā)布了第一個(gè)版本桩匪。

一段正常的代碼如下:

function hi() {
  console.log("Hello World!");
}
hi();

經(jīng)過 OB 混淆后的結(jié)果:

function _0x3f26() {
    var _0x2dad75 = ['5881925kTCKCP', 'Hello\x20World!', '600mDvfGa', '699564jYNxbu', '1083271cEvuvT', 'log', '18sKjcFY', '214857eMgFSU', '77856FUKcuE', '736425OzpdFI', '737172JqcGMg'];
    _0x3f26 = function () {
        return _0x2dad75;
    };
    return _0x3f26();
}

(function (_0x307c88, _0x4f8223) {
    var _0x32807d = _0x1fe9, _0x330c58 = _0x307c88();
    while (!![]) {
        try {
            var _0x5d6354 = parseInt(_0x32807d(0x6f)) / 0x1 + parseInt(_0x32807d(0x6e)) / 0x2 + parseInt(_0x32807d(0x70)) / 0x3 + -parseInt(_0x32807d(0x69)) / 0x4 + parseInt(_0x32807d(0x71)) / 0x5 + parseInt(_0x32807d(0x6c)) / 0x6 * (parseInt(_0x32807d(0x6a)) / 0x7) + -parseInt(_0x32807d(0x73)) / 0x8 * (parseInt(_0x32807d(0x6d)) / 0x9);
            if (_0x5d6354 === _0x4f8223) break; else _0x330c58['push'](_0x330c58['shift']());
        } catch (_0x3f18e4) {
            _0x330c58['push'](_0x330c58['shift']());
        }
    }
}(_0x3f26, 0xaa023));

function _0x1fe9(_0xa907e7, _0x410a46) {
    var _0x3f261f = _0x3f26();
    return _0x1fe9 = function (_0x1fe950, _0x5a08da) {
        _0x1fe950 = _0x1fe950 - 0x69;
        var _0x82a06 = _0x3f261f[_0x1fe950];
        return _0x82a06;
    }, _0x1fe9(_0xa907e7, _0x410a46);
}

function hi() {
    var _0x12a222 = _0x1fe9;
    console[_0x12a222(0x6b)](_0x12a222(0x72));
}

hi();

OB 混淆具有以下特征:

1打瘪、一般由一個(gè)大數(shù)組或者含有大數(shù)組的函數(shù)、一個(gè)自執(zhí)行函數(shù)傻昙、解密函數(shù)和加密后的函數(shù)四部分組成闺骚;

2、函數(shù)名和變量名通常以 _0x 或者 0x 開頭妆档,后接 1~6 位數(shù)字或字母組合僻爽;

3、自執(zhí)行函數(shù)贾惦,進(jìn)行移位操作胸梆,有明顯的 push、shift 關(guān)鍵字须板;

例如在上面的例子中碰镜,_0x3f26() 方法就定義了一個(gè)大數(shù)組,自執(zhí)行函數(shù)里有 push逼纸、shift 關(guān)鍵字洋措,主要是對(duì)大數(shù)組進(jìn)行移位操作,_0x1fe9() 就是解密函數(shù)杰刽,hi() 就是加密后的函數(shù)菠发。

抓包分析

點(diǎn)擊登陸抓包,可以看到有個(gè) ua 參數(shù)贺嫂,經(jīng)過了加密滓鸠,每次登陸是會(huì)改變的,如下圖所示:

01.png

如果直接搜索 ua 的話第喳,結(jié)果太多糜俗,不方便篩選,通過 XHR 斷點(diǎn)比較容易找到加密的位置曲饱,如下圖所示悠抹,最后提交的 r 參數(shù)包含 ua 值,往上找可以看到是 i 的值經(jīng)過了 URL 編碼扩淀,再往上看楔敌,i 的值通過 window.getUa() 獲取,這個(gè)實(shí)際上是 uad.js 里面的一個(gè)匿名函數(shù)驻谆。

02.png

跟進(jìn)到 uad.js卵凑,可以看到調(diào)用了 window[_0x4651('0x710')] 這個(gè)方法庆聘,最后返回的 _0x261229 就是加密后的 ua 值,用鼠標(biāo)把類似 _0x4651('0x710')勺卢、_0x4651('0x440') 的值選中伙判,可以看到實(shí)際上是一些字符串,這些字符串通過直接搜索黑忱,可以發(fā)現(xiàn)是在頭部的一個(gè)大數(shù)組里宴抚,如下圖所示:

03.png
04.png

混淆還原與替換

一個(gè)大數(shù)組,一個(gè)有明顯的 push杨何、shift 關(guān)鍵字的進(jìn)行移位操作的自執(zhí)行函數(shù)酱塔,是 OB 混淆無疑了,那么我們應(yīng)該怎樣去處理危虱,讓其看起來更順眼一些呢?

你可以手動(dòng)在瀏覽器選中查看值唐全,在本地去替換埃跷,當(dāng)然不用全部去替換,跟棧走邮利,用到的地方替換就行了弥雹,不要傻傻的全部去挨個(gè)手動(dòng)替換,這種方法適用于不太復(fù)雜的代碼延届。

如果遇到代碼很多的情況剪勿,建議使用反混淆工具去處理,這里推薦國內(nèi)的猿人學(xué)OB混淆專解工具和國外的 de4js方庭,猿人學(xué)的工具還原程度很高厕吉,但是部分 OB 混淆還原后運(yùn)行會(huì)報(bào)錯(cuò),實(shí)測本案例的 OB 混淆經(jīng)過猿人學(xué)的工具處理后就不能正常運(yùn)行械念,可能需要自己預(yù)先處理一下才行头朱,de4js 這個(gè)工具是越南的一個(gè)作者開發(fā)的,開源的龄减,你可以部署到自己的機(jī)器上项钮,它支持多種混淆還原,包括 Eval希停、OB烁巫、JSFuck、AA宠能、JJ 等亚隙,可以直接粘貼代碼,自動(dòng)識(shí)別混淆方式棍潘,本案例推薦使用 de4js恃鞋,如下圖所示:

05.png

我們將還原后的結(jié)果復(fù)制到本地文件崖媚,使用 Fiddler 的 Autoresponder 功能對(duì)響應(yīng)進(jìn)行替換,如下圖所示:

06.png

如果此時(shí)開啟抓包恤浪,刷新頁面畅哑,你會(huì)發(fā)現(xiàn)請(qǐng)求狀態(tài) status 顯示的是 CORS error,JS 替換不成功水由,在控制臺(tái)里還可以看到報(bào)錯(cuò) No 'Access-Control-Allow-Origin' header is present on the requested resource. 如下圖所示:

14.png

CORS 跨域錯(cuò)誤

CORS (Cross-Origin Resource Sharing荠呐,跨域資源共享)是一個(gè) W3C 標(biāo)準(zhǔn),該標(biāo)準(zhǔn)使用附加的 HTTP 頭來告訴瀏覽器砂客,允許運(yùn)行在一個(gè)源上的 Web 應(yīng)用訪問位于另一不同源的資源泥张。一個(gè)請(qǐng)求 URL 的協(xié)議、域名鞠值、端口三者之間任意與當(dāng)前頁面地址不同即為跨域媚创。常見的跨域問題就是瀏覽器提示在 A 域名下不可以訪問 B 域名的 API,有關(guān) CORS 的進(jìn)一步理解彤恶,可以參考 W3C CORS Enabled钞钙。

簡要流程如下:

1、消費(fèi)者發(fā)送一個(gè) Origin 報(bào)頭到提供者端:Origin: http://www.site.com声离;
2芒炼、提供者發(fā)送一個(gè) Access-Control-Allow-Origin 響應(yīng)報(bào)頭給消費(fèi)者,如果值為 * 或 Origin 對(duì)應(yīng)的站點(diǎn)术徊,則表示允許共享資源給消費(fèi)者本刽,如果值為 null 或者不存在,則表示不允許共享資源給消費(fèi)者赠涮;
3子寓、除了 Access-Control-Allow-Origin 以外,部分站點(diǎn)還有可能檢測 Access-Control-Allow-Credentials世囊,為 true 表示允許别瞭;
4、瀏覽器根據(jù)提供者的響應(yīng)報(bào)文判斷是否允許消費(fèi)者跨域訪問到提供者源株憾;

我們根據(jù)前面在控制臺(tái)的報(bào)錯(cuò)信息蝙寨,可以知道是響應(yīng)頭缺少 Access-Control-Allow-Origin 導(dǎo)致的,在 Fiddler 里面有兩種方法為響應(yīng)頭添加此參數(shù)嗤瞎,下面分別介紹一下:

第一種是利用 Fiddler 的 Filter 功能墙歪,在 Response Headers 里設(shè)置即可,分別填入 Access-Control-Allow-Origin 和允許的域名贝奇,如下圖所示:

15.png

第二種是修改 CustomRules.js 文件虹菲,依次選擇 Rules —> Customize Rules,在 static function OnBeforeResponse(oSession: Session) 模塊下增加以下代碼:

if(oSession.uriContains("要處理的 URL")){
    oSession.oResponse["Access-Control-Allow-Origin"] =  "允許的域名";
}
16.png

兩種方法二選一掉瞳,設(shè)置完畢后毕源,就可以成功替換了浪漠,刷新再次調(diào)試就可以看到是還原后的 JS 了,如下圖所示:

07.png

逆向分析

很明顯 window.getUa 是主要的加密函數(shù)霎褐,所以我們先來分析一下這個(gè)函數(shù):

window.getUa = function() {
    var _0x7dfc34 = new Date().getTime();
    if (_0x4a9622) {
        _0x2644f4();
    }
    _0x55b608();
    var _0x261229 = _0x1722c3(_0x2e98dd) + '|' + _0x1722c3(_0x420004) + '|' + _0x7dfc34.toString(0x10);
    _0x261229 = btoa(_0x570bef.gzip(_0x261229, {
        'to': 'string'
    }));
    return _0x261229;
};

_0x7dfc34 是時(shí)間戳址愿,接著一個(gè) if 判斷,我們可以鼠標(biāo)放到判斷里去看看冻璃,發(fā)現(xiàn)判斷的 _0x4a9622 是 false响谓,那么 _0x2644f4() 就不會(huì)被執(zhí)行,然后執(zhí)行了 _0x55b608() 方法省艳,_0x261229 的值娘纷,主要調(diào)用了 _0x1722c3() 方法得到的,前后依次傳入了 _0x2e98dd_0x420004跋炕,很明顯這兩個(gè)值比較關(guān)鍵赖晶,分別搜索一下,可以發(fā)現(xiàn):

_0x2e98dd 定義了一些 header枣购、瀏覽器的信息嬉探、屏幕信息、系統(tǒng)字體信息等棉圈,這些信息可以作為定值直接傳入,如下圖所示:

09.png
10.png

_0x420004 搜索有用的結(jié)果就是僅定義了一個(gè)空對(duì)象眷蜓,在控制臺(tái)輸出一下可以看到實(shí)際上包含了一些鍵盤分瘾、鼠標(biāo)點(diǎn)擊移動(dòng)的數(shù)據(jù),實(shí)際上經(jīng)過測試發(fā)現(xiàn)吁系, _0x420004 的值并不是強(qiáng)校驗(yàn)的德召,可以使用隨機(jī)數(shù)模擬生成,也可以直接復(fù)制一個(gè)定值汽纤。

11.png

_0x2e98dd_0x420004 這兩個(gè)參數(shù)都沒有進(jìn)行強(qiáng)校驗(yàn)上岗,完全可以以定值的方式傳入,這兩個(gè)值都是 JSON 格式蕴坪,我們可以直接在控制臺(tái)使用 copy 語句復(fù)制其值肴掷,或者使用 JSON.stringify() 語句輸出結(jié)果再手動(dòng)復(fù)制。

12.png

本地聯(lián)調(diào)

里面各個(gè)函數(shù)相互調(diào)用背传,比較多呆瞻,可以直接把整個(gè) JS copy 下來,我們注意到整個(gè)函數(shù)是一個(gè)自執(zhí)行函數(shù)径玖,在本地調(diào)用時(shí)痴脾,我們可以定義一個(gè)全局變量,然后在 window.getUa 函數(shù)里梳星,將 _0x261229 的值賦值給全局變量赞赖,也就相當(dāng)于導(dǎo)出值滚朵,最后取這個(gè)全局變量即可,還有一種方法就是不讓它自執(zhí)行前域,改寫成正常一般的函數(shù)辕近,然后調(diào)用 window.getUa 方法得到 ua 值。

首先我們把 _0x2e98dd_0x420004 的值在本地定義一下话侄,這里有個(gè)小細(xì)節(jié)亏推,需要把原 JS 代碼里這兩個(gè)值定義的地方注釋掉,防止起沖突年堆。

在本地調(diào)試時(shí)吞杭,會(huì)提示 windowlocation变丧、document 未定義芽狗,定義一下為空對(duì)象即可,然后又提示 attachEvent 未定義痒蓬,搜索一下童擎,是 _0x13cd5a 的一個(gè)原型對(duì)象,除了 attachEvent 以外攻晒,還有個(gè) addEventListener顾复,addEventListener() 方法用于向指定元素添加事件句柄,在 IE 中使用 attachEvent() 方法來實(shí)現(xiàn)鲁捏,我們?cè)?Google Chrome 里面埋下斷點(diǎn)調(diào)試一下芯砸,刷新頁面會(huì)直接進(jìn)入 addEventListener() 方法,其中的事件是 keydown给梅,即鍵盤按下假丧,就調(diào)用后面的 _0x5cec90 方法,輸出一下后面返回的 this动羽,實(shí)際上并沒有產(chǎn)生什么有用的值包帚,所以 _0x13cd5a.prototype.bind 方法我們可以直接將其注釋掉,實(shí)際測試也沒有影響运吓。

08.png

接著本地調(diào)試渴邦,又會(huì)提示 btoa 未定義,btoaatob 是 window 對(duì)象的兩個(gè)函數(shù)羽德,其中 btoa 是 binary to ascii几莽,用于將 binary 的數(shù)據(jù)用 ascii 碼表示,即 Base64 的編碼過程宅静,而 atob 則是 ascii to binary章蚣,用于將 ascii 碼解析成 binary 數(shù)據(jù),即 Base64 的解碼過程。

在 NodeJS 里纤垂,提供了一個(gè)稱為 Buffer 的本地模塊矾策,可用于執(zhí)行 Base64 編碼和解碼,這里不做詳細(xì)介紹峭沦,可自行百度贾虽,window.getUa 方法里的原 btoa 語句是這樣的:

_0x261229 = btoa(_0x570bef.gzip(_0x261229, {'to': 'string'}));

在 NodeJS 里,我們可以這樣寫:

_0x261229 = Buffer.from(_0x570bef.gzip(_0x261229, {'to': 'string'}), "latin1").toString('base64');

注意:Buffer.from() 傳入了一個(gè) latin1 參數(shù)吼鱼,這是由于 _0x570bef.gzip(_0x261229, {'to': 'string'}) 的結(jié)果是 Latin1(ISO-8859-1 的別名)編碼蓬豁,如果不傳,或者傳入其他參數(shù)菇肃,則最終結(jié)果可能和 btoa 方法得出的結(jié)果不一樣地粪!

自此,本地聯(lián)調(diào)完畢琐谤,就可以得到正確的 ua 值了蟆技!

完整代碼

GitHub 關(guān)注 K 哥爬蟲,持續(xù)分享爬蟲相關(guān)代碼斗忌!歡迎 star 质礼!https://github.com/kgepachong/

以下只演示部分關(guān)鍵代碼,不能直接運(yùn)行织阳! 完整代碼倉庫地址:https://github.com/kgepachong/crawler/

JavaScript 加密關(guān)鍵代碼架構(gòu)

var window = {};
var location = {};
var document = {};
var _0x5a577d = function () {}();
var _0xe26ae = function () {}();
var _0x3204b9 = function () {}();
var _0x3c7e70 = function () {}();
var _0x4a649b = function () {}();
var _0x21524f = function () {}();
var _0x2b0d61 = function () {}();
var _0x53634a = function () {}();
var _0x570bef = function () {}();
var _0xd05c32 = function (_0x5c6c0c) {};
window.CHLOROFP_STATUS = 'start';

// 此處省略 N 個(gè)函數(shù)

var _0x2e98dd = {
    // 對(duì)象具體的值已省略
    "basic": {},
    "header": {},
    "navigator": {},
    "screenData": {},
    "sysfonts": [],
    "geoAndISP": {},
    "browserType": {},
    "performanceTiming": {},
    "canvasFp": {},
    "visTime": [],
    "other": {}
}
var _0x420004 = {
    // 對(duì)象具體的值已省略
    "keypress": true,
    "scroll": true,
    "click": true,
    "mousemove": true,
    "mousemoveData": [],
    "keypressData": [],
    "mouseclickData": [],
    "wheelDeltaData": []
}

window.getUa = function () {
    var _0x7dfc34 = new Date().getTime();
    if (_0x4a9622) {
        _0x2644f4();
    }
    _0x55b608();
    var _0x261229 = _0x1722c3(_0x2e98dd) + '|' + _0x1722c3(_0x420004) + '|' + _0x7dfc34.toString(0x10);
    // _0x261229 = btoa(_0x570bef.gzip(_0x261229, {'to': 'string'}));
    _0x261229 = Buffer.from(_0x570bef.gzip(_0x261229, {'to': 'string'}), "latin1").toString('base64');
    return _0x261229;
};

// 測試輸出
// console.log(window.getUa())

Python 登錄關(guān)鍵代碼

# ==================================
# --*-- coding: utf-8 --*--
# @Time    : 2021-11-15
# @Author  : 微信公眾號(hào):K哥爬蟲
# @FileName: weidian_login.py
# @Software: PyCharm
# ==================================


import execjs
import requests
from urllib import parse


index_url = "脫敏處理眶蕉,完整代碼關(guān)注 GitHub:https://github.com/kgepachong/crawler"
login_url = "脫敏處理,完整代碼關(guān)注 GitHub:https://github.com/kgepachong/crawler"
UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36"
session = requests.session()


def get_encrypted_ua():
    with open('get_encrypted_ua.js', 'r', encoding='utf-8') as f:
        uad_js = f.read()
    ua = execjs.compile(uad_js).call('window.getUa')
    ua = parse.quote(ua)
    return ua


def get_wd_token():
    headers = {"User-Agent": UserAgent}
    response = session.get(url=index_url, headers=headers)
    wd_token = response.cookies.get_dict()["wdtoken"]
    return wd_token


def login(phone, password, ua, wd_token):
    headers = {
        "user-agent": UserAgent,
        "origin": "脫敏處理唧躲,完整代碼關(guān)注 GitHub:https://github.com/kgepachong/crawler",
        "referer": "脫敏處理妻坝,完整代碼關(guān)注 GitHub:https://github.com/kgepachong/crawler",
    }
    data = {
        "phone": phone,
        "countryCode": "86",
        "password": password,
        "version": "1",
        "subaccountId": "",
        "clientInfo": '{"clientType": 1}',
        "captcha_session": "",
        "captcha_answer": "",
        "vcode": "",
        "mediaVcode": "",
        "ua": ua,
        "scene": "PCLogin",
        "wdtoken": wd_token
    }
    response = session.post(url=login_url, headers=headers, data=data)
    print(response.json())


def main():
    phone = input("請(qǐng)輸入登錄手機(jī)號(hào): ")
    password = input("請(qǐng)輸入登錄密碼: ")
    ua = get_encrypted_ua()
    wd_token = get_wd_token()
    login(phone, password, ua, wd_token)


if __name__ == '__main__':
    main()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惊窖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厘贼,老刑警劉巖界酒,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嘴秸,居然都是意外死亡毁欣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門岳掐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凭疮,“玉大人,你說我怎么就攤上這事串述≈唇猓” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵纲酗,是天一觀的道長衰腌。 經(jīng)常有香客問我新蟆,道長,這世上最難降的妖魔是什么右蕊? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任琼稻,我火速辦了婚禮,結(jié)果婚禮上饶囚,老公的妹妹穿的比我還像新娘帕翻。我一直安慰自己,他們只是感情好萝风,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布嘀掸。 她就那樣靜靜地躺著,像睡著了一般闹丐。 火紅的嫁衣襯著肌膚如雪横殴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天卿拴,我揣著相機(jī)與錄音衫仑,去河邊找鬼。 笑死堕花,一個(gè)胖子當(dāng)著我的面吹牛文狱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缘挽,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瞄崇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了壕曼?” 一聲冷哼從身側(cè)響起苏研,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腮郊,沒想到半個(gè)月后摹蘑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轧飞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年衅鹿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片过咬。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡大渤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掸绞,到底是詐尸還是另有隱情泵三,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站切黔,受9級(jí)特大地震影響砸脊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纬霞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一凌埂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诗芜,春花似錦瞳抓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翠桦,卻和暖如春横蜒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背销凑。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工丛晌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斗幼。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓澎蛛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜕窿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谋逻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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