天天看點

學習曆史牛人沒用

學習曆史牛人沒用

文 / 子玉

人們總想從曆史中汲取一些現成經驗來指導自己在現實中實戰,實際上,由于時代、條件不同,曆史人物的成功案例并不能複制,最多具有參考價值。相比那些事功的牛人,可能王陽明、曾國藩這種在修身、心靈建設層面有所成就的人才更值得人們學習。

本質來說,人們熱衷讀曆史牛人的個人傳記和眼下許多商業奇才的創業記錄,實際上都是一種“慕強”心理,人們天生有想成為強者的基因,是以就總是不自覺地向強者靠近,男人從酒局、社交切入,女人以感情和強者發生連結。

靠近強者,一個是想分享他們的資源,更多也想從強者身上拿到方法論,讓自己也成為讓人們仰視的強者。

發現強者,靠近強者,成為強者,是那些想要逆襲的人的基礎認知。差別隻是,身邊的強者還能夠得着,而曆史上的強者和當世各領域的枭雄卻隻能以書籍為媒介和他們“交流”。

這就是古今中外的人物傳記會熱銷的根本原因,本質上是人們對于強者的執念。

但現實卻是,許多人不僅沒有從中擷取營養,反而還誤導了自己。人們一提起秦始皇、漢高祖、拿破侖等曆史牛人就眉飛色舞,仿佛自己曾參與、見證了這些人的人生一樣。可連他們自己都不知道,這其實隻是一種知識點的賣弄,想通過表現自己的博學來擷取他人的關注,想通過對曆史牛人和商業奇才生平的叙述讓别人産生自己也是強者的錯覺。

歸根結底都是個人執念。

那麼問題來了,學習曆史牛人到底有沒有用?

答案是,這要看學習者的身份屬性。劉邦是皇帝,那麼他就可以學習秦始皇當年的一些做法治理大漢帝國;漢和帝想打擊外戚勢力,于是就翻出了《外戚列傳》,從前朝的曆史事件中尋找經驗;司馬光寫出《資治通鑒》,這對趙宋官家就是治國的教科書;清朝皇帝正是對曆代興衰經驗的總結才打出了一個幅員遼闊的帝國并開創了康乾盛世...

再比如,一個将軍學習曆史不僅可以總結出先進經驗,也可以避免踩坑,因為冷兵器時代的打法都差不多,并且地理環境也不會發生多大的變化。比如,隋朝攻滅南陳時就參考了西晉當年滅吳的打法。

條件比對度越高,越有學習的價值。唐太宗說“以史為鏡可知興替”,那是因為他是皇帝,是創造曆史的人。

學習曆史牛人沒用

帝王學習曆史代入感強 圖源/劇照

也就是說,隻有雙方的身份屬性一樣或者差不多,才值得學習,因為有代入感。同理,你是一個企業家,那麼你就可以在讀别的企業家的個人傳記時汲取相關營養。比如,你是搞制造業的,那麼就可以對标制造業領域的大拿進行學習。别人的先進經驗可以直接複制,别人踩過的坑自己也可以完美避開,不必非要通過試錯來總結經驗。

就這,由于時代的不同、條件的差異,曆史牛人對同一身份屬性的後人也隻具備參考價值。最多是對别人做的好的地方進行再加工,然後總結出自己的東西來,或者标注别人踩過的坑以避免自己入坑。

同理,同為企業家,由于企業規模、文化等的不同,别人的創業經驗也隻是起一個參考作用。

對于素人來說,學習曆史牛人隻是知識點的增加,在一些公衆場合賣弄一下學問以博取他人的關注而已,因為身份屬性差距實在太大,是以根本不具備學習、參考的價值。

大家談起曹操就眉飛色舞,但事實卻是,你離人家曹操的距離是十萬八千裡,身份比對度基本為零。

如果非要擠出一些營養,那也隻局限于精神層面,比如,劉邦樂觀豁達的心态、劉秀強大的心力、劉備百折不撓不向命運屈服的意志...

