LyScript实现绕过反调试保护的示例详解


Posted in Python onAugust 14, 2022

LyScript插件中内置的方法可实现各类反调试以及屏蔽特定API函数的功能,这类功能在应对病毒等恶意程序时非常有效,例如当程序调用特定API函数时我们可以将其拦截,从而实现保护系统在调试时不被破坏的目的。

LyScript项目地址: https://github.com/lyshark/LyScript

绕过反调试机制: 最常用的反调试机制就是用IsDebuggerPresent该标志检查PEB+2位置处的内容,如果为1则表示正在被调试,我们运行脚本直接将其设置为0即可绕过反调试机制。

LyScript实现绕过反调试保护的示例详解

也就是进程环境块中+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()

将程序载入调试器,并运行如上脚本,然后运行程序,你会发现反调试被绕过了。

LyScript实现绕过反调试保护的示例详解

其次我们还可以动态的在函数开头位置写入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()

如上,我们在弹窗位置写出返回指令,然后运行程序,你会发现,弹窗不会出现了,这也就把这个函数给屏蔽了。

LyScript实现绕过反调试保护的示例详解

同理,绕过进程枚举,依然可以使用此方式实现。

绕过进程枚举: 病毒会枚举所有运行的进程以确认是否有调试器在运行,我们可以在特定的函数开头处写入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绕过反调试保护内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之

Python 相关文章推荐
python抓取网页内容示例分享
Feb 24 Python
wxPython中文教程入门实例
Jun 09 Python
Python中的高级函数map/reduce使用实例
Apr 13 Python
Python读取图片属性信息的实现方法
Sep 11 Python
python实现人人自动回复、抢沙发功能
Jun 08 Python
Python实现将Excel转换成为image的方法
Oct 23 Python
python global关键字的用法详解
Sep 05 Python
python [:3] 实现提取数组中的数
Nov 27 Python
python计算Content-MD5并获取文件的Content-MD5值方式
Apr 03 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
May 12 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 Python
python_tkinter事件类型详情
Mar 20 Python
LeetCode189轮转数组python示例
Aug 05 #Python
python语言中pandas字符串分割str.split()函数
Aug 05 #Python
python绘制云雨图raincloud plot
Aug 05 #Python
python计算列表元素与乘积详情
Aug 05 #Python
Pygame游戏开发之太空射击实战敌人精灵篇
Aug 05 #Python
python playwrigh框架入门安装使用
Jul 23 #Python
python playwright之元素定位示例详解
Jul 23 #Python
You might like
PHP利用COM对象访问SQLServer、Access
2006/10/09 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
jQuery 性能优化指南(2)
2009/05/21 Javascript
html中table数据排序的js代码
2011/08/09 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
JS判断数组那点事
2017/10/10 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
基于iScroll实现内容滚动效果
2018/03/21 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
深入理解Angularjs 脏值检测
2018/10/12 Javascript
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
Python telnet登陆功能实现代码
2020/04/16 Python
python3将变量输入的简单实例
2020/08/19 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
大学生个人推荐信范文
2013/11/25 职场文书
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
企业宣传策划方案
2014/05/29 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技