夺取应用程序的 “制空权”:内存数据

李志宽
• 阅读 1274

技术背景

在病毒查杀,应用安全对抗,静态逆向应用,动态逆向应用,最重要的对象就是,应用程序的内存数据。

病毒查杀对抗:需要获取查杀对象的内存数据进行和病毒库的特征做比对。

应用安全对抗:需要保护自身的内存数据不被转存。

静态逆向应用:遇到应用程序加密保护,那这用IDA就歇菜了,这时获取解密后内存数据就非常重要。

动态逆向应用:用ollydbg进行动态调试应用主要还是调试运行时释放的内存数据。

综上:应用程序的重重之中就是内存数据,我们就来用代码实现获取应用程序的 “制空权”。

效果展示

下面展示的是,读取并操作,正在运行的ClearData进程的内存数据。

  • 图片第一部分是正确读取到的内存数据,并写入到新创建的文件里面,文件大小和进程的原始文件是一致的。
  • 图片第二部分是工作窗口,展示的是读取操作的一些信息。
  • 图片第三部分展示,正在运行的进程信息。

夺取应用程序的 “制空权”:内存数据

代码实现

功能:获取正在运行进程的Pid

实现原理:通过创建一个系统快照,进行遍历所有的进程名称。通过比对进程

名称,来获取进程的PID值。

夺取应用程序的 “制空权”:内存数据

功能:获取正在运行进程的指定模块的基地址数据。

实现步骤:通过PEB获取进程所加载的模块。

1、获取正在运行指定进程的_PEB结构。

2、通过_PEB的Ldr成员获取_PEB_LDR_DATA结构。

3、通过_PEB_LDR_DATA的InMemoryOrderModuleList成员获取_LIST_ENTRY结构。

4、通过_LIST_ENTRY的Flink成员获取_LDR_DATA_TABLE_ENTRY结构,注意:这里的Flink指向的是_LDR_DATA_TABLE_ENTRY结构中的InMemoryOrderLinks成员,因此需要计算真正的_LDR_DATA_TABLE_ENTRY起始地址。

5、输出_LDR_DATA_TABLE_ENTRY的BaseDllName或FullDllName成员信息。

夺取应用程序的 “制空权”:内存数据

夺取应用程序的 “制空权”:内存数据

功能:获得到整个进程的内存数据

实现步骤:

1、打开要操作的指定进程,并获取进程的句柄。

2、通过读取PE文件结构方式,进行读取正在运行的内存数据:

    DosHeader->NtHeader->区段表。

3、将读取到的内存数据,写入到文件。

夺取应用程序的 “制空权”:内存数据

夺取应用程序的 “制空权”:内存数据

知识清单

PE结构概述

PE(Portable Execute)文件,它是Windows下可执行文件的总称,也是windows系统下标准的文件格式。

在window系统上常见的后缀为DLL,EXE,OCX,SYS等文件都是属于PE文件。但事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任何扩展名。

PE文件结构概括起来就是:它主要由 “头”(DOS头,NT头,可选头)和“节”(text节,data节)组成。

在代码中去实现,判断一个可执行文件,是否是PE文件结构。主要有两个判断:

1.DOS头的魔法值字段是否是 “MZ” ,也就是 0x5A4D 值。

2.NT头的签名字段信息是否是 “PE00” ,也就是 0x00004550 值。

下图是一个标准PE文件结构图

夺取应用程序的 “制空权”:内存数据

PEB结构概述

PEB结构(Process Envirorment Block Structure):进程环境信息块。

PEB:它主要是用于存放进程信息,每个进程都有属于自己的PEB信息。

PEB:它位于用户地址空间。

调用系统未导出函数方法

1.ReadProcessMemory函数 夺取应用程序的 “制空权”:内存数据

2. _LIST_ENTRY结构

夺取应用程序的 “制空权”:内存数据

3. _PEB_LDR_DATAS结构 夺取应用程序的 “制空权”:内存数据

4. _LDR_MODULE 结构

夺取应用程序的 “制空权”:内存数据

