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中的变量的数据类型
May 13 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
hmac模块生成加入了密钥的消息摘要详解
Jan 11 Python
Python GUI布局尺寸适配方法
Oct 11 Python
pyqt5中QThread在使用时出现重复emit的实例
Jun 21 Python
Django之使用celery和NGINX生成静态页面实现性能优化
Oct 08 Python
关于Python3 lambda函数的深入浅出
Nov 27 Python
python3中numpy函数tile的用法详解
Dec 04 Python
详解Pycharm出现out of memory的终极解决方法
Mar 03 Python
python框架Django实战商城项目之工程搭建过程图文详解
Mar 09 Python
python代码区分大小写吗
Jun 17 Python
scrapy中如何设置应用cookies的方法(3种)
Sep 22 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中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
简单的cookie计数器实现源码
2013/06/07 PHP
基于PHP常用字符串的总结(待续)
2013/06/07 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
2014/07/11 PHP
php读取目录及子目录下所有文件名的方法
2014/10/20 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
window.dialogArguments 使用说明
2011/04/11 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
2014/06/24 Javascript
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
jQuery实现表格行上移下移和置顶的方法
2015/05/22 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
2017/10/26 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
2018/01/02 Javascript
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
2020/03/12 Javascript
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
Python断言assert的用法代码解析
2018/02/03 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
python中enumerate() 与zip()函数的使用比较实例分析
2019/09/03 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
实验心得体会
2014/09/05 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
小学入学感言
2015/08/01 职场文书
初一数学教学反思
2016/02/17 职场文书