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 list语法学习(带例子)
Nov 01 Python
python模拟登陆阿里妈妈生成商品推广链接
Apr 03 Python
Python中dictionary items()系列函数的用法实例
Aug 21 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
Python中文竖排显示的方法
Jul 28 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
python购物车程序简单代码
Apr 18 Python
从DataFrame中提取出Series或DataFrame对象的方法
Nov 10 Python
Python操作Jira库常用方法解析
Apr 10 Python
Pytorch环境搭建与基本语法
Jun 03 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 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 cookie中点号(句号)自动转为下划线问题
2014/10/21 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
php实现的xml操作类
2016/01/15 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
js url传值中文乱码之解决之道
2009/11/20 Javascript
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
2014/03/28 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
python通过shutil实现快速文件复制的方法
2015/03/14 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
基于Python中numpy数组的合并实例讲解
2018/04/04 Python
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
python 接收处理外带的参数方法
2018/12/03 Python
python+pygame实现坦克大战
2019/09/10 Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
2019/10/27 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
python 发送get请求接口详解
2020/11/17 Python
秋季运动会活动方案
2014/02/05 职场文书
英语求职信范文
2014/05/23 职场文书
爱护公物标语
2014/06/24 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
2016年端午节红领巾广播稿
2015/12/18 职场文书