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中使用PIL库实现图片高斯模糊实例
Feb 08 Python
python中string模块各属性以及函数的用法介绍
May 30 Python
python编写Logistic逻辑回归
Dec 30 Python
Python中Threading用法详解
Dec 27 Python
Python3实现转换Image图片格式
Jun 21 Python
Pandas读取MySQL数据到DataFrame的方法
Jul 25 Python
python实现flappy bird小游戏
Dec 24 Python
python验证码图片处理(二值化)
Nov 01 Python
Python 装饰器原理、定义与用法详解
Dec 07 Python
python中matplotlib实现随鼠标滑动自动标注代码
Apr 23 Python
基于python代码批量处理图片resize
Jun 04 Python
哪些是python中web开发框架
Jun 17 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下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
第4章 数据处理-php正则表达式-郑阿奇(续)
2011/07/04 PHP
PHP中的按位与和按位或操作示例
2014/01/27 PHP
js 多浏览器分别判断代码
2010/04/01 Javascript
基于jQuery的js分页代码
2010/06/10 Javascript
js日期时间补零的小例子
2013/03/05 Javascript
JavaScript创建类/对象的几种方式概述及实例
2013/05/06 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
Js遍历键值对形式对象或Map形式的方法
2016/08/08 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
Vue发布订阅模式实现过程图解
2020/04/30 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
使用 Python 处理 JSON 格式的数据
2019/07/22 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
什么是Python包的循环导入
2020/09/08 Python
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
金融专业应届生求职信
2013/11/02 职场文书
大班幼儿评语大全
2014/04/30 职场文书
护士年终考核评语
2014/12/31 职场文书
毕业晚宴祝酒词
2015/08/11 职场文书
《鲸》教学反思
2016/02/23 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
FFmpeg视频处理入门教程(新手必看)
2022/01/22 杂记