也不要說這是雞湯,實際上人是需要這種能量的,在自身狀态低迷的情況下,曆史人物在逆境中的頑強精神還是可以給讀史者多少注入一些雞血的。不信,你在情緒低迷的時候讀一讀曹操的詩,心情馬上就會不一樣。

羅永浩就曾表示,自己度過低谷期的秘訣就是,讀成功人士的傳記。存在即合理,别一味排斥雞湯。

如果你是一名管理者,那麼能夠學習的地方就更多,比如,可以學習劉邦重視人才、願意與大家分享利益的優點;可以學習唐太宗善于聽取下屬意見的做法...總能擠出一些自己能用于實戰的營養。

就是說,一個人的層級越高,他從曆史中所能汲取的營養就越多。本質還是條件比對度較高而已。

對于大多數人,如果實在想從曆史中汲取一些實用的東西來,最好還是對曆史人物進行一下分類,秦皇漢武唐宗宋祖自然是過于遙遠,但王陽明和曾國藩這樣的人卻離大家很近。

雖然王陽明的人生離我們依舊很遠,但其搭建的心學體系還是值得普通人學習——緻良知、知行合一、心即理...任何人都可以通過刻意練習一步步修行、完善自己。

曆史人物分為兩種,一種是建功立業的人,這種人對曆史的作用更多隻局限于他們所處的時代,比如李斯的功勞隻能服務于大秦。但王陽明這種角色卻能夠通過大量實踐和深度思考總結出一套有實用價值可以穿越時間的哲學體系。

心學的覆寫面廣,能夠服務人的内在工程,通過解決人的心靈問題進而改變人的生活,是實實在在能夠影響、左右一個人的命運前途的。

大家都說白起很猛,可那又怎樣,他和你的人生産生不了任何連結,而王陽明卻是可以影響一代又一代人的,隻要你肯拿起書。

曆史上,大多人隻能服務于當代,但有些人的價值卻是可以穿越時間的。曆史人物的差別就是,他們是否在實踐中總結出了能夠服務後世的思想體系。

學習曆史牛人沒用

王陽明有自己的思想體系 圖源/劇照

還有曾國藩。他的職業生涯同樣不可複制,因為考取進士做到部級高官和建立湘軍并建立不世軍功本來就屬于機率事件,但是他的個人進化史卻是每一個素人都可以對标的。曾經的曾國藩好色、好虛名、沉迷于無效的社交...和現實中的你我緊密貼合。但他卻能夠通過寫日記、反思和複盤的方式不斷優化自己,持續精進,最終完成了從一個庸人、俗人到聖人的進化。

用張宏傑的話來說就是,曾國藩的案例證明了一個中人通過意志力可以達到的人生高度。

曾國藩就像一個執着的挖井人,每天堅持挖那麼一點點,最終挖出了水。這套“掘井理論”完全可以用來指導我們的工作和生活。

比起王陽明,曾國藩的學習價值更大,因為學習心學是要有一定根基的,不是任何一個人都可以切入心學的理論體系中。但曾國藩就不一樣了,吃飯、睡覺、與人打交道...這樣具象到生活中每一個細節的做法都能讓普通人輕松切入,不斷完善自己。

就是徐霞客這個人物,也有值得我們學習的地方。能夠在學而優則仕的大環境下勇敢走一條别人不屑于走的路并取得了一定成就的人,這本來就可以作為參考案例。

就像現在,大家都一窩蜂雞娃,可是這個世界上永遠有資源比你更豐富的人,在同一個賽道,你是競争不過人家的。隻有發現孩子擅長且有興趣的領域,然後加以引導,才能拉開和别人的距離,進而實作彎道超車。

舉個例子,出地鐵時大家都一窩蜂乘坐電梯,但事實上卻是,那個走樓梯的人反而比大多數人更快出站。商品講究差異化、稀缺性,人生的路同樣如此,要盡量避開過度同質化。

再一個,大家還有一個誤區,就是有些人總是局限于學習而不去實踐,就算你從古今曆史牛人的案例中汲取了一些營養,但如果你不去實踐,就永遠也無法形成屬于自己的、具有實用價值的東西。

任何理論都需要實踐驗證。你從曆史人物的案例中遷移出部分自己可以學習的東西這個隻是第一步,在現實中實踐然後進行調整最終形成自己的東西才是最重要的。

純粹學習是個誤區,單純實戰而不學習也有局限性,正确的做法是一邊學習一邊實戰,這樣的成長速度才是最快的。

總之,學習牛人要選擇性學習,要明确自己的目的,如果單純想獲得知識點,那就可以通讀,但如果想總結經驗,那最好要進行一下篩選,要學習能對自己人生産生影響、有指導意義的東西。

曆史幾乎就是批量生産牛人,如果你誰都想了解,那隻會浪費時間,聰明人都是先篩選再學習的。

另外,比起學習曆史牛人、商業巨子,身邊那些已經拿到結果的人似乎更有學習價值,因為,你們的身份比對度高。比如,你想做自媒體,那你完全可以找一個對标賬号複制對方的經驗。

又比如,一個和你曾經站在同一起跑線的同學在數年間拿到了讓别人仰望的結果,那麼他的方法論也完全值得你學習,因為條件比對度比較高。

汲取經驗,書籍不是唯一的通道,你眼前的路、生活中的人,都是載體。

你說呢?

寫文不易,看完記得點個“贊”。謝謝!

LyScript 實作應用層鈎子掃描器

Capstone 是一個輕量級的多平台、多架構的反彙編架構,該子產品支援目前所有通用作業系統,反彙編架構幾乎全部支援,實作應用層鈎子掃描,我們需要得到程式記憶體檔案的機器碼以及磁盤中的機器碼,并通過capstone這個第三方反彙編引擎,對兩者進行反彙編,最後逐條對比彙編指令,實作程序鈎子掃描的效果。

Capstone 是一個輕量級的多平台、多架構的反彙編架構,該子產品支援目前所有通用作業系統,反彙編架構幾乎全部支援,本篇文章将運用LyScript插件結合Capstone反彙編引擎實作一個鈎子掃描器。

  • LyScript項目位址:https://github.com/lyshark/LyScript

要實作應用層鈎子掃描,我們需要得到程式記憶體檔案的機器碼以及磁盤中的機器碼,并通過capstone這個第三方反彙編引擎,對兩者進行反彙編,最後逐條對比彙編指令,實作程序鈎子掃描的效果。

通過LyScript插件讀取出記憶體中的機器碼,然後交給第三方反彙編庫執行,并将結果輸出成字典格式。

#coding: utf-8
import binascii,os,sys
import pefile
from capstone import *
from LyScript32 import MyDebug

# 得到記憶體反彙編代碼
def get_memory_disassembly(address,offset,len):
    # 反彙編清單
    dasm_memory_dict = []

    # 記憶體清單
    ref_memory_list = bytearray()

    # 讀取資料
    for index in range(offset,len):
        char = dbg.read_memory_byte(address + index)
        ref_memory_list.append(char)

    # 執行反彙編
    md = Cs(CS_ARCH_X86,CS_MODE_32)
    for item in md.disasm(ref_memory_list,0x1):
        addr = int(pe_base) + item.address
        dasm_memory_dict.append({"address": str(addr), "opcode": item.mnemonic + " " + item.op_str})
    return dasm_memory_dict

if __name__ == "__main__":
    dbg = MyDebug()
    dbg.connect()

    pe_base = dbg.get_local_base()
    pe_size = dbg.get_local_size()

    print("子產品基位址: {}".format(hex(pe_base)))
    print("子產品大小: {}".format(hex(pe_size)))

    # 得到記憶體反彙編代碼
    dasm_memory_list = get_memory_disassembly(pe_base,0,pe_size)
    print(dasm_memory_list)

    dbg.close()
           

