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开发实例分享bt种子爬虫程序和种子解析
May 21 Python
python爬虫爬取淘宝商品信息
Feb 23 Python
numpy.delete删除一列或多列的方法
Apr 03 Python
Python(Django)项目与Apache的管理交互的方法
May 16 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
Nov 07 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
Jan 29 Python
我们为什么要减少Python中循环的使用
Jul 10 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
python ubplot使用方法解析
Jan 10 Python
keras绘制acc和loss曲线图实例
Jun 15 Python
python实现一个简单RPC框架的示例
Oct 28 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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
PHP源码之 ext/mysql扩展部分
2009/07/17 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
扩展String功能方法
2006/09/22 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
jQuery菜单插件用法实例
2015/07/25 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
学习python类方法与对象方法
2016/03/15 Python
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
学习python可以干什么
2019/02/26 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
德国高尔夫商店:Par71.de
2020/11/29 全球购物
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
党的群众路线教育实践活动学习笔记范文
2014/11/06 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
违反学校规则制度检讨书
2015/01/01 职场文书
乒乓球比赛通知
2015/04/27 职场文书
红色影片观后感
2015/06/18 职场文书
高中运动会广播稿
2015/08/19 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
Python import模块的缓存问题解决方案
2021/06/02 Python
python接口测试返回数据为字典取值方式
2022/02/12 Python