爬蟲-Webpack逆向?qū)崙?zhàn)

全文目錄

webpack打包是前端js模塊化壓縮打包常用的手段菲宴,特征明顯,比如下方的形式的代碼就是webpack分發(fā)器

// 分發(fā)器
!function(x){
    function xx(n){
        return ..call(**.exports, ***, ***.exports, xx)
    }
}()

又或者更直觀的表現(xiàn)n["xxx"]這種速和,你可以大概知道了這是調(diào)用了webpack打包的js模塊代碼洲愤。

webpack打包后JS依賴模塊代碼的固定結(jié)構(gòu)

(this["webpackJsonpzsgk-pc"] = this["webpackJsonpzsgk-pc"] || []).push([[15], [function(e, t, n) {
    "use strict";
    e.exports = n(693)
}
// 參數(shù)固定為e, t, n
, function(e, t, n) {
    e.exports = n(697)()
}

說個(gè)逆向webpack的通用方法:

  1. 先去找加密網(wǎng)站的加密入口蚂斤。這應(yīng)該是加密網(wǎng)站都必須要做的==> 直接根據(jù)參數(shù)名搜索參數(shù)

  2. 找到分發(fā)器的位置茬贵,或者說是加載器,n["xxx"]這種的n就是分發(fā)器姥饰,就比如下方中的exports的位置,最后執(zhí)行了d函數(shù)==>一般是runtimexxx.js中(提供環(huán)境)描焰;一般以! function(e) {的形式出現(xiàn)

分發(fā)器.jpg
  1. 尋找分發(fā)編號(hào)媳否、加密使用模塊(用到了哪些模塊就導(dǎo)入哪些模塊)==>一般在chunk-lib.js栅螟,以(window.webpackJsonp = window.webpackJsonp || []).push([的形式出現(xiàn)

  2. 將函數(shù)入口的地方返回全局變量荆秦,最終返回: var sign; var window = global;!function(){... sign = d}, 賦值為分發(fā)器返回的d

  3. 使用自定義的sign代替webpack代碼中的n進(jìn)行加密

from: https://blog.csdn.net/weixin_41586984/article/details/116268341

調(diào)試技巧

定位請(qǐng)求參數(shù)

  1. 打開開發(fā)者工具后力图,F(xiàn)5刷新后Ctrl + Shift + F搜索參數(shù)名步绸,如signdata,會(huì)顯示多個(gè)JS文件吃媒,選擇后仔細(xì)查看(點(diǎn)擊左下角{}美觀格式化按鈕)瓤介。

    more: 如果文件太多,則直接通過請(qǐng)求的鏈接去找赘那,比如user/login

  2. Network找到新發(fā)出的xhr條目后刑桑,查看Initiator里的調(diào)用棧信息,如Login募舟;

注: 如果加密參數(shù)名稱比較簡單如s祠斧,比較難定位的話,可以借助請(qǐng)求的其他參數(shù)來查找拱礁,比如verificationCode

調(diào)試工具

  • 斷點(diǎn)調(diào)試breakpoints
  • XHR斷點(diǎn): XHR/fetch breakpoints

附錄-Js記錄

  • 時(shí)間戳: (new Date).getTime()

  • var a = (f1(), f2(), f3())后琢锋,f1辕漂、f2、f3函數(shù)都會(huì)執(zhí)行吴超,而a最后的結(jié)果為f3的返回值

  • javascript:void(0): void 是 JavaScript 中非常重要的關(guān)鍵字钉嘹,該操作符指定要計(jì)算一個(gè)表達(dá)式但是不返回值。

  • TypeError: window.btoa is not a function

    btoa-atob 模塊沒有輸出一個(gè)編程接口鲸阻,它只提供命令行工具跋涣。

    如果你需要轉(zhuǎn)換為Base64,你可以用Buffer來完成赘娄。

    console.log(Buffer.from('Hello World!').toString('base64'));
    

    相反的仆潮,假設(shè)你要解碼的內(nèi)容是一個(gè)base64編碼過的字符串。

    console.log(Buffer.from(b64Encoded, 'base64').toString());
    

做題記錄

n["str"]題型:

天安財(cái)險(xiǎn)

var m = this.newEncrypt(JSON.stringify(h));

  • 需要對(duì)this.privaKey的值細(xì)化下遣臼,傳入拿到固定的str

    //           , p = t("NFKh")          , s = t("cg2h")
    l.prototype.newEncrypt = function(l) {
                    var n = p.enc.Utf8.parse(this.privaKey)
                      , t = p.enc.Utf8.parse(this.privaKey)
                      , e = p.enc.Utf8.parse(l)
                      , a = p.AES.encrypt(e, n, {
                        iv: t,
                        mode: p.mode.CBC,
                        padding: p.pad.Pkcs7
                    });
                    return p.enc.Base64.stringify(a.ciphertext)
                }
    

財(cái)新網(wǎng)

password: this.encode(this.encrypt(this.form.password)),

  • c = a("3452")性置、n = a.n(c),看到需要依賴3452后立馬Ctrl+shift+F全局搜3452揍堰,然后把整個(gè)webpack模塊扒下來

中遠(yuǎn)海運(yùn)

  • n("MuMZ")中又有r = n("XBrZ");鹏浅,在另一個(gè)文件中,module需要放兩個(gè)

天翼云

var t = encodeURIComponent(c["c"].Des.encrypt(this.form.email, this.form.pwd)),

webpack實(shí)現(xiàn)

c = (mycode("ac6a"), mycode("b3ae"))

  • 分發(fā)器和ac6a模塊在同一個(gè)文件中屏歹、而ac6a模塊依賴模塊在另一個(gè)文件內(nèi)隐砸;
  • 分發(fā)器()({}),無感嘆號(hào)
  • 分發(fā)器()({})大括號(hào)中自帶較多依賴模塊

自己實(shí)現(xiàn):直接扒下來encrypt加密的JS內(nèi)容

看準(zhǔn)網(wǎng)

企名片

  • u = i("x4Ab")
  • return e.encrypt_data && (e.data = Object(u.a)(e.encrypt_data)),
  • x4Ab模塊依賴aqBw幽纷,aqBw又依賴YuTi式塌、yLpj,因此依賴項(xiàng)中放"x4Ab"友浸、"aqBw"峰尝、"YuTi"、"yLpj"函數(shù)定義

  • 模擬解析函數(shù)

     function encrypt(data){
         return data && (Object(u.a)(data))
     }
    

n[num]題型:

大麥

  • 刪除分發(fā)器多余代碼
  • var navigator = {}

掌上高考

  1. 分發(fā)器在html文件內(nèi)
  2. o = (u=a(42), a.n(u))收恢,使用到了a.n(u)即點(diǎn)n函數(shù)
  3. 依賴函數(shù)的給出是以數(shù)組的形式武学,而不是字典的形式
  4. 模塊中依賴更多模塊==>引入整個(gè)模塊文件,但是跟"xxx"模式不同的是伦意,由于沒有用字典{"xxx": function()}的形式火窒,因此直接require也沒用TypeError: Cannot read property '42' of undefined,而是將依賴模塊數(shù)組作為參數(shù)寫入到分發(fā)器依賴函數(shù)中!function(e){}([...])即方括號(hào)中驮肉,從而才能找到42函數(shù)

酷我

t.data.reqId = n,

  • 直接通過n(109)定位可能不那么準(zhǔn)確(雙擊后定位的函數(shù))熏矿,可以試著直接在分發(fā)器位置進(jìn)行斷點(diǎn),然后console輸出e["109"]

  • 只要分發(fā)器定義部分(其他的刪了,因?yàn)橹挥昧?code>l=n(109)曲掰、c=n.n(l))+依賴模塊中定義109函數(shù)(整個(gè)function而不是t.exports)疾捍,以及觀察其中還依賴什么如n(202)、n(203)就補(bǔ)充拿什么

    // 如果不刪分發(fā)器中其他部分
    l = mycode(109)
    c = mycode.n(l)   // ==>得到l
    var r = c()();
    console.log(r)
    
    // 由于只用到了n.n(l)栏妖,所以可以刪分發(fā)器大代碼中其他部分, 在使用時(shí)直接讓c=l
    l = mycode(109)
    c = l();
    console.log(c)    // 等價(jià)于 r = l(); console(r)
    
    

文章: https://blog.csdn.net/weixin_43189702/article/details/119860838

注意:

  • require模塊內(nèi)容可以放在逆向JS文件里一起乱豆,而不是一定得創(chuàng)建新的JS文件導(dǎo)入

  • 先登錄然后找到加密處加斷點(diǎn),這個(gè)斷點(diǎn)會(huì)在發(fā)起登錄請(qǐng)求時(shí)才觸發(fā)吊趾;往上找分發(fā)器宛裕,加上斷點(diǎn),分發(fā)器位置的斷點(diǎn)是在頁面刷新時(shí)觸發(fā)论泛,因此要觸發(fā)這個(gè)斷點(diǎn)需要刷新頁面

  • 找加密函數(shù)c["c"].Des.encrypt(this.form.email, this.form.pwd)的時(shí)候揩尸,找完整的函數(shù)如c["c"].Des.encrypt,而不是直接找c

  • n(42), 或者n("xxx")屁奏,可以直接搜xxx岩榆,也可以在console里面輸出后找到對(duì)應(yīng)的FunctionLocation來快速定位

  • 如果依賴模塊是字典的形式,則分發(fā)器依賴中寫字典坟瓢,如!function(e){..}({ 32:function(){...}})(一般情況n(32)勇边、n("ABCD")), 如果不是則需要傳函數(shù)數(shù)組折联,如n(42)粒褒,此處42表示的是第42個(gè)函數(shù),見掌上高考诚镰。

  • var mycode;后賦值的位置直接在分發(fā)器的下方即可奕坟,不用在最后面

  • 提示缺少window時(shí),定義全局變量var window = global;清笨,(JS逆向文件月杉、依賴文件)

    • window表示瀏覽器打開的窗口,在客戶端JavaScript中window對(duì)象是全局的對(duì)象函筋,所有 JavaScript 全局對(duì)象沙合、函數(shù)以及變量均自動(dòng)成為 window 對(duì)象的成員奠伪。但在nodejs中直接調(diào)用window是不存在的跌帐,而代替的是global,所以要用nodejs運(yùn)行時(shí)绊率,得用var window = global;

    • var navigator = this等價(jià)于var navigator = {}谨敛,因?yàn)樵贜odeJS文件中運(yùn)行輸出this后可以發(fā)現(xiàn)this={},而在瀏覽器中this默認(rèn)為window(函數(shù)或類作用域內(nèi)為函數(shù)或者類實(shí)例)

    • from:JS中document和window的區(qū)別

心得

①所有webpack打包的的js都要先看懂打包后代碼運(yùn)行的順序滤否,找到加密處脸狸;②找到webpack對(duì)象,一般是 n(數(shù)字) 調(diào)用③確定分發(fā)器。④找依賴模塊炊甲,有時(shí)候各包的依賴關(guān)系太多泥彤,可以直接把文件爬下來引入,如果各個(gè)包的依賴關(guān)系不多卿啡,就可以只把調(diào)用到的函數(shù)找出來放到依賴中吟吝。⑤最后剩下的就是找到你要的代碼,慢慢復(fù)現(xiàn)調(diào)用加密/解密函數(shù)就好了颈娜。

做題案例學(xué)習(xí)視頻

進(jìn)階資料

掌上高考解密過程

解析響應(yīng)data.text

相應(yīng)的data.text是加密的,頁面通過JS解密后渲染

  1. 確定加密位置

    return null != l && null !== (a = l.data) && void 0 !== a && a.text && (l.data = (n = (e = {
                iv: u.uri,
                text: l.data.text,
                SIGN: h
            }).iv,
    
  2. 確定分發(fā)器位置俗批,在html內(nèi)

    通過打斷o = (u=a(42), a.n(u)) // 等價(jià)于 o = a(42)

  3. 確定依賴模塊:給return e[a].call(c.exports, c, c.exports, r),打斷點(diǎn)后console輸出e["42"]查看a(42)位置:

function(e, t, n) {
    e.exports = (e = n(21),
    n(201),
    n(825),
    ...
    n(847), 
    e)
}

可以看到需要依賴多個(gè)鳖轰,因此直接把整個(gè)文件引入

  1. 扣解密函數(shù):注意return表達(dá)式后是逗號(hào)的情況:會(huì)從左到右執(zhí)行執(zhí)行,并返回最后一個(gè)扶镀。注意:JS函數(shù)并不能返回多個(gè)返回值
then((function(l) {
var e, a, t, b, n;
return null != l && null !== (a = l.data) && void 0 !== a && a.text && (l.data = (n = (e = {
            iv: u.uri,
            text: l.data.text,
            SIGN: h
        }).iv,
        a = e.text,
        e = e.SIGN,
        e = o.a.PBKDF2(e, "secret", {
            keySize: 8,
            iterations: 1e3,
            hasher: o.a.algo.SHA256
        }).toString(),
        n = o.a.PBKDF2(n, "secret", {
            keySize: 4,
            iterations: 1e3,
            hasher: o.a.algo.SHA256
        }).toString(),
        a = o.a.lib.CipherParams.create({
            ciphertext: o.a.enc.Hex.parse(a)
        }),
        n = o.a.AES.decrypt(a, o.a.enc.Hex.parse(e), {
            iv: o.a.enc.Hex.parse(n)
        }),
        // data.text解析結(jié)果
        JSON.parse(n.toString(o.a.enc.Utf8)))),
    v && (t = r,
        b = l,
        null !== (n = window.apiConfig) && void 0 !== n && null !== (n = n.filterCacheList) && void 0 !== n && n.length ? window.apiConfig.filterCacheList.forEach((function(l) {
            new RegExp(l).test(t) || d.set(t, b)
        })) : d.set(t, b)),
    l
}

難點(diǎn):

  • 跟"xxx"模式不同的是蕴侣,由于沒有用字典{"xxx": function()}的形式,因此直接require也沒用TypeError: Cannot read property '42' of undefined臭觉,而是將依賴模塊函數(shù)數(shù)組作為參數(shù)寫入到分發(fā)器依賴函數(shù)中!function(e){}([...])即方括號(hào)中昆雀,從而才能找到42函數(shù)

    • 挑選push后第二個(gè)[]中的函數(shù)數(shù)組

      (this["webpackJsonpzsgk-pc"] = this["webpackJsonpzsgk-pc"] || []).push([[15], [function(e, t, n) {
          "use strict";
          e.exports = n(693)
      },
        ...
        }
      ]]);    // 第一個(gè)]
      
  • 理解了a.n的含義后,可以直接把o = (u=a(42), a.n(u))轉(zhuǎn)化為o=a(42)

獲得加密參數(shù)signsafe

大致流程跟data.text差不多蝠筑,但是p = c()(g)執(zhí)行時(shí)狞膘,會(huì)報(bào)錯(cuò)

Md5.prototype.update = function(e) {
    if (!this.finalized) {
        var t, n = typeof e;
        if ("string" != n) {
            if ("object" != n)
                throw ERROR;
            if (null === e)

根據(jù)一步步調(diào)試之后發(fā)現(xiàn),還是c = (u=a(291),a.n(u))直接替換出的問題

  1. Ctrl + shift + F定位參數(shù)

    g = void 0,
        g = (t = {
        SIGN: h,
        str: f.replace(/^\/|https?:\/\/\/?/, "")
    }).SIGN,
        t = t.str,
        g = o.a.HmacSHA1(o.a.enc.Utf8.parse(t), g),
        g = o.a.enc.Base64.stringify(g).toString(),
        p = c()(g),
        u.signsafe = p,
    
  2. 往上找c和o.a: o = (u = a(42),a.n(u)), c = (u = a(291),a.n(u))

  3. 找到分發(fā)器扣出==>這次不能刪除分發(fā)器中多余的函數(shù)什乙,比如r.a挽封、r.d、r.n因?yàn)楹竺娴糜?/p>

  4. 將依賴模塊跟data.text一樣臣镣,放入分發(fā)器依賴模塊中

  5. 扣加密函數(shù)

    網(wǎng)頁上是return后多段內(nèi)容辅愿,以及g變量不斷被修改,因此通過一步步調(diào)試確定入?yún)⒁淠常约胺纸鈘eturn抽離出真正的加密參數(shù)signsafe

    h = "D23ABC@#56"
    var o = {}
    
    o.a = mycode(42)
    // ▲
    c = (u = mycode(291), mycode.n(u))
    
    /**
     * 對(duì)url進(jìn)行加密
     */
    function encrypt(f) {
        g = (t = {
                SIGN: h,
                str: f.replace(/^\/|https?:\/\/\/?/, "")
            }).SIGN,
            t = t.str;
        // console.log(t, g);
        g = o.a.HmacSHA1(o.a.enc.Utf8.parse(t), g);
        // console.log(g)
        g = o.a.enc.Base64.stringify(g).toString();
        // console.log(g)
        p = c()(g);
        return p;
    }
    
    res = encrypt("https://api.eol.cn/web/api/counter?cid=1&did=263")
    console.log(res)
    

可以看到o.a和c的賦值是不一樣的点待,雖然說大多數(shù)情況x = a.n(u)等價(jià)于x=u,但難免有時(shí)會(huì)有不一樣弃舒,因此謹(jǐn)慎期間癞埠,還是還原到底最好状原。

Python調(diào)用

import execjs
def get_signsafe_by_javascript(url):
    # 兩個(gè) JavaScript 腳本,兩種方法均可
    with open('gk_signsafe.js', 'r', encoding='utf-8') as f:
        exec_js = f.read()
    signsafe = execjs.compile(exec_js).call('encrypt', url)
    return signsafe
signsafe = get_encrypted_password_by_javascript("https://api.eol.cn/web/api/counter?cid=1&did=263")
print(signsafe)

RSA的加密步驟

  1. 獲取公鑰
  2. 實(shí)例化 ===> 扣出網(wǎng)站RSA實(shí)例化對(duì)象的代碼
  3. 設(shè)置公鑰
  4. 對(duì)文本進(jìn)行加密 ==> 扣出復(fù)現(xiàn)RSA加密的邏輯代碼

注: var window=global苗踪、var navigator={}

  • B站RSA

    // window.JSEncrypt is not a constructor 在摳出來的JS Encrypt代碼中加上
    window.JSEncrpt = ze
    // 網(wǎng)頁中位var n = new JSEncrypt ==> JSEncrypt is not defined
    var n = new window.JSEncrypt;
    n.setPublicKey...
    var a = n.encrypt(t.data.hash + password);
    console.log(a)
    
  • 網(wǎng)易云爬評(píng)論:python通過execjs來調(diào)用JS代碼颠区,代碼中用到了CryptoJS庫, 需要os.environ["NODE_PATH"]="F:/..../node_modules"把庫導(dǎo)入

  • JS逆向?qū)崙?zhàn)分析--某鐵網(wǎng)分析:document返回類型通铲,initiator是一條條文本(Other)瓦呼,因?yàn)槠錄]有用ajax(XHR),而是通過原生的網(wǎng)頁表單提交

    loginForm.password.value = encryptByDES(loginForm.password.value), loginForm.publickey.value);
    loginForm.submit();
    
    • 直接require導(dǎo)入CryptoJS模塊

    • or直接扣encryptByDES的加密函數(shù)==>出現(xiàn)cannot read property 'createEncryptor' of undefined

    • MD5加密:

      • JS: const crypto = require("CryptoJS"); crypto.MD5('待加密字符串').toString()

      • Python: https://blog.csdn.net/weixin_44799217/article/details/112486097

        # 法一:創(chuàng)建md5對(duì)象
        hl = hashlib.md5()
        # Tips
        # 此處必須聲明encode测暗,若寫法為hl.update(str) 報(bào)錯(cuò)為: Unicode-objects must be encoded before hashing
        hl.update(str.encode(encoding='utf-8'))
        
        # 法二:
        str_md5 = hashlib.md5(str.encode(encoding='utf-8')).hexdigest()
        
        
  • base64編碼

    • JS: CryptoJS.enc.Base64.parse("待解密字符串").toString(CryptoJS.enc.Utf8)

    • Python

      # 字符串
      encode_str = base64.encodebytes(test_str.encode('utf8'))  # b'aGVsbG8gd29ybGQh\n'
      print(encode_str.decode())  # 默認(rèn)以u(píng)tf8解碼央串,結(jié)果 aGVsbG8gd29ybGQh
      
      # 圖片
      with open("D:\\redis.png", 'rb') as f:
          encode_img = base64.b64encode(f.read())
          file_ext = os.path.splitext("D:\\redis.png")[1]
          print('data:image/{};base64,{}'.format(file_ext[1:], encode_img.decode()))
          f.close()
      
      

加密、摘要算法結(jié)果特征

urlencode

urlencode是一個(gè)函數(shù)碗啄,可將字符串以URL編碼质和,用于編碼處理。

URL編碼(URL encoding)稚字,也稱作百分號(hào)編碼(Percent-encoding)饲宿, 是特定上下文的統(tǒng)一資源定位符 (URL)的編碼機(jī)制。

Base64特征

最常見的用于傳輸8Bit字節(jié)碼編碼方式之一

  • 相同內(nèi)容胆描,結(jié)果是相同的
  • a-zA-Z,0-9,+/共64個(gè)字符進(jìn)行編碼瘫想;每3個(gè)字節(jié)編碼成4個(gè)字節(jié),不足的在結(jié)尾有無意義的=來填補(bǔ)
    • 一般情況下結(jié)尾都會(huì)有1個(gè)或者2個(gè)等號(hào)昌讲,明文長度是3的倍數(shù)時(shí)沒有=国夜;
  • 內(nèi)容越長,結(jié)果越長

注:跟下面的算法區(qū)分一下短绸,base64是編碼方式车吹,并不能算加密算法。應(yīng)用場景還有傳輸圖片:data:image/jpg;base64,/9j/4QMZRXhpZgAASUk...

md5特征

消息摘要算法

  • 確定唯一性:相同內(nèi)容醋闭,結(jié)果是相同的窄驹;但一般會(huì)有時(shí)間戳等參數(shù),所以導(dǎo)致了每次不同
  • 不可逆性:有損的加密過程证逻,理論上無法解密(逆向推出)乐埠,除非暴力破解。安全囚企,這也是其成為校驗(yàn)是否被修改的最關(guān)鍵的性質(zhì)
  • 碰撞性:原始數(shù)據(jù)與其MD5值并不是一一對(duì)應(yīng)的丈咐,有可能多個(gè)原始數(shù)據(jù)計(jì)算出來的MD5值是一樣的,這就是碰撞洞拨。
  • 一般MD5值是32位扯罐,由數(shù)字“0-9”和字母“a-f”所組成的字符串负拟;字母可以是全大寫或者全小寫
    • 密文一般為 16 位或者 32 位烦衣,其中 16 位是取的 32 位第 9~25 位的值;
  • 長度:32個(gè)十六進(jìn)制字符組成的字符串 (128位)

RSA特征

  • 相同內(nèi)容,結(jié)果也是不同的
  • 明文長度需要小于密鑰長度花吟,而密文長度則等于密鑰長度秸歧。一般為1024、2048衅澈、3072键菱、4096或512(低于1024的安全不建議)
  • 通過公鑰加密結(jié)果,必須私鑰解密今布。 同樣私鑰加密結(jié)果经备,公鑰可以解密

注:RSA加解密中必須考慮到的密鑰長度、明文長度和密文長度問題部默;

▲.一般會(huì)使用 JSEncrypt 庫侵蒙,會(huì)有 new 一個(gè)實(shí)例對(duì)象的操作;

SHA 系列

SHA 是比 MD5 更安全一點(diǎn)的摘要算法傅蹂,SHA 通常指 SHA 家族算法纷闺,

sha1

字母(a-f)和數(shù)字(0-9)混合

密文特征跟MD5差不多,只不過數(shù)字是40位份蝴,bit位數(shù)(160)==>4位十六進(jìn)制表示一個(gè)數(shù)

Sha256

字母(a-f)和數(shù)字(0-9)混合

對(duì)于任意長度的消息犁功,SHA256都會(huì)產(chǎn)生一個(gè)256位的哈希值,即64位十六進(jìn)制數(shù)婚夫,稱作消息摘要浸卦。

HMAC

在md5和sha1加密的基礎(chǔ)上引入了秘鑰,而秘鑰又只有傳輸雙方才知道案糙,所以基本上是破解不了的镐躲,常用于接口簽名驗(yàn)證

AES、DES侍筛、3DES萤皂、RC4、Rabbit 等

AES匣椰、DES裆熙、3DES、RC4禽笑、Rabbit 等加密算法的密文通常沒有固定的長度入录,他們通常使用crypto-js庫來實(shí)現(xiàn)

參考:https://juejin.cn/post/7052978567390429215

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市佳镜,隨后出現(xiàn)的幾起案子僚稿,更是在濱河造成了極大的恐慌,老刑警劉巖蟀伸,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚀同,死亡現(xiàn)場離奇詭異缅刽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蠢络,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門衰猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刹孔,你說我怎么就攤上這事啡省。” “怎么了髓霞?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵卦睹,是天一觀的道長。 經(jīng)常有香客問我方库,道長分预,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任薪捍,我火速辦了婚禮笼痹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘酪穿。我一直安慰自己凳干,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布被济。 她就那樣靜靜地躺著救赐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪只磷。 梳的紋絲不亂的頭發(fā)上经磅,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音钮追,去河邊找鬼预厌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛元媚,可吹牛的內(nèi)容都是我干的轧叽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼刊棕,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼炭晒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起甥角,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤网严,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嗤无,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體震束,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怜庸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驴一。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片休雌。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灶壶,死狀恐怖肝断,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驰凛,我是刑警寧澤胸懈,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站恰响,受9級(jí)特大地震影響趣钱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胚宦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一首有、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枢劝,春花似錦井联、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鹤盒,卻和暖如春蚕脏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侦锯。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工驼鞭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尺碰。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓终议,卻偏偏與公主長得像,于是被迫代替她去往敵國和親葱蝗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子穴张,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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