效果如下:

LyScript 實作應用層鈎子掃描器

我們将檔案反彙編也寫一下,然後讓其對比,這樣就可以實作掃描記憶體與檔案中的彙編指令是否一緻。

#coding: utf-8
import binascii,os,sys
import pefile
from capstone import *
from LyScript32 import MyDebug

# 得到記憶體反彙編代碼
def get_memory_disassembly(address,offset,len):
    # 反彙編清單
    dasm_memory_dict = []

    # 記憶體清單
    ref_memory_list = bytearray()

    # 讀取資料
    for index in range(offset,len):
        char = dbg.read_memory_byte(address + index)
        ref_memory_list.append(char)

    # 執行反彙編
    md = Cs(CS_ARCH_X86,CS_MODE_32)
    for item in md.disasm(ref_memory_list,0x1):
        addr = int(pe_base) + item.address
        dic = {"address": str(addr), "opcode": item.mnemonic + " " + item.op_str}
        dasm_memory_dict.append(dic)
    return dasm_memory_dict

# 反彙編檔案中的機器碼
def get_file_disassembly(path):
    opcode_list = []
    pe = pefile.PE(path)
    ImageBase = pe.OPTIONAL_HEADER.ImageBase

    for item in pe.sections:
        if str(item.Name.decode('UTF-8').strip(b'\x00'.decode())) == ".text":
            # print("虛拟位址: 0x%.8X 虛拟大小: 0x%.8X" %(item.VirtualAddress,item.Misc_VirtualSize))
            VirtualAddress = item.VirtualAddress
            VirtualSize = item.Misc_VirtualSize
            ActualOffset = item.PointerToRawData
    StartVA = ImageBase + VirtualAddress
    StopVA = ImageBase + VirtualAddress + VirtualSize
    with open(path,"rb") as fp:
        fp.seek(ActualOffset)
        HexCode = fp.read(VirtualSize)

    md = Cs(CS_ARCH_X86, CS_MODE_32)
    for item in md.disasm(HexCode, 0):
        addr = hex(int(StartVA) + item.address)
        dic = {"address": str(addr) , "opcode": item.mnemonic + " " + item.op_str}
        # print("{}".format(dic))
        opcode_list.append(dic)
    return opcode_list

if __name__ == "__main__":
    dbg = MyDebug()
    dbg.connect()

    pe_base = dbg.get_local_base()
    pe_size = dbg.get_local_size()

    print("子產品基位址: {}".format(hex(pe_base)))
    print("子產品大小: {}".format(hex(pe_size)))

    # 得到記憶體反彙編代碼
    dasm_memory_list = get_memory_disassembly(pe_base,0,pe_size)
    dasm_file_list = get_file_disassembly("d://win32project1.exe")

    # 循環對比記憶體與檔案中的機器碼
    for index in range(0,len(dasm_file_list)):
        if dasm_memory_list[index] != dasm_file_list[index]:
            print("位址: {:8} --> 記憶體反彙編: {:32} --> 磁盤反彙編: {:32}".
                  format(dasm_memory_list[index].get("address"),dasm_memory_list[index].get("opcode"),dasm_file_list[index].get("opcode")))
    dbg.close()
           

此處如果一緻,則說明沒有鈎子,如果不一緻則輸出,這裡的輸出結果不一定準确,此處隻是抛磚引玉。

LyScript 實作應用層鈎子掃描器
文章作者:

lyshark (王瑞)

文章出處:

https://www.cnblogs.com/LyShark/p/16548656.html

版權聲明:

本部落格文章與代碼均為學習時整理的筆記,文章

[均為原創]

作品,轉載請

[添加出處]

,您添加出處是我創作的動力!

轉載文章,請遵守

《中華人民共和國著作權法》

相關規定或遵守

《署名CC BY-ND 4.0國際》

禁止演繹規範,合理合規,攜帶原創出處轉載。

