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中的装饰器详解
Apr 13 Python
python在ubuntu中的几种安装方法(小结)
Dec 08 Python
全面分析Python的优点和缺点
Feb 07 Python
python中字符串内置函数的用法总结
Sep 13 Python
详解python持久化文件读写
Apr 06 Python
PyQt5实现简单的计算器
May 30 Python
Python2.6版本pip安装步骤解析
Aug 17 Python
python如何实现图片压缩
Sep 11 Python
PyQT5速成教程之Qt Designer介绍与入门
Nov 02 Python
利用python查看数组中的所有元素是否相同
Jan 08 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 Python
如何在C++中调用Python
May 21 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 sybase_fetch_array使用方法
2014/04/15 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
如何在一个页面显示多个百度地图
2013/04/07 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
[29:10]Ti4 冒泡赛第二天 NEWBEE vs Titan 3
2014/07/15 DOTA
Python中的time模块与datetime模块用法总结
2016/06/30 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
Win8下python3.5.1安装教程
2020/07/29 Python
使用numba对Python运算加速的方法
2018/10/15 Python
浅谈Python的list中的选取范围
2018/11/12 Python
django之自定义软删除Model的方法
2019/08/14 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
Linux文件操作命令都有哪些
2015/02/27 面试题
大学在校生求职信范文
2013/11/21 职场文书
护士检查书
2014/01/17 职场文书
军训感想500字
2014/02/20 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
华清池导游词
2015/02/02 职场文书
银行实习推荐信
2015/03/27 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
2016银行求职自荐信
2016/01/28 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
mysql的数据压缩性能对比详情
2021/11/07 MySQL