点赞
收藏
评论区
推荐文章
李志宽 李志宽
2年前
黑客是怎样监控你所有打开EXE程序的?
技术应用背景:目前已知在杀毒厂商以及游戏厂商的安全对抗过程中,常常需要准确的监控收集并进行检测用户创建打开的EXE应用程序是否是安全的。同时也可以将此技术应用于其他应用的安全对抗方案中。那么如何去准确的监控和收集用户每次点击打开的EXE应用程序信息呢?接下来我就进行还原实现下如何准确的监控并收集用户每次点击打开EXE应用程序技术。效果展示:下图展示的是开启
Android逆向前期准备
本公众号分享的所有技术仅用于学习交流,请勿用于其他非法活动,如果错漏,欢迎留言指正《Android软件安全与逆向分析》丰生强《Android应用安全防护和逆向分析》姜维Android逆向前期准备一、前置知识为什么学习安卓逆向1.学习研究去广告破解内购自动化
李志宽 李志宽
2年前
学到了!软件产品安全性?
背景为了提高开发的软件产品安全性,大部分选择的方案防护方案是,通过用成熟的加固软件进行对自己研发的软件做防护,从而达到对软件搭建一个安全防护墙。加固软件主要做的两件事,对软件中关键代码的保护以及提高对软件逆向反编译的门槛。那么软件安全性防护墙的第一道门那就是反调试。反调试技术又细分为静态反调试和动态反调试。下面就针对window端的进行梳理反调试检测方案。
Stella981 Stella981
3年前
Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
MemcachedMemcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap(https://www.oschina.net/action/GoToLin
Stella981 Stella981
3年前
Hibernate对象
1)SessionFactory这是Hibernate的关键对象,它是单个数据库映射关系经过编译后的内存镜像,它也是线程安全的。它是生成Session的工厂,本身需要依赖于ConnectionProvider,该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。2)Session它是应用程序和持久层之间交互操作的一个单
Stella981 Stella981
3年前
SpringBoot 2,用200行代码完成一个一二级分布式缓存
缓存系统的用来代替直接访问数据库,用来提升系统性能,减小数据库负载。早期缓存跟系统在一个虚拟机里,这样内存访问,速度最快。后来应用系统水平扩展,缓存作为一个独立系统存在,如redis,但是每次从缓存获取数据,都还是要通过网络访问才能获取,效率相对于早先从内存里获取,还是不够逆天快。如果一个应用,比如传统的企业应用,一次页面显示,要访问数次redis,那效果
Stella981 Stella981
3年前
Memcached 介绍 协议 结构 分布式 一致性
Memcached简介:    Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。    Memcached是以LiveJour
Wesley13 Wesley13
3年前
Java内存泄漏解析!
前言:内存管理是Java最重要的优势之一,你只需创建对象,Java垃圾收集器会自动负责分配和释放内存。但是,情况并不那么简单,因为在Java应用程序中经常发生内存泄漏。本章会说明什么是内存泄漏,为什么发生,以及如何防止它们。什么是内存泄漏?内存泄漏的定义:应用程序不再使用的对象,垃圾收集器却无法删除它们,因为它们正在被引用。为了理
京东云开发者 京东云开发者
10个月前
浅谈LocalCache | 京东云技术团队
1、什么是LocalCache?本地缓存是一种将数据存储在应用程序内存中的机制,用于提高数据访问的性能和响应速度。它通过在内存中维护一个键值对的存储结构,允许应用程序快速检索和访问数据,而无需每次都从慢速的数据源(如数据库或网络)获取数据。2、LocalC
幂简集成 幂简集成
4天前
应用安全API:短信验证、设备验证、图片验证
为了确保应用程序的安全性和保护用户数据的隐私,开发者需要使用一些必备的应用安全类API。这些API提供了各种功能和服务,帮助开发者有效地应对各种安全挑战。
李志宽
李志宽
Lv1
男 · 长沙幻音科技有限公司 · 网络安全工程师
李志宽、前百创作者、渗透测试专家、闷骚男一位、有自己的摇滚乐队
文章
89
粉丝
25
获赞
43