详解LyScript 内存扫描与查壳实现
作者:lyshark 发布时间:2022-04-18 07:07:31
LyScript 中提供了多种内存特征扫描函数,每一种扫描函数用法各不相同,在使用扫描函数时应首先搞清楚他们之间的差异,如下将分别详细介绍每一种内存扫描函数是如何灵活运用的,最后将实现一个简易版内存查壳脚本,可快速定位目标程序加了什么壳。
LyScript项目地址:https://github.com/lyshark/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编译器特征输出
来源:https://www.cnblogs.com/LyShark/p/16671876.html
猜你喜欢
- ASP通过XMLDom在服务器端操作XML文件的主要方法和实现对于小数据量,xml文件在检索更新上于ACCESS有很多优势。我曾经测试过不用
- 八皇后问题描述问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子。皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四
- js实现千分符转化function fmoney(s, n){ n = n > 0 && n <= 20 ? n
- 本文实例为大家分享了python学生管理系统的具体代码,供大家参考,具体内容如下类class Student: stuID = "
- keras根据层名称来初始化网络def get_model(input_shape1=[75, 75, 3], input_shape2=[
- 现在介绍加速网页图形显示速度的六种方法,为你解决这个难题。其最基本的宗旨就是,让你用买鱼的价钱,品尝到熊掌的美味和营养。 1.首先要确定图像
- 1. 换源地址# 中科大deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-
- 判断缩进代替大括号。冒号(:)后换号缩进。iftest=100if test>50: print('OK')print
- 默认值可以很方便众所周知,在Python中如果访问字典中不存在的键,会引发KeyError异常(JavaScript中如果对象中不存在某个属
- 以Python 3.x版本为主一、条件语句条件语句基本结构0或null为false,其余则为trueif 判定条件:语句块...可多行els
- 今天我要讲如何远程调试openstack。首先我们使用的工具是Pycharm.1.首先介绍一下环境我的openstack是使用rdo一键安装
- 异常:python3的xadmin主题只显示默认和bootstrap2解决办法:慢慢来相信能遇到这个问题的人,都是已经配置好xadmin的,
- 应用目标:制作文字特效 应用软件:Dreamweaver MX操作难度:★★☆☆☆我们常用的网页制作工具Dreamweaver MX不仅可以
- 并发与锁多个线程共享数据的时候,如果数据不进行保护,那么可能出现数据不一致现象,使用锁,信号量、条件锁互斥锁1. 互斥锁,是使用一把锁把代码
- 如果只是想实现将jenkins的构建结果发送到企业微信进行通知,最简便的方式是安装Qy Wechat Notification Plugin
- 本文实例为大家分享了Python Unittest自动化单元测试框架的具体代码,供大家参考,具体内容如下1、python 测试框架(本文只涉
- Haar特征哈尔特征使用检测窗口中指定位置的相邻矩形,计算每一个矩形的像素和并取其差值。然后用这些差值来对图像的子区域进行分类。haar特征
- Selenium简介与安装 Selenium是什么? Selenium也是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏
- 我就废话不多说了,大家还是直接看代码吧~# 导入pptx包from pptx import Presentationprs = Presen
- 基本功能:能够实现学生成绩相关信息的输入、输出、查找、删除、修改等功能;(使用数据库对数据进行存取)输入并存储学生的信息:通过输入学生的学号