學習曆史牛人沒用

學習曆史牛人沒用

文 / 子玉

人們總想從曆史中汲取一些現成經驗來指導自己在現實中實戰,實際上,由于時代、條件不同,曆史人物的成功案例并不能複制,最多具有參考價值。相比那些事功的牛人,可能王陽明、曾國藩這種在修身、心靈建設層面有所成就的人才更值得人們學習。

本質來說,人們熱衷讀曆史牛人的個人傳記和眼下許多商業奇才的創業記錄,實際上都是一種“慕強”心理,人們天生有想成為強者的基因,是以就總是不自覺地向強者靠近,男人從酒局、社交切入,女人以感情和強者發生連結。

靠近強者,一個是想分享他們的資源,更多也想從強者身上拿到方法論,讓自己也成為讓人們仰視的強者。

發現強者,靠近強者,成為強者,是那些想要逆襲的人的基礎認知。差別隻是,身邊的強者還能夠得着,而曆史上的強者和當世各領域的枭雄卻隻能以書籍為媒介和他們“交流”。

這就是古今中外的人物傳記會熱銷的根本原因,本質上是人們對于強者的執念。

但現實卻是,許多人不僅沒有從中擷取營養,反而還誤導了自己。人們一提起秦始皇、漢高祖、拿破侖等曆史牛人就眉飛色舞,仿佛自己曾參與、見證了這些人的人生一樣。可連他們自己都不知道,這其實隻是一種知識點的賣弄,想通過表現自己的博學來擷取他人的關注,想通過對曆史牛人和商業奇才生平的叙述讓别人産生自己也是強者的錯覺。

歸根結底都是個人執念。

那麼問題來了,學習曆史牛人到底有沒有用?

答案是,這要看學習者的身份屬性。劉邦是皇帝,那麼他就可以學習秦始皇當年的一些做法治理大漢帝國;漢和帝想打擊外戚勢力,于是就翻出了《外戚列傳》,從前朝的曆史事件中尋找經驗;司馬光寫出《資治通鑒》,這對趙宋官家就是治國的教科書;清朝皇帝正是對曆代興衰經驗的總結才打出了一個幅員遼闊的帝國并開創了康乾盛世...

再比如,一個将軍學習曆史不僅可以總結出先進經驗,也可以避免踩坑,因為冷兵器時代的打法都差不多,并且地理環境也不會發生多大的變化。比如,隋朝攻滅南陳時就參考了西晉當年滅吳的打法。

條件比對度越高,越有學習的價值。唐太宗說“以史為鏡可知興替”,那是因為他是皇帝,是創造曆史的人。

學習曆史牛人沒用

帝王學習曆史代入感強 圖源/劇照

也就是說,隻有雙方的身份屬性一樣或者差不多,才值得學習,因為有代入感。同理,你是一個企業家,那麼你就可以在讀别的企業家的個人傳記時汲取相關營養。比如,你是搞制造業的,那麼就可以對标制造業領域的大拿進行學習。别人的先進經驗可以直接複制,别人踩過的坑自己也可以完美避開,不必非要通過試錯來總結經驗。

就這,由于時代的不同、條件的差異,曆史牛人對同一身份屬性的後人也隻具備參考價值。最多是對别人做的好的地方進行再加工,然後總結出自己的東西來,或者标注别人踩過的坑以避免自己入坑。

同理,同為企業家,由于企業規模、文化等的不同,别人的創業經驗也隻是起一個參考作用。

對于素人來說,學習曆史牛人隻是知識點的增加,在一些公衆場合賣弄一下學問以博取他人的關注而已,因為身份屬性差距實在太大,是以根本不具備學習、參考的價值。

大家談起曹操就眉飛色舞,但事實卻是,你離人家曹操的距離是十萬八千裡,身份比對度基本為零。

如果非要擠出一些營養,那也隻局限于精神層面,比如,劉邦樂觀豁達的心态、劉秀強大的心力、劉備百折不撓不向命運屈服的意志...

