詳解LyScript 內(nèi)存掃描與查殼實現(xiàn)
正文
LyScript 中提供了多種內(nèi)存特征掃描函數(shù),每一種掃描函數(shù)用法各不相同,在使用掃描函數(shù)時應(yīng)首先搞清楚他們之間的差異,如下將分別詳細介紹每一種內(nèi)存掃描函數(shù)是如何靈活運用的,最后將實現(xiàn)一個簡易版內(nèi)存查殼腳本,可快速定位目標程序加了什么殼。
- LyScript項目地址:https://github.com/lyshark/LyScript
先來了解第一個函數(shù)scan_memory_all()的特點,該函數(shù)用來掃描當前進程內(nèi)EIP所指向位置處整個內(nèi)存段中符合條件的特征,如果找到了則返回一個列表,如果沒有找到則返回False,該函數(shù)與scan_memory_one()函數(shù)原理是一致的,唯一的不同是all以列表形式返回所有匹配到的行,one則只返回匹配到的第一條記錄,這兩個函數(shù)都支持??模糊匹配。
如果載入一個程序,默認停留在系統(tǒng)領(lǐng)空,則調(diào)用該函數(shù)你所能得到的特征記錄只能是系統(tǒng)領(lǐng)空特定dll內(nèi)的特征集。

掃描ntdll.dll模塊
例如掃描ntdll.dll模塊內(nèi)的所有特征字段是55 8b ec 83 e4的記錄,代碼是這樣的。
from LyScript32 import MyDebug
if __name__ == "__main__":
dbg = MyDebug()
conn = dbg.connect()
ref_one = dbg.scan_memory_one("55 8b ec 83 e4")
print("掃描一行: {}".format(hex(ref_one)))
ref_all = dbg.scan_memory_all("55 8b ec 83 e4")
for index in range(0, len(ref_all)):
print("記錄: {} 地址: {}".format(index,hex(ref_all[index])))
dbg.close()
運行效果如下:

有時我們需要指定掃描某個模塊,例如掃描進程內(nèi)的msvcr120.dll模塊,里面的特征值。

此時需要想得到該模塊的入口地址,然后將EIP切換過去,此時在調(diào)用scan_memory_all()來完成搜索,當然最好先備份原始EIP位置,這樣掃描完以后可以直接切回去。
from LyScript32 import MyDebug
if __name__ == "__main__":
dbg = MyDebug()
conn = dbg.connect()
# 得到所有模塊
local_module_base = dbg.get_all_module()
for index in local_module_base:
# 找到需要的模塊
if index.get("name") == "msvcr120.dll":
entry = index.get("entry")
print("掃描入口: {}".format(hex(entry)))
# 切過去
dbg.set_register("eip",entry)
# 開始搜索特征
scan_ref = dbg.scan_memory_all("5d c2 0c 00 55 8b ec")
for x in scan_ref:
print("掃描到: {}".format(hex(x)))
dbg.close()
輸出結(jié)果如下:

當然為了使掃描效率更高一些,新版插件中新增了scan_memory_any()函數(shù),該函數(shù)無需切換到模塊入口處即可實現(xiàn)掃描特定模塊內(nèi)的特征,不過該函數(shù)只能返回找到的第一條記錄,且需要傳入掃描起始位置以及掃描長度,不過得到這些參數(shù)并不難。
from LyScript32 import MyDebug
if __name__ == "__main__":
dbg = MyDebug()
conn = dbg.connect()
# 得到進程模塊
local_module = dbg.get_all_module()[0]
# 得到模塊參數(shù)
module_base = local_module.get("base")
module_size = local_module.get("size")
print("基地址: {} 長度: {} 結(jié)束地址: {}".format(hex(module_base),hex(module_size),hex(module_base+module_size)))
# 掃描內(nèi)存
ref = dbg.scan_memory_any(module_base,module_size,"51 5c a8 f8 4c 34 33")
if ref != False:
print("找到內(nèi)存: {}".format(hex(ref)))
dbg.close()
掃描結(jié)果如下:

查殼功能
如上內(nèi)存掃描方法如果可以搞明白,那么查殼這個功能就變得很簡單了,市面上的查殼軟件PEID等基本都是采用特征碼定位的方式,所以我們想要實現(xiàn)查殼以及檢測編譯器特征可以采用特征碼掃描法,如下代碼即可實現(xiàn)查殼功能。
from LyScript32 import MyDebug
# 查殼功能
def scan(dbg, string):
# 得到進程模塊
local_module = dbg.get_all_module()[0]
# 得到模塊參數(shù)
module_base = local_module.get("base")
module_size = local_module.get("size")
# print("基地址: {} 長度: {} 結(jié)束地址: {}".format(hex(module_base),hex(module_size),hex(module_base+module_size)))
# 掃描內(nèi)存
ref = dbg.scan_memory_any(module_base,module_size,string)
if ref != False:
return True
return False
if __name__ == "__main__":
dbg = MyDebug()
conn = dbg.connect()
# 存儲特征碼
signs = [
{"key": "Microsoft Visual C++ 2013", "value": "e8 ?? ?? ?? ?? e9 ?? ?? ?? ?? 55 8b ec"},
{"key": "UPX 3.96w", "value": "60 be ?? ?? ?? ?? 8d be 00 90 ff ff 57"}
]
for index in signs:
check = scan(dbg, index.get("value"))
if check == True:
print("編譯特征: {}".format(index.get("key")))
dbg.close()
分別檢測后輸出結(jié)果如下:
upx加殼軟件輸出為

vs2013編譯器特征輸出

以上就是詳解LyScript 內(nèi)存掃描與查殼實現(xiàn)的詳細內(nèi)容,更多關(guān)于LyScript 內(nèi)存掃描查殼的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何給pip更換國內(nèi)源并配置Python的國內(nèi)鏡像詳解
pip安裝的包都存在于外國的服務(wù)器上,速度會非常慢,可以給pip配置國內(nèi)鏡像,直接從國內(nèi)服務(wù)器安裝依賴,這篇文章主要介紹了如何給pip更換國內(nèi)源并配置Python的國內(nèi)鏡像的相關(guān)資料,需要的朋友可以參考下2025-04-04
在Python中利用Bokeh創(chuàng)建動態(tài)數(shù)據(jù)可視化
在本文中,我們探討了如何利用 Bokeh 庫在 Python 中創(chuàng)建動態(tài)數(shù)據(jù)可視化,我們介紹了 Bokeh 的基本概念和優(yōu)勢,以及如何安裝 Bokeh 庫,對在Python中利用Bokeh創(chuàng)建動態(tài)數(shù)據(jù)可視化相關(guān)知識感興趣的朋友跟隨小編一起看看吧2024-05-05
pytorch訓(xùn)練神經(jīng)網(wǎng)絡(luò)爆內(nèi)存的解決方案
這篇文章主要介紹了pytorch訓(xùn)練神經(jīng)網(wǎng)絡(luò)爆內(nèi)存的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05
Python實現(xiàn)解析路徑字符串并獲取每個文件夾名稱
在?Python?中,解析路徑字符串并獲取每個文件夾的名稱是一項常見的任務(wù),這篇文章主要為大家詳細介紹了Python解析路徑字符串的具體方法,希望對大家有所幫助2024-04-04
PyInstaller將Python文件打包為exe后如何反編譯(破解源碼)以及防止反編譯
這篇文章主要介紹了PyInstaller將Python文件打包為exe后如何反編譯(破解源碼)以及防止反編譯,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

