经常遇到一些软件被保护起来,无法读取其内存数据,今天将基于开源库BlackBone,编写一个简单的内存读写工具。
这里写了个工具,界面如下图所示:
主要功能:
工具会根据“读取方式”,分别执行Windows API、BlackBone API、BlackBone驱动三种方式的内存读取,满足不同的使用场景。
本工具工程github代码地址:703K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6F1K9h3&6W2j5$3g2F1N6s2y4Q4x3V1k6y4P5f1!0H3k6h3^5`.
本工具工程代码上传了BlackBone的VS2017版本的代码,地址为e93K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6F1K9h3&6W2j5$3g2F1N6s2y4Q4x3V1k6y4P5f1!0H3k6h3&6Q4x3V1k6@1K9r3W2J5k6q4)9J5c8V1u0D9j5h3y4C8j5X3!0F1k6b7`.`.。
本工具工程代码地址为1baK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6F1K9h3&6W2j5$3g2F1N6s2y4Q4x3V1k6y4P5f1!0H3k6h3&6Q4x3V1k6U0L8%4g2J5M7$3g2Q4x3V1k6i4K9h3&6p5M7X3W2$3k6i4u0Q4x3V1k6@1L8$3!0D9M7#2)9J5c8Y4c8G2L8$3I4K6i4K6u0W2M7$3I4F1。
不了解BlackBone的,可以参考BlackBone介绍。
驱动环境搭建可参考 [Windows驱动开发] 00_环境搭建 。
集成步骤:
tools-MFC工程中“C/C++ -> 命令行”,添加Blackbone路径/I"../../../../third/Blackbone/src"
/I"../../../../third/Blackbone/src"
代码中引用相关头文件,如下所示:
点击读取按钮,先检测参数,具体代码如下所示:
ReadProcessMemory实现很简单,直接调用该函数即可:
查看ReadProcessMemory函数原型:
参数 lpBaseAddress 的类型是LPVOID,对于32位程序,该值只有4字节,读取64位进程就只能看运气了,如果地址大于4字节,读取的结果是错的(也可能直接失败)。比如,我们读取64位的chrome进程,由于chrome.exe模块地址0x13F630000大于4字节,ReadProcessMemory显示错误的内容。
BlackBone_R3方式实现也很简单,直接调用BlackBone的api函数即可:
BlackBone_R3方式最终调用了Nt函数NtWow64ReadVirtualMemory64(32位的Windows操作系统不知道是不是下面的调用关系),调用关系如下:
BlackBone_R0方式实现如下:
最终R3层调用了DriverControl::ReadMem函数,对应控制码是IOCTL_BLACKBONE_COPY_MEMORY。
而R0层调用了BBCopyMemory函数,而该函数调用了内核API函数MmCopyVirtualMemory实现内存读写。
打开虚拟机,将win64udl_exe.exe、tools-MFC.exe、BlackBoneDrv7.sys拷贝到虚拟机中,运行win64udl_exe.exe程序(不要关闭,保证未签名的BlackBoneDrv7.sys可以正常加载):
打开tools-MFC.exe,选择任意进程,选择读取方式为“blackbone_R0”,点击读取按钮:运行结果如下图所示:
本文章仅供用于技术研究用途,请勿利用文章内容操作用于违反法律的事情。
欢迎各位关注公众号和QQ群进行技术交流,关注有福利喔。
微信公众号:
qq群:IT技术控/953949723
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
hzqst 建议学习一下山总搞的MFC界面
小艾 你写了这么多都不如 MmCopyVirtualMemory 管用
panti 感谢楼主带领大家学习!返回太大了,每次发帖都点着
灵幻空间 大大您这个QQ搜不到哦