也不要說這是雞湯,實際上人是需要這種能量的,在自身狀态低迷的情況下,曆史人物在逆境中的頑強精神還是可以給讀史者多少注入一些雞血的。不信,你在情緒低迷的時候讀一讀曹操的詩,心情馬上就會不一樣。

羅永浩就曾表示,自己度過低谷期的秘訣就是,讀成功人士的傳記。存在即合理,别一味排斥雞湯。

如果你是一名管理者,那麼能夠學習的地方就更多,比如,可以學習劉邦重視人才、願意與大家分享利益的優點;可以學習唐太宗善于聽取下屬意見的做法...總能擠出一些自己能用于實戰的營養。

就是說,一個人的層級越高,他從曆史中所能汲取的營養就越多。本質還是條件比對度較高而已。

對于大多數人,如果實在想從曆史中汲取一些實用的東西來,最好還是對曆史人物進行一下分類,秦皇漢武唐宗宋祖自然是過于遙遠,但王陽明和曾國藩這樣的人卻離大家很近。

雖然王陽明的人生離我們依舊很遠,但其搭建的心學體系還是值得普通人學習——緻良知、知行合一、心即理...任何人都可以通過刻意練習一步步修行、完善自己。

曆史人物分為兩種,一種是建功立業的人,這種人對曆史的作用更多隻局限于他們所處的時代,比如李斯的功勞隻能服務于大秦。但王陽明這種角色卻能夠通過大量實踐和深度思考總結出一套有實用價值可以穿越時間的哲學體系。

心學的覆寫面廣,能夠服務人的内在工程,通過解決人的心靈問題進而改變人的生活,是實實在在能夠影響、左右一個人的命運前途的。

大家都說白起很猛,可那又怎樣,他和你的人生産生不了任何連結,而王陽明卻是可以影響一代又一代人的,隻要你肯拿起書。

曆史上,大多人隻能服務于當代,但有些人的價值卻是可以穿越時間的。曆史人物的差別就是,他們是否在實踐中總結出了能夠服務後世的思想體系。

學習曆史牛人沒用

王陽明有自己的思想體系 圖源/劇照

還有曾國藩。他的職業生涯同樣不可複制,因為考取進士做到部級高官和建立湘軍并建立不世軍功本來就屬于機率事件,但是他的個人進化史卻是每一個素人都可以對标的。曾經的曾國藩好色、好虛名、沉迷于無效的社交...和現實中的你我緊密貼合。但他卻能夠通過寫日記、反思和複盤的方式不斷優化自己,持續精進,最終完成了從一個庸人、俗人到聖人的進化。

用張宏傑的話來說就是,曾國藩的案例證明了一個中人通過意志力可以達到的人生高度。

曾國藩就像一個執着的挖井人,每天堅持挖那麼一點點,最終挖出了水。這套“掘井理論”完全可以用來指導我們的工作和生活。

比起王陽明,曾國藩的學習價值更大,因為學習心學是要有一定根基的,不是任何一個人都可以切入心學的理論體系中。但曾國藩就不一樣了,吃飯、睡覺、與人打交道...這樣具象到生活中每一個細節的做法都能讓普通人輕松切入,不斷完善自己。

就是徐霞客這個人物,也有值得我們學習的地方。能夠在學而優則仕的大環境下勇敢走一條别人不屑于走的路并取得了一定成就的人,這本來就可以作為參考案例。

就像現在,大家都一窩蜂雞娃,可是這個世界上永遠有資源比你更豐富的人,在同一個賽道,你是競争不過人家的。隻有發現孩子擅長且有興趣的領域,然後加以引導,才能拉開和别人的距離,進而實作彎道超車。

舉個例子,出地鐵時大家都一窩蜂乘坐電梯,但事實上卻是,那個走樓梯的人反而比大多數人更快出站。商品講究差異化、稀缺性,人生的路同樣如此,要盡量避開過度同質化。

