LyScript實(shí)現(xiàn)繞過反調(diào)試保護(hù)的示例詳解
LyScript插件中內(nèi)置的方法可實(shí)現(xiàn)各類反調(diào)試以及屏蔽特定API函數(shù)的功能,這類功能在應(yīng)對病毒等惡意程序時(shí)非常有效,例如當(dāng)程序調(diào)用特定API函數(shù)時(shí)我們可以將其攔截,從而實(shí)現(xiàn)保護(hù)系統(tǒng)在調(diào)試時(shí)不被破壞的目的。
LyScript項(xiàng)目地址: https://github.com/lyshark/LyScript
繞過反調(diào)試機(jī)制: 最常用的反調(diào)試機(jī)制就是用IsDebuggerPresent該標(biāo)志檢查PEB+2位置處的內(nèi)容,如果為1則表示正在被調(diào)試,我們運(yùn)行腳本直接將其設(shè)置為0即可繞過反調(diào)試機(jī)制。

也就是進(jìn)程環(huán)境塊中+2的位置,此處是一個(gè)字節(jié)標(biāo)志,反調(diào)試的機(jī)制是,程序調(diào)用IsDebuggerPresent檢查此處的標(biāo)志,如果為1則說明程序正在被調(diào)試,為0則說明沒有被調(diào)試,只需要在運(yùn)行之前將其設(shè)置為0即可繞過反調(diào)試。
from LyScript32 import MyDebug
if __name__ == "__main__":
# 初始化
dbg = MyDebug()
dbg.connect()
# 通過PEB找到調(diào)試標(biāo)志位
peb = dbg.get_peb_address(dbg.get_process_id())
print("調(diào)試標(biāo)志地址: 0x{:x}".format(peb+2))
flag = dbg.read_memory_byte(peb+2)
print("調(diào)試標(biāo)志位: {}".format(flag))
# 將調(diào)試標(biāo)志設(shè)置為0即可過掉反調(diào)試
nop_debug = dbg.write_memory_byte(peb+2,0)
print("反調(diào)試?yán)@過狀態(tài): {}".format(nop_debug))
dbg.close()
將程序載入調(diào)試器,并運(yùn)行如上腳本,然后運(yùn)行程序,你會(huì)發(fā)現(xiàn)反調(diào)試被繞過了。

其次我們還可以動(dòng)態(tài)的在函數(shù)開頭位置寫入sub eax,eax,ret指令,這樣當(dāng)程序要調(diào)用特定函數(shù)時(shí),會(huì)直接返回退出,從而達(dá)到屏蔽函數(shù)執(zhí)行等目的。
from LyScript32 import MyDebug
# 得到所需要的機(jī)器碼
def set_assemble_opcde(dbg,address):
# 得到第一條長度
opcode_size = dbg.assemble_code_size("sub eax,eax")
# 寫出匯編指令
dbg.assemble_at(address, "sub eax,eax")
dbg.assemble_at(address + opcode_size , "ret")
if __name__ == "__main__":
# 初始化
dbg = MyDebug()
dbg.connect()
# 得到函數(shù)所在內(nèi)存地址
process32first = dbg.get_module_from_function("kernel32","Process32FirstW")
process32next = dbg.get_module_from_function("kernel32","Process32NextW")
messagebox = dbg.get_module_from_function("user32.dll","MessageBoxA")
messageboxw = dbg.get_module_from_function("user32.dll", "MessageBoxW")
print(hex(messagebox)," ",hex(messageboxw))
# 替換函數(shù)位置為sub eax,eax ret
set_assemble_opcde(dbg, messagebox)
set_assemble_opcde(dbg,messageboxw)
dbg.close()
如上,我們在彈窗位置寫出返回指令,然后運(yùn)行程序,你會(huì)發(fā)現(xiàn),彈窗不會(huì)出現(xiàn)了,這也就把這個(gè)函數(shù)給屏蔽了。

同理,繞過進(jìn)程枚舉,依然可以使用此方式實(shí)現(xiàn)。
繞過進(jìn)程枚舉: 病毒會(huì)枚舉所有運(yùn)行的進(jìn)程以確認(rèn)是否有調(diào)試器在運(yùn)行,我們可以在特定的函數(shù)開頭處寫入SUB EAX,EAX RET指令讓其無法調(diào)用枚舉函數(shù)從而失效。
from LyScript32 import MyDebug
# 得到所需要的機(jī)器碼
def set_assemble_opcde(dbg,address):
# 得到第一條長度
opcode_size = dbg.assemble_code_size("sub eax,eax")
# 寫出匯編指令
dbg.assemble_at(address, "sub eax,eax")
dbg.assemble_at(address + opcode_size , "ret")
if __name__ == "__main__":
# 初始化
dbg = MyDebug()
dbg.connect()
# 得到函數(shù)所在內(nèi)存地址
process32first = dbg.get_module_from_function("kernel32","Process32FirstW")
process32next = dbg.get_module_from_function("kernel32","Process32NextW")
print("process32first = 0x{:x} | process32next = 0x{:x}".format(process32first,process32next))
# 替換函數(shù)位置為sub eax,eax ret
set_assemble_opcde(dbg, process32first)
set_assemble_opcde(dbg, process32next)
dbg.close()到此這篇關(guān)于LyScript實(shí)現(xiàn)繞過反調(diào)試保護(hù)的示例詳解的文章就介紹到這了,更多相關(guān)LyScript繞過反調(diào)試保護(hù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之
相關(guān)文章
python pytest進(jìn)階之fixture詳解
這篇文章主要介紹了python pytest進(jìn)階之fixture詳解,學(xué)pytest就不得不說fixture,fixture是pytest的精髓所在,就像unittest中的setup和teardown一樣,如果不學(xué)fixture那么使用pytest和使用unittest是沒什么區(qū)別的,需要的朋友可以參考下2019-06-06
pycharm配置anaconda環(huán)境時(shí)找不到python.exe解決辦法
今天來說一下python中一個(gè)管理包很好用的工具anaconda,可以輕松實(shí)現(xiàn)python中各種包的管理,這篇文章主要給大家介紹了關(guān)于pycharm配置anaconda環(huán)境時(shí)找不到python.exe的解決辦法,需要的朋友可以參考下2023-10-10
Python+Selenium鍵盤鼠標(biāo)模擬事件操作詳解
這篇文章主要帶大家一起學(xué)習(xí)一下Selenium的元素的基本操作與鼠標(biāo)鍵盤模擬事件的操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-06-06
python異步的ASGI與Fast Api實(shí)現(xiàn)
本文主要介紹了python異步的ASGI與Fast Api實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
Python實(shí)現(xiàn)圖形用戶界面和游戲開發(fā)的方法和技巧
GUI圖形用戶界面編程,我們可以通過python提供的豐富的組件,快速的實(shí)現(xiàn)使用圖形的界面和用戶交互, GUI編程類似于“搭積?”,將?個(gè)個(gè)組件(Widget)放到窗?中,這篇文章主要給大家介紹了基于Python的GUI圖形用戶界面編程的相關(guān)資料,需要的朋友可以參考下2023-05-05
Python實(shí)現(xiàn)socket庫網(wǎng)絡(luò)通信套接字
socket又叫套接字,實(shí)現(xiàn)網(wǎng)絡(luò)通信的兩端就是套接字。分為服務(wù)器對應(yīng)的套接字和客戶端對應(yīng)的套接字,本文給大家介紹Python實(shí)現(xiàn)socket庫網(wǎng)絡(luò)通信套接字的相關(guān)知識(shí),包括套接字的基本概念,感興趣的朋友跟隨小編一起看看吧2021-06-06
Windows下Anaconda和PyCharm的安裝與使用詳解
這篇文章主要介紹了Windows下Anaconda和PyCharm的安裝與使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python實(shí)現(xiàn)鼠標(biāo)自動(dòng)在屏幕上隨機(jī)移動(dòng)功能
這篇文章主要介紹了Python實(shí)現(xiàn)鼠標(biāo)自動(dòng)在屏幕上隨機(jī)移動(dòng)功能,具有很好的參考價(jià)值,希望對大家有所幫助。還等什么?一起跟隨小編過來看看吧2020-03-03

