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 30 Python
在Django的模板中使用认证数据的方法
Jul 23 Python
tensorflow建立一个简单的神经网络的方法
Feb 10 Python
python之super的使用小结
Aug 13 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
Python3实现的判断环形链表算法示例
Mar 07 Python
浅谈python标准库--functools.partial
Mar 13 Python
Django 外键的使用方法详解
Jul 19 Python
详解Python3 pandas.merge用法
Sep 05 Python
Python将list元素转存为CSV文件的实现
Nov 16 Python
教你用Python写一个植物大战僵尸小游戏
Apr 25 Python
python 爬取哔哩哔哩up主信息和投稿视频
Jun 07 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 编写的日历
2006/10/09 PHP
探讨如何把session存入数据库
2013/06/07 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
vue实现图书管理demo详解
2017/10/17 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
浅谈js闭包理解
2019/03/28 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
利用Celery实现Django博客PV统计功能详解
2017/05/08 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
python中的句柄操作的方法示例
2019/06/20 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
python Django里CSRF 对应策略详解
2019/08/05 Python
python中if及if-else如何使用
2020/06/02 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
《英英学古诗》教学反思
2014/04/11 职场文书
家长通知书教师评语
2014/04/17 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
2014年项目工作总结
2014/11/24 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
运动会5000米加油稿
2015/07/21 职场文书
运动会1000米加油稿
2015/07/21 职场文书
《圆的面积》教学反思
2016/02/19 职场文书