详解LyScript 内存扫描与查壳实现

 更新时间:2022年09月09日 11:58:47   作者:lyshark  
这篇文章主要为大家介绍了详解LyScript 内存扫描与查壳实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

LyScript 中提供了多种内存特征扫描函数,每一种扫描函数用法各不相同,在使用扫描函数时应首先搞清楚他们之间的差异,如下将分别详细介绍每一种内存扫描函数是如何灵活运用的,最后将实现一个简易版内存查壳脚本,可快速定位目标程序加了什么壳。

先来了解第一个函数scan_memory_all()的特点,该函数用来扫描当前进程内EIP所指向位置处整个内存段中符合条件的特征,如果找到了则返回一个列表,如果没有找到则返回False,该函数与scan_memory_one()函数原理是一致的,唯一的不同是all以列表形式返回所有匹配到的行,one则只返回匹配到的第一条记录,这两个函数都支持??模糊匹配。

如果载入一个程序,默认停留在系统领空,则调用该函数你所能得到的特征记录只能是系统领空特定dll内的特征集。

扫描ntdll.dll模块

例如扫描ntdll.dll模块内的所有特征字段是55 8b ec 83 e4的记录,代码是这样的。

from LyScript32 import MyDebug
if __name__ == "__main__":
    dbg = MyDebug()
    conn = dbg.connect()
    ref_one = dbg.scan_memory_one("55 8b ec 83 e4")
    print("扫描一行: {}".format(hex(ref_one)))
    ref_all = dbg.scan_memory_all("55 8b ec 83 e4")
    for index in range(0, len(ref_all)):
        print("记录: {} 地址: {}".format(index,hex(ref_all[index])))
    dbg.close()

运行效果如下:

有时我们需要指定扫描某个模块,例如扫描进程内的msvcr120.dll模块,里面的特征值。

此时需要想得到该模块的入口地址,然后将EIP切换过去,此时在调用scan_memory_all()来完成搜索,当然最好先备份原始EIP位置,这样扫描完以后可以直接切回去。

from LyScript32 import MyDebug
if __name__ == "__main__":
    dbg = MyDebug()
    conn = dbg.connect()
    # 得到所有模块
    local_module_base = dbg.get_all_module()
    for index in local_module_base:
        # 找到需要的模块
        if index.get("name") == "msvcr120.dll":
            entry = index.get("entry")
            print("扫描入口: {}".format(hex(entry)))
            # 切过去
            dbg.set_register("eip",entry)
            # 开始搜索特征
            scan_ref = dbg.scan_memory_all("5d c2 0c 00 55 8b ec")
            for x in scan_ref:
                print("扫描到: {}".format(hex(x)))
    dbg.close()

输出结果如下:

当然为了使扫描效率更高一些,新版插件中新增了scan_memory_any()函数,该函数无需切换到模块入口处即可实现扫描特定模块内的特征,不过该函数只能返回找到的第一条记录,且需要传入扫描起始位置以及扫描长度,不过得到这些参数并不难。

from LyScript32 import MyDebug
if __name__ == "__main__":
    dbg = MyDebug()
    conn = dbg.connect()
    # 得到进程模块
    local_module = dbg.get_all_module()[0]
    # 得到模块参数
    module_base = local_module.get("base")
    module_size = local_module.get("size")
    print("基地址: {} 长度: {} 结束地址: {}".format(hex(module_base),hex(module_size),hex(module_base+module_size)))
    # 扫描内存
    ref = dbg.scan_memory_any(module_base,module_size,"51 5c a8 f8 4c 34 33")
    if ref != False:
        print("找到内存: {}".format(hex(ref)))
    dbg.close()

扫描结果如下:

查壳功能

如上内存扫描方法如果可以搞明白,那么查壳这个功能就变得很简单了,市面上的查壳软件PEID等基本都是采用特征码定位的方式,所以我们想要实现查壳以及检测编译器特征可以采用特征码扫描法,如下代码即可实现查壳功能。

from LyScript32 import MyDebug
# 查壳功能
def scan(dbg, string):
    # 得到进程模块
    local_module = dbg.get_all_module()[0]
    # 得到模块参数
    module_base = local_module.get("base")
    module_size = local_module.get("size")
    # print("基地址: {} 长度: {} 结束地址: {}".format(hex(module_base),hex(module_size),hex(module_base+module_size)))
    # 扫描内存
    ref = dbg.scan_memory_any(module_base,module_size,string)
    if ref != False:
        return True
    return False
if __name__ == "__main__":
    dbg = MyDebug()
    conn = dbg.connect()
    # 存储特征码
    signs = [
        {"key": "Microsoft Visual C++ 2013", "value": "e8 ?? ?? ?? ?? e9 ?? ?? ?? ?? 55 8b ec"},
        {"key": "UPX 3.96w", "value": "60 be ?? ?? ?? ?? 8d be 00 90 ff ff 57"}
    ]
    for index in signs:
        check = scan(dbg, index.get("value"))
        if check == True:
            print("编译特征: {}".format(index.get("key")))
    dbg.close()

分别检测后输出结果如下:

upx加壳软件输出为

vs2013编译器特征输出

以上就是详解LyScript 内存扫描与查壳实现的详细内容,更多关于LyScript 内存扫描查壳的资料请关注脚本之家其它相关文章!

相关文章

  • Scrapy-Redis结合POST请求获取数据的方法示例

    Scrapy-Redis结合POST请求获取数据的方法示例

    这篇文章主要给大家介绍了关于Scrapy-Redis结合POST请求获取数据的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Scrapy-Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • Python实现TCP探测目标服务路由轨迹的原理与方法详解

    Python实现TCP探测目标服务路由轨迹的原理与方法详解

    这篇文章主要介绍了Python实现TCP探测目标服务路由轨迹的原理与方法,结合实例形式分析了Python TCP探测目标服务路由轨迹的原理、实现方法及相关操作注意事项,需要的朋友可以参考下
    2019-09-09
  • 使用Python的Flask框架构建大型Web应用程序的结构示例

    使用Python的Flask框架构建大型Web应用程序的结构示例

    虽说Flask是一个以轻量级著称的框架,但也为大型Web应用提供了诸如单元测试与数据库迁移等许多便利的功能,这里我们来看一下使用Python的Flask框架构建大型Web应用程序的结构示例:
    2016-06-06
  • 使用python绘制3维正态分布图的方法

    使用python绘制3维正态分布图的方法

    今天小编就为大家分享一篇使用python绘制3维正态分布图的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • OpenCV图像轮廓的绘制方法

    OpenCV图像轮廓的绘制方法

    这篇文章主要为大家详细介绍了OpenCV图像轮廓的绘制方法,以及测试几何图形、花朵图形轮廓,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • pycharm配置QtDesigner的超详细方法

    pycharm配置QtDesigner的超详细方法

    这篇文章主要介绍了pycharm配置QtDesigner的超详细方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Python实战之基于OpenCV的美颜挂件制作

    Python实战之基于OpenCV的美颜挂件制作

    在本文中,我们将学习如何创建有趣的基于Snapchat的增强现实,主要包括两个实战项目:在检测到的人脸上的鼻子和嘴巴之间添加胡子挂件,在检测到的人脸上添加眼镜挂件。感兴趣的童鞋可以看看哦
    2021-11-11
  • python飞机大战pygame游戏之敌机出场实现方法详解

    python飞机大战pygame游戏之敌机出场实现方法详解

    这篇文章主要介绍了python飞机大战pygame游戏之敌机出场实现方法,结合实例形式详细分析了Python使用pygame模块实现飞机大战游戏中敌机出场相关实现技巧,需要的朋友可以参考下
    2019-12-12
  • Python三元运算与lambda表达式实例解析

    Python三元运算与lambda表达式实例解析

    这篇文章主要介绍了Python三元运算与lambda表达式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 如何在Windows中安装多个python解释器

    如何在Windows中安装多个python解释器

    这篇文章主要介绍了如何在Windows中安装多个python解释器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06

最新评论