再一個,大家還有一個誤區,就是有些人總是局限于學習而不去實踐,就算你從古今曆史牛人的案例中汲取了一些營養,但如果你不去實踐,就永遠也無法形成屬于自己的、具有實用價值的東西。

任何理論都需要實踐驗證。你從曆史人物的案例中遷移出部分自己可以學習的東西這個隻是第一步,在現實中實踐然後進行調整最終形成自己的東西才是最重要的。

純粹學習是個誤區,單純實戰而不學習也有局限性,正确的做法是一邊學習一邊實戰,這樣的成長速度才是最快的。

總之,學習牛人要選擇性學習,要明确自己的目的,如果單純想獲得知識點,那就可以通讀,但如果想總結經驗,那最好要進行一下篩選,要學習能對自己人生産生影響、有指導意義的東西。

曆史幾乎就是批量生産牛人,如果你誰都想了解,那隻會浪費時間,聰明人都是先篩選再學習的。

另外,比起學習曆史牛人、商業巨子,身邊那些已經拿到結果的人似乎更有學習價值,因為,你們的身份比對度高。比如,你想做自媒體,那你完全可以找一個對标賬号複制對方的經驗。

又比如,一個和你曾經站在同一起跑線的同學在數年間拿到了讓别人仰望的結果,那麼他的方法論也完全值得你學習,因為條件比對度比較高。

汲取經驗,書籍不是唯一的通道,你眼前的路、生活中的人,都是載體。

你說呢?

寫文不易,看完記得點個“贊”。謝謝!

LyScript 實作應用層鈎子掃描器

Capstone 是一個輕量級的多平台、多架構的反彙編架構,該子產品支援目前所有通用作業系統,反彙編架構幾乎全部支援,實作應用層鈎子掃描,我們需要得到程式記憶體檔案的機器碼以及磁盤中的機器碼,并通過capstone這個第三方反彙編引擎,對兩者進行反彙編,最後逐條對比彙編指令,實作程序鈎子掃描的效果。

Capstone 是一個輕量級的多平台、多架構的反彙編架構,該子產品支援目前所有通用作業系統,反彙編架構幾乎全部支援,本篇文章将運用LyScript插件結合Capstone反彙編引擎實作一個鈎子掃描器。

  • LyScript項目位址:https://github.com/lyshark/LyScript

要實作應用層鈎子掃描,我們需要得到程式記憶體檔案的機器碼以及磁盤中的機器碼,并通過capstone這個第三方反彙編引擎,對兩者進行反彙編,最後逐條對比彙編指令,實作程序鈎子掃描的效果。

通過LyScript插件讀取出記憶體中的機器碼,然後交給第三方反彙編庫執行,并将結果輸出成字典格式。

#coding: utf-8
import binascii,os,sys
import pefile
from capstone import *
from LyScript32 import MyDebug

# 得到記憶體反彙編代碼
def get_memory_disassembly(address,offset,len):
    # 反彙編清單
    dasm_memory_dict = []

    # 記憶體清單
    ref_memory_list = bytearray()

    # 讀取資料
    for index in range(offset,len):
        char = dbg.read_memory_byte(address + index)
        ref_memory_list.append(char)

    # 執行反彙編
    md = Cs(CS_ARCH_X86,CS_MODE_32)
    for item in md.disasm(ref_memory_list,0x1):
        addr = int(pe_base) + item.address
        dasm_memory_dict.append({"address": str(addr), "opcode": item.mnemonic + " " + item.op_str})
    return dasm_memory_dict

if __name__ == "__main__":
    dbg = MyDebug()
    dbg.connect()

    pe_base = dbg.get_local_base()
    pe_size = dbg.get_local_size()

    print("子產品基位址: {}".format(hex(pe_base)))
    print("子產品大小: {}".format(hex(pe_size)))

    # 得到記憶體反彙編代碼
    dasm_memory_list = get_memory_disassembly(pe_base,0,pe_size)
    print(dasm_memory_list)

    dbg.close()
           

效果如下:

LyScript 實作應用層鈎子掃描器

我們将檔案反彙編也寫一下,然後讓其對比,這樣就可以實作掃描記憶體與檔案中的彙編指令是否一緻。

#coding: utf-8
import binascii,os,sys
import pefile
from capstone import *
from LyScript32 import MyDebug

# 得到記憶體反彙編代碼
def get_memory_disassembly(address,offset,len):
    # 反彙編清單
    dasm_memory_dict = []

    # 記憶體清單
    ref_memory_list = bytearray()

    # 讀取資料
    for index in range(offset,len):
        char = dbg.read_memory_byte(address + index)
        ref_memory_list.append(char)

    # 執行反彙編
    md = Cs(CS_ARCH_X86,CS_MODE_32)
    for item in md.disasm(ref_memory_list,0x1):
        addr = int(pe_base) + item.address
        dic = {"address": str(addr), "opcode": item.mnemonic + " " + item.op_str}
        dasm_memory_dict.append(dic)
    return dasm_memory_dict

# 反彙編檔案中的機器碼
def get_file_disassembly(path):
    opcode_list = []
    pe = pefile.PE(path)
    ImageBase = pe.OPTIONAL_HEADER.ImageBase

    for item in pe.sections:
        if str(item.Name.decode('UTF-8').strip(b'\x00'.decode())) == ".text":
            # print("虛拟位址: 0x%.8X 虛拟大小: 0x%.8X" %(item.VirtualAddress,item.Misc_VirtualSize))
            VirtualAddress = item.VirtualAddress
            VirtualSize = item.Misc_VirtualSize
            ActualOffset = item.PointerToRawData
    StartVA = ImageBase + VirtualAddress
    StopVA = ImageBase + VirtualAddress + VirtualSize
    with open(path,"rb") as fp:
        fp.seek(ActualOffset)
        HexCode = fp.read(VirtualSize)

    md = Cs(CS_ARCH_X86, CS_MODE_32)
    for item in md.disasm(HexCode, 0):
        addr = hex(int(StartVA) + item.address)
        dic = {"address": str(addr) , "opcode": item.mnemonic + " " + item.op_str}
        # print("{}".format(dic))
        opcode_list.append(dic)
    return opcode_list

if __name__ == "__main__":
    dbg = MyDebug()
    dbg.connect()

    pe_base = dbg.get_local_base()
    pe_size = dbg.get_local_size()

    print("子產品基位址: {}".format(hex(pe_base)))
    print("子產品大小: {}".format(hex(pe_size)))

    # 得到記憶體反彙編代碼
    dasm_memory_list = get_memory_disassembly(pe_base,0,pe_size)
    dasm_file_list = get_file_disassembly("d://win32project1.exe")

    # 循環對比記憶體與檔案中的機器碼
    for index in range(0,len(dasm_file_list)):
        if dasm_memory_list[index] != dasm_file_list[index]:
            print("位址: {:8} --> 記憶體反彙編: {:32} --> 磁盤反彙編: {:32}".
                  format(dasm_memory_list[index].get("address"),dasm_memory_list[index].get("opcode"),dasm_file_list[index].get("opcode")))
    dbg.close()
           

此處如果一緻,則說明沒有鈎子,如果不一緻則輸出,這裡的輸出結果不一定準确,此處隻是抛磚引玉。

LyScript 實作應用層鈎子掃描器
文章作者:

lyshark (王瑞)

文章出處:

https://www.cnblogs.com/LyShark/p/16548656.html

版權聲明:

本部落格文章與代碼均為學習時整理的筆記,文章

[均為原創]

作品,轉載請

[添加出處]

,您添加出處是我創作的動力!

轉載文章,請遵守

《中華人民共和國著作權法》

相關規定或遵守

《署名CC BY-ND 4.0國際》

禁止演繹規範,合理合規,攜帶原創出處轉載。