網(wǎng)站首頁 編程語言 正文
通過對LyScript自動化插件進(jìn)行二次封裝,實現(xiàn)從內(nèi)存中讀入目標(biāo)進(jìn)程解碼后的機器碼,并通過Python代碼在這些機器碼中尋找特定的十六進(jìn)制字符數(shù)組,或直接檢索是否存在連續(xù)的反匯編指令片段等功能。
LyScript項目地址:https://github.com/lyshark/LyScript
搜索內(nèi)存中的機器碼
內(nèi)存機器碼需要配合LyScript32插件,從內(nèi)存中尋找指令片段。
from LyScript32 import MyDebug
# 將可執(zhí)行文件中的單數(shù)轉(zhuǎn)換為 0x00 格式
def ReadHexCode(code):
hex_code = []
for index in code:
if index >= 0 and index <= 15:
#print("0" + str(hex(index).replace("0x","")))
hex_code.append("0" + str(hex(index).replace("0x","")))
else:
hex_code.append(hex(index).replace("0x",""))
#print(hex(index).replace("0x",""))
return hex_code
# 獲取到內(nèi)存中的機器碼
def GetCode():
try:
ref_code = []
dbg = MyDebug()
connect_flag = dbg.connect()
if connect_flag != 1:
return None
start_address = dbg.get_local_base()
end_address = start_address + dbg.get_local_size()
# 循環(huán)得到機器碼
for index in range(start_address,end_address):
read_bytes = dbg.read_memory_byte(index)
ref_code.append(read_bytes)
dbg.close()
return ref_code
except Exception:
return False
# 在字節(jié)數(shù)組中匹配是否與特征碼一致
def SearchHexCode(Code,SearchCode,ReadByte):
SearchCount = len(SearchCode)
#print("特征碼總長度: {}".format(SearchCount))
for item in range(0,ReadByte):
count = 0
# 對十六進(jìn)制數(shù)切片,每次向后遍歷SearchCount
OpCode = Code[ 0+item :SearchCount+item ]
#print("切割數(shù)組: {} --> 對比: {}".format(OpCode,SearchCode))
try:
for x in range(0,SearchCount):
if OpCode[x] == SearchCode[x]:
count = count + 1
#print("尋找特征碼計數(shù): {} {} {}".format(count,OpCode[x],SearchCode[x]))
if count == SearchCount:
# 如果找到了,就返回True,否則返回False
return True
exit(0)
except Exception:
pass
return False
if __name__ == "__main__":
# 讀取到內(nèi)存機器碼
ref_code = GetCode()
if ref_code != False:
# 轉(zhuǎn)為十六進(jìn)制
hex_code = ReadHexCode(ref_code)
code_size = len(hex_code)
# 指定要搜索的特征碼序列
search = ['c0', '74', '0d', '66', '3b', 'c6', '77', '08']
# 搜索特征: hex_code = exe的字節(jié)碼,search=搜索特征碼,code_size = 搜索大小
ret = SearchHexCode(hex_code, search, code_size)
if ret == True:
print("特征碼 {} 存在".format(search))
else:
print("特征碼 {} 不存在".format(search))
else:
print("讀入失敗")
輸出效果:
搜索內(nèi)存反匯編代碼
通過LyScript插件讀入內(nèi)存機器碼,并在該機器碼中尋找指令片段,找到后返回內(nèi)存首地址。
from LyScript32 import MyDebug
# 檢索指定序列中是否存在一段特定的指令集
def SearchOpCode(OpCodeList,SearchCode,ReadByte):
SearchCount = len(SearchCode)
for item in range(0,ReadByte):
count = 0
OpCode_Dic = OpCodeList[ 0 + item : SearchCount + item ]
# print("切割字典: {}".format(OpCode_Dic))
try:
for x in range(0,SearchCount):
if OpCode_Dic[x].get("opcode") == SearchCode[x]:
#print(OpCode_Dic[x].get("addr"),OpCode_Dic[x].get("opcode"))
count = count + 1
if count == SearchCount:
#print(OpCode_Dic[0].get("addr"))
return OpCode_Dic[0].get("addr")
exit(0)
except Exception:
pass
if __name__ == "__main__":
dbg = MyDebug()
connect_flag = dbg.connect()
print("連接狀態(tài): {}".format(connect_flag))
# 得到EIP位置
eip = dbg.get_register("eip")
# 反匯編前1000行
disasm_dict = dbg.get_disasm_code(eip,1000)
# 搜索一個指令序列,用于快速查找構(gòu)建漏洞利用代碼
SearchCode = [
["push 0xC0000409", "call 0x003F1B38", "pop ecx"],
["push ecx", "push ebx"]
]
# 檢索內(nèi)存指令集
for item in range(0,len(SearchCode)):
Search = SearchCode[item]
# disasm_dict = 返回匯編指令 Search = 尋找指令集 1000 = 向下檢索長度
ret = SearchOpCode(disasm_dict,Search,1000)
if ret != None:
print("指令集: {} --> 首次出現(xiàn)地址: {}".format(SearchCode[item],hex(ret)))
dbg.close()
輸出效果:
原文鏈接:https://www.cnblogs.com/LyShark/p/16645221.html
相關(guān)推薦
- 2022-10-12 Docker開啟遠(yuǎn)程連接并實現(xiàn)安全通信詳解_docker
- 2023-10-13 獲取element-ui的Collapse折疊后高度
- 2023-03-26 python命令行參數(shù)argparse模塊基本用法詳解_python
- 2023-04-03 Python調(diào)試神器之PySnooper的使用教程分享_python
- 2022-06-22 在?Python?中利用Pool?進(jìn)行多處理_python
- 2022-12-03 C++時間函數(shù)整理詳解_C 語言
- 2022-09-30 Docker容器Consul部署概述_docker
- 2022-05-19 pytorch中的?.view()函數(shù)的用法介紹_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支