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的Django框架中自定义模版标签的示例
Jul 20 Python
约瑟夫问题的Python和C++求解方法
Aug 20 Python
python学习笔记之列表(list)与元组(tuple)详解
Nov 23 Python
python模拟键盘输入 切换键盘布局过程解析
Aug 15 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
python数据分析:关键字提取方式
Feb 24 Python
python通过对字典的排序,对json字段进行排序的实例
Feb 27 Python
Python collections模块的使用方法
Oct 09 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
Oct 31 Python
python中uuid模块实例浅析
Dec 29 Python
django inspectdb 操作已有数据库数据的使用步骤
Feb 07 Python
python定义具名元组实例操作
Feb 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
第六节--访问属性和方法
2006/11/16 PHP
用PHP编写和读取XML的几种方式
2013/01/12 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
提交表单后 PHP获取提交内容的实现方法
2016/05/25 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
JS实现斐波那契数列的五种方式(小结)
2020/09/09 Javascript
Python splitlines使用技巧
2008/09/06 Python
进一步探究Python中的正则表达式
2015/04/28 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
解决Mac下使用python的坑
2019/08/13 Python
Python eval函数原理及用法解析
2020/11/14 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
C/C++有关内存的思考题
2015/12/04 面试题
策划创业计划书
2014/02/06 职场文书
兴趣小组活动总结
2014/05/05 职场文书
活动宣传策划方案
2014/05/23 职场文书
基层党建工作汇报材料
2014/08/15 职场文书