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 相关文章推荐
使用Node.js和Socket.IO扩展Django的实时处理功能
Apr 20 Python
Python实现配置文件备份的方法
Jul 30 Python
python实现简单爬虫功能的示例
Oct 24 Python
Pycharm学习教程(2) 代码风格
May 02 Python
python 实现UTC时间加减的方法
Dec 31 Python
Python使用修饰器进行异常日志记录操作示例
Mar 19 Python
对Python中class和instance以及self的用法详解
Jun 26 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
Dec 19 Python
python 实现按对象传值
Dec 26 Python
python selenium操作cookie的实现
Mar 18 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
python中判断数字是否为质数的实例讲解
Dec 06 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
程序员编程十条戒律
2009/07/09 PHP
php购物网站支付paypal使用方法
2010/11/28 PHP
php实现图形显示Ip地址的代码及注释
2014/01/20 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
php app支付宝回调(异步通知)详解
2018/07/25 PHP
Javascript日期对象的dateAdd与dateDiff方法
2008/11/18 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
JavaScript 上万关键字瞬间匹配实现代码
2013/07/07 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
js中的布尔运算符使用介绍
2013/11/20 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
Python语言描述机器学习之Logistic回归算法
2017/12/21 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
python collections模块的使用
2020/10/16 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
文员个人求职自荐信
2013/09/21 职场文书
护理专业的自荐信
2013/10/22 职场文书
仓库管理专业个人自我评价范文
2013/11/11 职场文书
精通CAD能手自荐书
2014/01/31 职场文书
村干部培训班主持词
2014/03/28 职场文书
工作所在部门证明
2014/09/21 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
升职自荐书
2019/05/09 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL