LyScriptTools工具包是在LyScript模塊基礎上封裝的工具包,其主要是二次封裝LyScript插件實現的一些新功能,或者將特定功能組件拆分開形成的獨立模塊,此類模塊可實現更加精細化的功能控制,在實際開發中推薦使用此種方式調用。
LyScript項目地址:https://github.com/lyshark/LyScript
獲取被調試進程信息: 得到當前被調試進程詳細參數,包括路徑,名稱,入口地址,基地址,長度等。
from LyScript32 import MyDebug
from LyScriptTools32 import Module
if __name__ == "__main__":
# 初始化
dbg = MyDebug()
# 連接到調試器
connect_flag = dbg.connect()
print("連接狀態: {}".format(connect_flag))
# 類定義,並傳入調試器對象
module = Module(dbg)
# 得到當前被調試程序完整路徑
full_path = module.get_local_full_path()
print("完整路徑: {}".format(full_path))
# 得到進程名字
local_name = module.get_local_program_name()
print("調試名稱: {}".format(local_name))
# 得到長度
local_size = module.get_local_program_size()
print("程序長度: {}".format(local_size))
# 得到基地址
local_base = module.get_local_program_base()
print("基地址: {}".format(hex(local_base)))
# 得到入口地址
local_oep = module.get_local_program_entry()
print("入口地址: {}".format(hex(local_oep)))
dbg.close()
得到當前被調試進程基本信息:
根據模塊地址或名稱得到基地址: 根據模塊名或者模塊地址互相獲取指定模塊的入口地址,基地址,名稱等。
from LyScript32 import MyDebug
from LyScriptTools32 import Module
if __name__ == "__main__":
# 初始化
dbg = MyDebug()
# 連接到調試器
connect_flag = dbg.connect()
print("連接狀態: {}".format(connect_flag))
# 類定義,並傳入調試器對象
module = Module(dbg)
# 驗證是否導入了user32.dll
is_import = module.check_module_imported("user32.dll")
print("是否導入: {}".format(is_import))
# 根據基地址得到模塊名
module_name = module.get_name_from_module("1985413120")
print("根據基地址得到模塊名: {}".format(module_name))
# 根據模塊名得到基地址
module_base = module.get_base_from_module("kernelbase.dll")
print("根據模塊名得到基地址: {}".format(hex(module_base)))
# 根據模塊名得到OEP基地址
module_oep = module.get_oep_from_module("win32project1.exe")
print("OEP: {}".format(hex(module_oep)))
dbg.close()
運行效果如下:
如上只是兩個最基本的演示,LySctiptTools中關於模塊的封裝函數有很多,具體可歸納爲如下表:
Module類內函數名 | 函數作用 |
---|---|
get_local_full_path() | 得到程序自身完整路徑 |
get_local_program_name() | 獲得加載程序的文件名 |
get_local_program_size() | 得到被加載程序的大小 |
get_local_program_base() | 得到基地址 |
get_local_program_entry() | 得到入口地址 |
check_module_imported(module_name) | 驗證程序是否導入了指定模塊 |
get_name_from_module(address) | 根據基地址得到模塊名 |
get_base_from_module(module_name) | 根據模塊名得到基地址 |
get_oep_from_module(module_name) | 根據模塊名得到模塊OEP入口 |
get_all_module_information() | 得到所有模塊信息 |
get_module_base(module_name) | 得到特定模塊基地址 |
get_local_base() | 得到當前OEP位置處模塊基地址 |
get_local_size() | 獲取當前OEP位置長度 |
get_local_protect() | 獲取當前OEP位置保護屬性 |
get_module_from_function(module,function) | 獲取指定模塊中指定函數內存地址 |
get_base_from_address(address) | 根據傳入地址得到模塊首地址,開頭4D 5A |
get_base_address() | 得到當前.text節基地址 |
get_base_from_name(module_name) | 根據名字得到模塊基地址 |
get_oep_from_name(module_name) | 傳入模塊名得到OEP位置 |
get_oep_from_address(address) | 傳入模塊地址得到OEP位置 |
get_module_from_import(module_name) | 得到指定模塊的導入表 |
get_import_inside_function(module_name,function_name) | 檢查指定模塊內是否存在特定導入函數 |
get_import_iatva(module_name,function_name) | 根據導入函數名得到函數iat_va地址 |
get_import_iatrva(module_name,function_name) | 根據導入函數名得到函數iat_rva地址 |
get_module_from_export(module_name) | 傳入模塊名,獲取模塊導出表 |
get_module_export_va(module_name,function_name) | 傳入模塊名以及導出函數名,得到va地址 |
get_module_export_rva(module_name,function_name) | 傳入模塊名以及導出函數,得到rva地址 |
get_local_section() | 得到程序節表信息 |
get_local_address_from_section(section_name) | 根據節名稱得到地址 |
get_local_size_from_section(section_name) | 根據節名稱得到節大小 |
get_local_section_from_address(address) | 根據地址得到節名稱 |