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中的jquery PyQuery库使用小结
May 13 Python
Python编程入门的一些基本知识
May 13 Python
python中numpy.zeros(np.zeros)的使用方法
Nov 07 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
Oct 15 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
Feb 07 Python
python如何求圆的面积
Jul 01 Python
PyCharm上安装Package的实现(以pandas为例)
Sep 18 Python
python实现人性化显示金额数字实例详解
Sep 25 Python
python之pygame模块实现飞机大战完整代码
Nov 29 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
Mar 04 Python
python 遍历磁盘目录的三种方法
Apr 02 Python
python基础入门之普通操作与函数(三)
Jun 13 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/11/26 PHP
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
几个有趣的Javascript Hack
2010/07/24 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
JS实现百度搜索框
2021/02/25 Javascript
python之pandas用法大全
2018/03/13 Python
Python3实现购物车功能
2018/04/18 Python
Python生成器generator用法示例
2018/08/10 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
python numpy 按行归一化的实例
2019/01/21 Python
对python中各个response的使用说明
2020/03/28 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
2020/07/07 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
python实现企业微信定时发送文本消息的实例代码
2020/11/25 Python
联想哥伦比亚网上商城:Lenovo Colombia
2017/01/10 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
《日月潭》教学反思
2014/02/28 职场文书
经典安踏广告词
2014/03/21 职场文书
初中国旗下的演讲稿
2014/08/28 职场文书
酒店人事主管岗位职责
2015/04/11 职场文书
花木兰观后感
2015/06/10 职场文书