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字符遍历的艺术
Sep 06 Python
Python生成不重复随机值的方法
May 11 Python
详解Python使用tensorflow入门指南
Feb 09 Python
python的staticmethod与classmethod实现实例代码
Feb 11 Python
python:pandas合并csv文件的方法(图书数据集成)
Apr 12 Python
树莓派实现移动拍照
Jun 22 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
Python读取实时数据流示例
Dec 02 Python
Pycharm修改python路径过程图解
May 22 Python
Python Django中间件使用原理及流程分析
Jun 13 Python
python 下划线的多种应用场景总结
May 12 Python
Python图片检索之以图搜图
May 31 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
德生PL990的分析评价
2021/03/02 无线电
两个强悍的php 图像处理类1
2009/06/15 PHP
10个实用的PHP代码片段
2011/09/02 PHP
基于PHP的简单采集数据入库程序【续篇】
2014/07/30 PHP
php实现将Session写入数据库
2015/07/26 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
Javascript Throttle & Debounce应用介绍
2013/03/19 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
关于JS与jQuery中的文档加载问题
2017/08/22 jQuery
Vue中自定义全局组件的实现方法
2017/12/08 Javascript
javascript高仿热血传奇游戏实现代码
2018/02/22 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
用python删除java文件头上版权信息的方法
2014/07/31 Python
详解Django中的form库的使用
2015/07/18 Python
Python实现带百分比的进度条
2016/06/28 Python
python使用PyCharm进行远程开发和调试
2017/11/02 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
基于python中theano库的线性回归
2018/08/31 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
pip安装tensorflow的坑的解决
2020/04/19 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
美国经典刺绣和字母儿童服装特卖:Smocked Auctions
2018/07/16 全球购物
2015年学校党支部工作总结
2015/04/01 职场文书
就业证明函
2015/06/17 职场文书