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 开发Activex组件方法
Nov 08 Python
python连接MySQL、MongoDB、Redis、memcache等数据库的方法
Nov 15 Python
跟老齐学Python之不要红头文件(1)
Sep 28 Python
python生成不重复随机数和对list乱序的解决方法
Apr 09 Python
详解用Python实现自动化监控远程服务器
May 18 Python
opencv3/C++图像像素操作详解
Dec 10 Python
Python数据存储之 h5py详解
Dec 26 Python
Python任务自动化工具tox使用教程
Mar 17 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 Python
python 生成器需注意的小问题
Sep 29 Python
Numpy ndarray 多维数组对象的使用
Feb 10 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中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
php中CI操作多个数据库的代码
2012/07/05 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
PHP7变量处理机制修改
2021/03/09 PHP
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
JS模拟按钮点击功能的方法
2015/12/22 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
JavaScript面试出现频繁的一些易错点整理
2018/03/29 Javascript
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
vue中watch和computed的区别与使用方法
2020/08/23 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Web服务器框架 Tornado简介
2014/07/16 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
2018/05/24 Python
记录Python脚本的运行日志的方法
2019/06/05 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
基于Python实现天天酷跑功能
2021/01/06 Python
详解Python中的Lock和Rlock
2021/01/26 Python
经典c++面试题四
2015/05/14 面试题
大学本科毕业生的自我鉴定
2013/11/26 职场文书
财务会计专业推荐信
2013/11/30 职场文书
团代会主持词
2014/04/02 职场文书
《数星星的孩子》教学反思
2014/04/11 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
银行求职信怎么写
2014/05/26 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
Python与C++中梯度方向直方图的实现
2022/03/17 Python
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