看点:LyScript实现绕过反调试保护的示例详解
(资料图)
LyScript插件中内置的方法可实现各类反调试以及屏蔽特定API函数的功能,这类功能在应对病毒等恶意程序时非常有效,例如当程序调用特定API函数时我们可以将其拦截,从而实现保护系统在调试时不被破坏的目的。
LyScript项目地址:https://github.com/lyshark/LyScript
绕过反调试机制:最常用的反调试机制就是用IsDebuggerPresent
该标志检查PEB+2
位置处的内容,如果为1则表示正在被调试,我们运行脚本直接将其设置为0即可绕过反调试机制。
也就是进程环境块中+2的位置,此处是一个字节标志,反调试的机制是,程序调用IsDebuggerPresent
检查此处的标志,如果为1则说明程序正在被调试,为0则说明没有被调试,只需要在运行之前将其设置为0即可绕过反调试。
from LyScript32 import MyDebug if __name__ == "__main__": # 初始化 dbg = MyDebug() dbg.connect() # 通过PEB找到调试标志位 peb = dbg.get_peb_address(dbg.get_process_id()) print("调试标志地址: 0x{:x}".format(peb+2)) flag = dbg.read_memory_byte(peb+2) print("调试标志位: {}".format(flag)) # 将调试标志设置为0即可过掉反调试 nop_debug = dbg.write_memory_byte(peb+2,0) print("反调试绕过状态: {}".format(nop_debug)) dbg.close()
将程序载入调试器,并运行如上脚本,然后运行程序,你会发现反调试被绕过了。
其次我们还可以动态的在函数开头位置写入sub eax,eax,ret
指令,这样当程序要调用特定函数时,会直接返回退出,从而达到屏蔽函数执行等目的。
from LyScript32 import MyDebug # 得到所需要的机器码 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() # 得到函数所在内存地址 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)) # 替换函数位置为sub eax,eax ret set_assemble_opcde(dbg, messagebox) set_assemble_opcde(dbg,messageboxw) dbg.close()
如上,我们在弹窗位置写出返回指令,然后运行程序,你会发现,弹窗不会出现了,这也就把这个函数给屏蔽了。
同理,绕过进程枚举,依然可以使用此方式实现。
绕过进程枚举:病毒会枚举所有运行的进程以确认是否有调试器在运行,我们可以在特定的函数开头处写入SUB EAX,EAX RET指令让其无法调用枚举函数从而失效。
from LyScript32 import MyDebug # 得到所需要的机器码 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() # 得到函数所在内存地址 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)) # 替换函数位置为sub eax,eax ret set_assemble_opcde(dbg, process32first) set_assemble_opcde(dbg, process32next) dbg.close()
到此这篇关于LyScript实现绕过反调试保护的示例详解的文章就介绍到这了,更多相关LyScript绕过反调试保护内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之
X 关闭
X 关闭
- 1亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 2现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 3如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 4AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 5转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 6充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 7好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 8名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 9亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战
- 10京东绿色建材线上平台上线 新增用户70%来自下沉市场