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 Socket网络编程
Jan 05 Python
利用Python中unittest实现简单的单元测试实例详解
Jan 09 Python
Python探索之实现一个简单的HTTP服务器
Oct 28 Python
Python发送http请求解析返回json的实例
Mar 26 Python
用python处理图片实现图像中的像素访问
May 04 Python
Python切片操作深入详解
Jul 27 Python
Python读取mat文件,并保存为pickle格式的方法
Oct 23 Python
Python2与Python3的区别实例分析
Apr 11 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 Python
python 计算数据偏差和峰度的方法
Jun 29 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
Aug 26 Python
python 监控logcat关键字功能
Sep 04 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
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
php 类自动载入的方法
2015/06/03 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
php实现word转html的方法
2016/01/22 PHP
js下用层来实现select的title提示属性
2010/02/23 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
JS中多步骤多分步的StepJump组件实例详解
2016/04/01 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
Javascript实现运算符重载详解
2018/04/07 Javascript
JS实现的RC4加密算法示例
2018/08/16 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
python用字典统计单词或汉字词个数示例
2014/04/22 Python
Python性能优化技巧
2015/03/09 Python
详解详解Python中writelines()方法的使用
2015/05/25 Python
Python实现批量压缩图片
2018/01/25 Python
tensorflow识别自己手写数字
2018/03/14 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
Windows下python3.6.4安装教程
2018/07/31 Python
django url到views参数传递的实例
2019/07/19 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
Turnbull & Asser官网:英国皇室御用的顶级定制衬衫
2019/01/31 全球购物
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
艺术应用与设计个人的自我评价
2013/11/23 职场文书
党员先锋岗事迹材料
2014/05/08 职场文书
绿色小区申报材料
2014/08/22 职场文书
五五普法心得体会
2014/09/04 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
婚宴领导致辞
2015/07/28 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP