资讯详情

明翰恶意软件分析笔记V0.1(持续更新)

文章目录

  • 恶意软件分析
    • 恶意软件能做什么?
    • 恶意代码类型
    • 1. 基础静态分析
      • 扫描反病毒引擎工具
        • 指纹恶意代码
      • `查找字符串工具`
      • 加壳
        • PEiD【工具】
      • PE文件格式
        • 文件头 PE header
        • `DLL文件结构`
          • DLL表
        • 分节(Section)
          • `.text(代码段)`
          • .rdata(数据段)
          • `.data(数据段)`
          • .idata(数据段)
          • .edata(数据段)
          • .rsrc
          • .reloc
          • 未整理
      • PE View【工具】
      • PE Studio【工具】
      • PE Viewer【工具】
      • Resource Hacker【工具】
      • 链接库和函数
        • `DLL文件`
        • 静态、运行、动态
        • Dependency Walker【工具】
        • 导入函数
        • 导出函数
    • 2. 基本动态分析
      • 沙盒
      • 操作恶意代码
      • Process Monitor【工具】
      • Process Explorer【工具】
      • Regshot
      • 模拟网络
      • 网络监听
        • Isolated Network Environments
        • Isolated Internet Topology
        • Isolated Network
        • Router VM
        • VMs to provide copies of Internet Serviecs
      • 未整理
    • 3. 高级静态分析
      • 机器码
        • 操作码 opcode
        • 机器代码指令的类型
      • x86体系结构
        • CISC架构
        • CPU
          • `寄存器`
            • `通用寄存器`
            • 标志寄存器
            • 指令指针
        • `指令`
          • 操作码和字节序
          • `操作数Operand`
          • `常见指令`
            • `赋值指令`
            • 运算指令
            • 条件指令
            • 分支指令
            • 重复指令
            • 其他指令
          • 汇编语言
            • 数组
        • 输入输出系统IO
        • `内存RAM`
          • `栈`
          • `栈相关指令`
          • `函数调用`
          • 栈的布局
          • 反汇编Disassembly
      • Ghidra(工具)
      • IDA pro(工具)
        • 快捷键
        • `交叉引用xref`
        • 分析函数
      • Windows
        • `PEB`
        • 注册表Registry
        • Windows API
          • 句柄Handle
      • C语言
        • 主函数
        • C语言函数
      • 对抗反汇编
      • ShellCode
    • 4. 高级动态分析
    • 名词解释
      • Manifest
      • 软件
        • 普通软件
          • `Sysinternals`
          • UPX
        • 恶意软件
          • WannaCry
      • `Cobalt Strike`
      • SolarWinds
        • Solorigate(Sunburst)
        • Teardrop
        • RainDrop
    • 一些资料
  • 一些文件
    • exe
    • dll
  • 常见Windows函数
    • 网络
    • 导出函数
  • 其他资料
    • 基础静态分析
    • 基本动态分析
    • 高级静态分析
      • 反抗反汇编
      • `一些常见指令`
    • Practical Malware Analysis纸质书


恶意软件分析

易攻难守, 恶意代码很的很少, 防御代码写的多。

有的恶意软件,删了之后还会自己重新安装。

分析恶意软件可能需要花很长的时间, 可能持续1个月。

恶意软件可能有多个部分,不止一个文件, 内部文件可以转移。

你可以只能发现第2部分,却发现不了第1部分, 第2部分被清除后,第1部分可能会重新初始化第2部分。

恶意软件可以嵌入正常软件组件中,并被传播。 恶意软件的组件可以休眠一段时间,不运行,不被发现, 需要被特定的前置所触发、引发。

域名可以随机生成吗?怎么弄? 用随机域名来增加跟踪的难度,

起一些与正常软件&文件相似的名字来迷惑用户, 看日志时容易忽略。

可能会触发给一个DNS服务发请求, 可能得到IP地址和值,拿值后触发恶意软件的其他部分去通过HTTPS和内置地址去下载一些东西。

检查本机的DNS网络记录, 如果有定点往1个高仿的域名发请求, 可能就是中了恶意软件。

可以把一些恶意文件隐藏在系统文件夹中。

所有的恶意软件分析的顺序和步骤都是一样的。

不要把恶意软件放到一个文件夹里, 然后就不管了, 可能会被误点击。

把相关文件放进压缩包并设置一个简单密码, 不会被杀毒软件扫描到以及误操作。

一些常规软件也可以用于攻击, 这节课主要是在windows上进行的。

我们会用拿到一些分析软件,有一些基于Linux的, 有一些是基于Windows的。

Analysing the malware to understand what it does, how it got onto the system, what has it changed (what does it done ), what’s its purpose, who put it there? how it works, how to identify it, and how to defeat or eliminate it

有C,C++,汇编的经验会更好。

汇编需要能看懂和理解基础框架, 我们有工具,你不需要看的很流利,

恶意软件的作者可能会做一些加密,迷惑, 阻止我们去分析去阅读。

还可能侦测到你用特定的软件, 那恶意软件就不启动、退出、或休眠。

最后我们要去看在windows上, X86、AMD64的机器码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-edWQLpTQ-1630045248945)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p418)]

恶意软件能做什么

创建、修改、删除文件,包括删除自己, 对注册表的新增或修改,

可以把注册表里加一些东西, 让系统再调用正常文件时也把恶意文件调用。

自身形态千变万化

计算机病毒可以导致硬件故障, 例如伊朗核设施被入侵后导致离心机出现问题等。

国家之间经常进行这种网络攻击去瘫痪对方的系统。

病毒可以从一个电脑复制到另一台电脑, 会删文件,破坏硬盘等等。

恶意代码经常使用一些合法的dll或程序库来帮助自己完成目标。

恶意代码类型

先猜它是什么类型,能做什么, 然后去验证自己的猜想,可以加速分析过程。

一个恶意软件会横跨多个类型,可能会有键盘记录器来收集密码,同时发垃圾邮件+自我传播。

有些病毒是大众的, 有些病毒是专门为你而做的。

像勒索软件这样一般是大众传播,尽量多的感染更多的机器,比较简单,容易被杀毒软件查杀, 但特制恶意软件会更复杂,更难搞,杀毒软件无法帮你防御这种特制的东西。

  • 木马 会伪装成某个东西的软件,你从网上下载游戏、或PDF,可能会下载到你不想要的东西。

  • 计算机病毒,蠕虫 Worm or virus,自我复制,感染其他计算机,

  • 垃圾邮件 Spam-sending malware,在被害者的主机上发送大量垃圾邮件,卖这个发送服务可以赚钱。

  • 间谍软件 Information-stealing malware,监视用户的一举一动,包括记录各种账号密码等信息、尤其是邮箱、银行卡信用卡等,将这些敏感信息发送给攻击者。可以使用:sniffers, password hash grabbers, and keyloggers。

  • 勒索软件 Scareware,恐吓受害者,并勒索他们购买。也可能是加密你所有的文件让你支付比特币,也可能是告诉你你浏览了恶意网站让你支付罚款等。

  • 僵尸网络 Botnet,取自机器人robot的后半部分和网络network的前半部分。因此,僵尸网络的表面意思是由机器人组成的网络。允许控制者访问系统,执行命令从控制命令服务器中。

  • 下载器 Downloader,只用来下载和安装其他恶意代码,获得系统访问后,先安装这个。

  • 启动器 Launcher,用来启动其他恶意代码,用一些非传统手段来保证隐秘性。

  • 内核套件 Rootkit,嵌入进系统,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。持久并毫无察觉地驻留在目标计算机中,对系统进行操纵、并通过隐秘渠道收集数据的程序。Rootkit的三要素就是:隐藏、操纵、收集数据。“Rootkit”中root术语来自于unix领域。由于unix主机系统管理员账号为root账号,该账号拥有最小的安全限制,完全控制主机并拥有了管理员权限被称为“root”了这台电脑。然而能够“root”一台主机并不意味着能持续地控制它,因为管理员完全可能发现了主机遭受入侵并采取清理措施。因此Rootkit的初始含义就在于“能维持root权限的一套工具”。 简单地说,Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。Rootkit通过加载特殊的驱动,修改系统内核,进而达到隐藏信息的目的。rootkit介绍Rootkit是一种奇特的程序,它具有隐身功能:无论静止时(作为文件存在),还是活动时,(作为进程存在),都不会被察觉。换句话说,这种程序可能一直存在于我们的计算机中,但我们却浑然不知,这一功能正是许多人梦寐以求的——不论是计算机黑客,还是计算机取证人员。黑客可以在入侵后置入Rootkit,秘密地窥探敏感信息,或等待时机,伺机而动;取证人员也可以利用Rootkit实时监控嫌疑人员的不法行为,它不仅能搜集证据,还有利于及时采取行动! Rootkit 的目的在于隐藏自己以及不被其他软件发现。它可以通过阻止用户识别和删除攻击者的软件来达到这个目的。Rootkit 几乎可以隐藏任何软件,包括文件服务器、键盘记录器、Botnet 和 Remailer。许多 Rootkit 甚至可以隐藏大型的文件集合并允许攻击者在您的计算机上保存许多文件,而您无法看到这些文件。 Rootkit攻击方式多针对类似敏感数据剽窃这样的环节,那么某企业或政府组织“中央服务器”一类设备自然是植入Rootkit的首选目标,可这样的主机设备往往防护严密,不能轻易得手。我们知道数据并不是静止的存放在服务器中,它往往在机构的网络中流动。机构中级别较高的人员常会拥有对这些设备数据的读写权限,但他们所拥有的个人电脑的防护级别却通常比中央服务器要低,这就会给剽窃数据的黑客以可趁之机——将Rootkit程序植入相关人员的个人电脑,并默默的安家,不时地传回重要数据。

  • 后门 Backdoor,后门是指绕过安全控制而获取对程序或系统访问权的方法。后门的最主要目的就是方便以后再次秘密进入或者控制系统,执行命令。主机上的后门来源主要有以下几种: 攻击者利用欺骗的手段,通过发送电子邮件或者文件,并诱使主机的操作员打开或运行藏有木马程序的邮件或文件,这些木马程序就会在主机上创建一个后门。攻击者攻陷一台主机,获得其控制权后,在主机上建立后门,比如安装木马程序,以便下一次入侵时使用。还有一种后门是软件开发过程中引入的。在软件的开发阶段,程序员常会在软件内创建后门以方便测试或者修改程序中的缺陷,但在软件发布时,后门被有意或者无意忽视了,没有被删除,那么这个软件天生就存在后门,安装该软件的主机就不可避免的引入了后门。大多数后门设法躲过日志,大多数情况下即使入侵者正在使用系统也无法显示他已在线。后门的引入无疑会形成重大安全风险。知道后门的人,日后可以对系统进行隐蔽的访问和控制,而且后门也容易被入侵者当成漏洞进行攻击。

1. 基础静态分析

Basic analysis, just looking at the ‘properties’ of the malware.

分析目标文件的程序指令与结构来确定其功能是什么。

Static Analysis — Looking at the Malware ‘at Rest’ 不会去运行恶意程序,而是把程序放到一个特定的分析软件中,展示可运行文件的不同部分。

基础静态分析会有报告生成, 给动态分析留下线索, 理清思路,留下逻辑框架。

通过基本静态分析可以简单快速地判断出某个文件是否是恶意的,但对待高端的恶意代码往往无效。

先分析一下正常软件,再分析一下恶意软件, 看看有什么显著的区别。

反病毒引擎扫描【工具】

VirusTotal,是一个提供免费的可疑文件分析服务的网站。

对一个文件进行多种反病毒引擎扫描是有必要的,因为大家用的特征库都不一样。

https://www.virustotal.com

恶意代码作者可以很轻易的修改自己的代码, 躲过杀毒软件的特征引擎扫描。

一些特定的恶意代码并不在杀毒软件的特征库中,没办法被察觉到。

一些新型恶意代码会绕过检验。

Imports 看引入了哪些函数哪些windows的API

可以看到文件的hash

https://www.virustotal.com/gui/file/cc695909a072cb8c1da4dbb69385737465f59c31c12c0253a97516d4cf34105c/details

https://www.virustotal.com/gui/file/be1a5327e00826b456c8e8188e5a45e343d2d730320cc46fdc96347e472e5d12/details

Name显示曾经使用过的名字, 恶意软件会经常改名字, 不要用文件名来判断, 用文件的哈希值来判断。

恶意代码的指纹

使用哈希来识别恶意代码, 文件哈希:对整个文件的内容运行一个算法, 并根据内容生成一个"唯一"的数字(哈希值), 用来唯一标识文件。

256位长,可能会发生哈希碰撞, 2个文件的哈希完全一致,比较少见。

可以用这个VirusTotal软件看哈希, 也可以用系统命令

shasum -a 256 /Users/yangminghan/Downloads/tools/Discord.dmg

MD5与SHA-1算法比较常见。

可以拿这个哈希值当标签,或与他人共享,帮助他们识别代码,或在线搜索,看这个恶意代码是否被破解。

查找字符串【工具】

从文件中的字符串列表,函数, 文件头信息中发掘有用信息。

定义在程序中的字符串可以发现这个软件主要是负责做什么的,与操作系统的哪部分进行通信,可以猜出这个软件要做什么,例如调用了Windows API的XXX钩子,有可能是用来记录日志的。

可以通过软件分析文件里的字符串, 通过字符串来判断出目标软件的目的。

Windows同时使用ASCII和Unicode字符, 因此需要寻找这两种类型的字符串。

可以用程序(名字叫strings)来找到这些字符串。

https://docs.microsoft.com/en-gb/sysinternals/downloads/strings

• Looking at strings can reveal various things about the program • Filenames • Registry Keys • Network addresses • Error messages (these can be very helpful) • Names of functions called…

也可能查出一些没有意义的字符串,忽略就好, 如果一个字符串很短又不是一个单词的话, 可以忽略掉。

通过错误信息就能猜出大概要实现什么功能, 例如邮件错误, 就知道作者想发邮件并且是用windows自己的邮件服务。

在使用strings软件时,可以设置一些参数去指定一些功能让你更方便查找信息,可以把信息导出成文本文件。

strings -n 5 C:\Windows\System32\kbd101a.dll

加壳

恶意代码作者会经常使用加壳、加密、模糊化(可以用其他程序模拟解密过程,详细看视频)技术让他们的代码更难以检测或分析,就没有或很难找到字符串信息。

正常文件的字符串会很多, 加壳后的文件会被压缩,字符串会很少, 可以证明如果字符串很少的软件,大部分是恶意的。

加壳代码一般会包含LoadLibrary(),GetProcAddress()函数, 用来加载和使用其他函数功能。

作者拿到原始文件后进行压缩, 导致文件内的字符串等信息都不可见, 之后往文件开头加入一段机器码, stub,文件仍然是可执行的。

运行程序时,会先运行一小段脱壳代码用来解压, stub里的代码负责解压文件, 把文件恢复正常大小后再去运行。

黑客可以对EXE和DLL文件加壳。

PEiD【工具】

使用PEiD去是否文件被加壳, 以及检查加壳器的类型,编译器类型。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BfGuXidL-1630045248948)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p424)] 识别出加壳器,UPX加壳工具非常流行。

当文件被加壳后,你必须进行脱壳才能继续分析。 UPX的脱壳比较简单,下载upx.sourceforge.net,运行命令:upx -d xxx.exe

e.g. by using UPXPacker https://upx.github.io

注意,很多PEiD插件会在没有警告的情况下去运行恶意代码,因此一定要在虚拟机上进行,并且用最新版。

PEiD(PE Identifier)是一款著名的查壳工具,其功能强大,几乎可以侦测出所有的壳,其数量已超过470种PE文档的加壳类型和签名。

好像只能用于32位文件。

Can use the program PEiD to detect if a file has been packed or not.

You can use PEiD to detect the type of packer or compiler employed to build an application, which makes analyzing the packed file much easier.

Development and support for PEiD has been discontinued since April 2011, but it’s still the best tool available for packer and compiler detection.

In many cases, it will also identify which packer was used to pack the file.

PE文件格式

可移植的可执行文件,PE(Portable Executable)文件格式是Windows操作系统上运行的可执行文件的总称,包括可执行文件、对象代码、和DDL所使用的标准格式, 常见的有DLL,EXE,OCX,SYS(驱动程序),VXD,VDM等。

PE文件格式是一种数据结构,包含为Windows操作系统加载器管理可执行代码所必要的信息。

文件格式可以揭示出很多关于程序功能的信息。

PE文件以文件头开始,其中包括代码信息,应用程序类型,所需的代码库与空间要求,这些信息非常有价值。

可移植性(Portable)是指在任何机器(Intel 386 、MIPS 、Alpha 、Power PC 等)上的Microsoft Windows操作系统都可以使用相同的可执行文件格式,指该文件格式的通用性,使得程序加载器以及程序开发工具不需要针对每一个新的操作系统重写。

Portable是指对于不同的Windows版本和不同的CPU类型上PE文件的格式是一样的,当然CPU不一样了,CPU指令的二进制编码是不一样的。 只是文件中各种东西的布局是一样的。

PE文件使用的是一个平面地址空间,所有代码和数据都合并在一起,组成一个很大的结构。

PE是一种用于可执行文件、目标文件和动态链接库的文件格式,主要使用在32位和64位的Windows操作系统上。

PE文件格式封装了Windows操作系统加载可执行程序代码时所必需的一些信息。这些信息包括动态链接库、API导入和导出表、资源管理数据和线程局部存储数据。

PE(“portable executable”,可移植的可执行文件)文件格式,是微软WindwosNT,Windows95和Win32子集中的可执行的二进制文件的格式;在WindowsNT中,驱动程序也是这种格式。它还能被应用于各种目标文件和库文件中。

PE文件格式结构: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EN9xQAhG-1630045248951)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p422)]

简化结构: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FVpYfTn0-1630045248953)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p423)]

https://baike.baidu.com/item/PE%E6%A0%BC%E5%BC%8F/9812617?fr=aladdin

https://blog.csdn.net/shitdbg/article/details/49734495

https://blog.csdn.net/qq_30145355/article/details/78859214

https://blog.csdn.net/evileagle/article/details/11693499

https://blog.csdn.net/weixin_34375054/article/details/85566610?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control

https://blog.csdn.net/rivershan/article/details/15783?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control

https://blog.csdn.net/rivershan/article/details/15783?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-6.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-6.control

https://blog.csdn.net/HackerJLY/article/details/3257207?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-12.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-12.control

https://wiki.osdev.org/PE

https://blog.csdn.net/lvzhuyiyi4/article/details/8059072?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242

文件头 PE header

PE files begin with a header that includes information about the code, the type of application, required library functions, and space requirements. The information in the PE header is of great value to the malware analyst.

https://blog.csdn.net/StriveScript/article/details/6279488

https://www.77169.net/html/271468.html

https://www.sohu.com/a/278839463_653604

https://www.y4f.net/71203.html

https://bbs.pediy.com/thread-21932.htm

https://zhuanlan.zhihu.com/p/31967907

https://www.cnblogs.com/mfm11111/archive/2009/04/18/1438474.html

https://www.cnblogs.com/mfm11111/archive/2009/04/18/1438848.html

https://www.4hou.com/posts/5QnB

https://www.cnblogs.com/qintangtao/archive/2013/01/11/2857179.html

https://my.oschina.net/u/4293620/blog/3809007

https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182015051313294800001

PE文件头比只查看导入函数提供更多的有价值的信息, PE文件格式包含一个PE文件头, 后面跟着一系列的分节, 文件头中包含了有关文件本身的元数据, 之后每个分节都包含着有用信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5SNmBTL0-1630045248954)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p433)]

Dos MZ Head与Dos stub和称Dos文件头, PE文件的第一个字节起始于MS-Dos头部, 被称作IMAGE_DOS_HEADER, 紧随Dos stub的是PE文件头(PE header), PE Header是PE相关结构NT映像头(IMAGE_NT_HEADERS)的简称, 其中包含了许多PE装载器用到的重要字段。

PE头表示为结构体IMAGE_NT_HEADERS, 其中IMAGE_NT_HEADERS中包含着另外两个结构体: 1.IMAGE_FILE_HEADER,包含一些底层的硬件物理信息,不是特别常用。 2.IMAGE_OPTIONAL_HEADER32,包含了关于PE文件逻辑分布的信息,这个结构体是PE中最大的结构体,其中比较重要的几项:

  1. 入口点,Entry Point;
  2. 文件偏移地址,File Offset;
  3. 虚拟地址,Virtual Address,简称:VA,文件被载入虚拟空间后的地址;
  4. 基地址,ImageBase;
  5. 相对虚拟地址,Relative Virual Address,简称:RVA,代码在内存中相对于基地址的偏移,RVA = VA - ImageBase;
  6. AddressOfEntryPoint(RVA):这是PE文件开始执行的位置,通常会落在 .text section.此域适用于exe或dll。A pointer to the entry point function, relative to the image base address. For executable files, this is the starting address. For device drivers, this is the address of the initialization function. The entry point function is optional for DLLs. When no entry point is present, this member is zero.

PE装载器准备运行的PE文件的第一个指令的RVA。 若您要改变整个执行的流程, 可以将该值指定到新的RVA, 这样新RVA处的指令首先被执行。

  1. BaseOfCode(RVA):where does Windows start loading the program into memory. base代表开头,后面跟着其他的东西。 代码段的开始地址,表示程序中的Code Section从何开始。Code Section通常在Data Section之前,在PE表头之后。微软链接器所产生的exes中,此值通常为0x1000。Borland 的TLINK32则通常指定此值为0x10000。因为预设情况下TLINK时以64k为对齐粒度的,而MS用的是4k。A pointer to the beginning of the code section, relative to the image base.

在X86系统中, 每个内存页的大小是4KB,即0X1000个字节。

一些基础:

内存中使用VA(Virtual Address,虚拟地址)来表示位置。文件加载到内存时,情况就会发生变化(节区大小、位置等)。

在运行一个可执行文件时,将它装载入内存中,主要就是将一个PE文件的某一部分映射到地址空间中。这样,PE文件的数据结构在磁盘和内存中就是一样的了(windows加载器遍历PE文件并决定文件的哪一部分被映射)。

文件偏移地址(或物理地址):当PE文件存储在磁盘上时,各个数据的地址。一般我们用16进制编辑工具打开后显示的就是。

虚拟地址:由于Windows运行在保护模式下,所以程序访问存储器所使用的逻辑地址就是虚拟地址,简称VA,又称为内存偏移地址。

虚拟地址为什么一定要转化为物理地址的原因: 计算机中的物理内存是字节的线性数组,每字节具有一个唯一的物理地址;程序中的地址是由两部分构成的逻辑地址。这种逻辑地址并不能直接用于访问物理内存,而需要使用地址变换机制将它变换或映射到物理内存地址上。内存管理机制即用于将这种逻辑地址转换成物理内存地址。那么我们要修改时,就需要将物理地址映射到虚拟地址了。

基地址,程序运行时,被映射到程序指定内存处。内存处的起始地址就是基地址。

相对虚拟地址(RVA):是指相对于基地址的偏移量。RVA 代表相对虚拟地址。简言之,RVA是虚拟空间中到参考点的一段距离。我打赌您肯定熟悉文件偏移量: RVA就是类似文件偏移量的东西。当然它是相对虚拟空间里的一个地址,而不是文件头部。

RELATIVE VIRTUAL ADDRESS • This works, but slightly complicated by the fact that the addresses are all stored in memory as Relative Virtual Addresses

• Need to add the address of the base of the DLL onto them before using them

• To both the name pointers and the address of the function

• If disassembling shell code, keep an eye out for techniques like this…

为什么PE文件格式要用到RVA呢? 这是为了减少PE装载器的负担。因为每个模块多有可能被重载到任何虚拟地址空间,如果让PE装载器修正每个重定位项,这肯定是个梦魇。相反,如果所有重定位项都使用RVA,那么PE装载器就不必操心那些东西了: 它只要将整个模块重定位到新的起始VA。这就象相对路径和绝对路径的概念: RVA类似相对路径,VA就象绝对路径。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AIrGUFsW-1630045248955)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p484)]

ImageBase: 是程序被载入到内存的地址

The preferred address of the first byte of the image when it is loaded in memory. This value is a multiple of 64K bytes. The default value for DLLs is 0x10000000. The default value for applications is 0x00400000, except on Windows CE where it is 0x00010000.

ImageBase包含了什么? Where the program has been compiled to be loaded to. Contains the address to load the program.

什么是Image? 映像,加载到内存中的PE文件。

ImageBase是映像的基地址,这个基地址是建议,对于DLL来说,如果无法加载到这个地址,系统会自动为其选择地址。

Assuming the program is not relocated when loaded, where will the program start executing code?

The memory location where the first instruction will be placed can be found using the following formula: EP (Memory) = AddressOfEntryPoint + ImageBase

A说法 基地址,PE文件的优先装载地址。比如,如果该值是400000h,PE装载器将尝试把文件装到虚拟地址空间的400000h处。"优先"表示若该地址区域已被其他模块占用,那PE装载器会选用其他空闲地址。

B说法 ImageBase是程序在虚拟空间中被装载的位置,exe加载到内存的时候,所在的地址???

C说法 ImageBase是程序载入内存的初始地址,也就就整个PE文件的最前面入口地址,通过这个地址可以定位到PE的任何结构数据???

D说法 指出文件的优先装入地址。也就是说当文件被执行时,如果可能的话,Windows优先将文件装入到由ImageBase字段指定的地址中,只有指定的地址已 经被地址中。链接器产生可执行文件的时候对应这个地址来生成机器码,所以当文件被装入这个地址时不需要进行重定位操 作,装入的速度最快,如果文件被装载到**地址的话,将不得不进行重定位操作,这样就要慢一点。

对于EXE文件来说,由于每个文件总是使用独立的 虚拟地址空间,优先装入地址不可能被的DLL使用,所以DLL文件中必须包含重定位信息以防万一。因 此,在前面介绍的 IMAGE_FILE_HEADER 结构的 Characteristics 字段中,DLL 文件对应的 IMAGE_FILE_RELOCS_STRIPPED 位总是为0,而EXE文件的这个标志位总是为1。

在链接的时候,可以通过对link.exe指定/base:address选项来自定义优先装入地址,如果不指定这个选项的话,一般EXE文件的默认优先装入地址被定为00400000h,而DLL文件的默认优先装入地址被定为10000000h。

E说法 提供整个二进制文件包括所有头的优先(线性)载入地址(‘ImageBase’,“映象文件基址”)。这是一个文件已被链接器重定位后的地址(总是64KB的倍数)。如果二进制文件事实上能被载入这个地址,那么加载器就不用再重定位文件了,也就节省了一些载入时间。 优先载入地址在另一个映象文件已被先载入那个地址(“地址冲突”,在当你载入好几个全部按照链接器的缺省值重定位的DLL文件时经常发生)时,或者该内存已被用于其它目的(堆栈、malloc()、未初始化数据、或不管是什么)时,就不能用了。在这些情况下,映象文件必须被载人其它的地址,并且需要重定位(参见下面的“重定位目录”)。如果是一个DLL文件,这么做还会产生其它问题,因为此时的“绑定输入”已不再有效,所以使用DLL的二进制文件必须被修正----参见下面的“输入目录”一节。

F说法 当PE文件被装载到内存空间中去时,ImageBase指出文件的优先装入地址。执行PE文件时,PE装载器先创建进程,再将文件载入内存,然后把EIP寄存器的值设置为ImageBase + AddressOfEntryPoint。

AddressOfEntryPoint(RVA) 程序入口,程序最先被执行的代码起始地址,文件被执行时的入口地址,如果在一个可执行文件上附加了一段代码并想让这段代码首先被执行,那么只需要将这个入口地址指向附加的代码就可以。

对于exe这个地址可以理解为WinMain,对于dll个地址可以理解为DllMain,如果是驱动程序,可以理解为DriverEntry。当然,实际上入口点并非是WinMain,DllMain和DriverEntry,在这些函数之前还有一系列初始化要完成。

程序在内存中展开的真正入口: 标准PE头后0x10 AddressOfEntryPoint + 标准PE头后0x1C ImageBase

DLL文件结构

• Once we’ve found the address where the DLL has been loaded

• Can then parse the PE file format (in memory) to find the address of any functions of interest

• PE has several tables we need to consult

• Main table of interest is the Export Address Table • Contains the address of each function

• But it is indexed by ordinals — need to find the ordinal for the function of interest

Ordinal is just a number Export table might not necessarily start at ordinal 1 — need to consult the base ordinal details

https://docs.microsoft.com/en-us/windows/win32/debug/pe-format

DLL表

• Another table is the Export Name Pointer Table — list of the names of functions

• Can search this to find the function name (manually!)

• But the index into this table is not the ordinal

• Fortunately, there is another table we can use — Export Ordinal Table

• Can use the index of the name in the Export Name Pointer Table

• To find the ordinal in the Export Ordinal Table

• Then use that ordinal in the Export Address Table to find the address

Remember you don’t know where strcmp is so you’ll need to provide your own…

Can be done quickly by reading longwords and comparing with constants in m/code e.g. the constant 0x50746547 would match the first four bytes of GetProcAddress

This section records the exports of the image (yes, EXEs can export things). This takes the form of:

The export address table: an array of length N holding the addresses of the exported functions/data (the addresses are stored relative to the image base). Indexes into this table are called ordinals.

The export name pointer table: an array of length M holding pointers to strings that represent the name of an export. This array is lexically ordered by name, to allow binary searches for a given export.

The export ordinal table: a parallel array of length M holding the ordinal of the corresponding name in the export name pointer table.

http://blog.omega-prime.co.uk/2011/07/04/everything-you-never-wanted-to-know-about-dlls/

A piece of code is being delivered by an exploit (such as a buffer overflow) to a remote machine, explain how the exploit might make use of the Portable Exe- cutable header structure of DLLs to call Windows API functions.

Code will need to find the address of Windows API manually by walking the PE file format • Can find the start of a DLL, by using the PEB to find the DLLs. • Once the correct DLL has been found, we can use the PE file format to find • Export Name Pointer Table to find the name of function • Map offset of the function in name in the Export name table to ordinal in Export ordinal Table • Then use the ordinal to find address of function in the Export Address Table • Call the address to execute function

访问DLL有2种形式: in the standard fashion (using LoadLibrary) manually via the Process Environment Block

分节(Section)

PE文件格式把可执行文件分成若干个数据节(section ),不同的资源被存放在不同的节中。 一个典型的PE文件中包含的节如下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5b3wemqf-1630045248956)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p428)]

.text(代码段)

一般来说,这是唯一可以让CPU执行指令的section, 也是唯一包含代码的section

由编译器产生,存放着二进制的机器代码, 也是我们反汇编和调试的对象。

默认的代码区块,它的内容全是指令代码, 链接器把所有目标文件的text块连接成一个大的.text块, 使用Borland C++, 编译器产生的代码存放在CODE的区域里。

可读、可执行

.rdata(数据段)

通常包含导入导出函数信息, 与Dependency Walker和PEview所获得的信息是相同的, 还可以存储程序所使用的其他只读数据。

资源数据段,程序用到什么资源数据都在这里(包括自己打包的,还有开发工具打包的)

默认只读数据区块,但程序中很少用到该块中的数据,一般两种情况用到,一是MS 的链接器产生EXE文件中用于存放调试目录,二是用于存放说明字符串,如果程序的DEF文件中指定了DESCRIPTION,字符串就会出现在rdata中

.data(数据段)

包含了程序的全局数据,本地数据并不存储在这里。 存放初始化的数据块, 如宏定义、全局变量、全局常量、静态变量等。

默认的读/写数据块

有些文件中还会包含.idata和.edata节, 来存储导入导出信息。

.idata(数据段)

.idata包含可执行文件所使用的外来的DLL函数、文件、数据等信息,即输入表。

导入函数的代码段,存放外部函数地址。(当然还有 edata,导出函数代码段,但不常用)

将.idata区块合并成另一个区块已成为一种惯例, 典型的是.rdata区块,默认的, 链接器只在创建一个Release模式的可执行文件时才能将idata合并到另外一个区块中。

.edata(数据段)

输出表,当创建一个输出API或数据的可执行文件时, 连接器会创建一个.EXP文件,这个.EXP文件包含一个.edata区块,其会被加载到可执行文件中, 经常被合并到.text或.rdata区块中

.rsrc

存放可执行文件所使用的的资源,这些内容并不是可执行的,比如图标、图片、菜单项、字符串等。

字符串可以存储在.rsrc,或中程序中。 在.rsrc中经常存储的字符串是为了提供多语言支持的。

包括模块的全部资源,这个区块是只读的, 无论如何不应该把它命名为.rsrc以外的名字, 也不能合并到其他的区块里。

.reloc

可执行文件的基址重定位,基址重定位一般仅Dll需要的

Contains information for relocation of library files

未整理

.bss 未初始化的数据,很少在用,取而代之的是执行文件的.data区块的的VirtualSize被扩展大的空间里用来装未初始化的数据. .crt 用于C++ 运行时(CRT)所添加的数据 .tls TLS的意思是线程局部存储器,用于支持通过_declspec(thread)声明的线程局部存储变量的数据,这包括数据的初始化值,也包括运行时所需要的额外变量

.sdata 相对于全局指针的可被定位的 短的读写数据 .pdata 异常表,包含CPU特定的IAMGE_RUNTIME_FUNTION_ENTRY结构数组,DataDirectory中的IMAGE_DIRECTORY_ENTRY_EXCEPTION指向它. .didat 延迟装入输入数据,在非Release模式下可以找到

PE View【工具】

使用PE View可以查看PE文件格式中的PE头和section信息。

Windows使用PE格式来存储文件和程序, 通过PE View,可以看到程序的文件结构, 都是人类能看得懂的东西,而不是一堆16进制数据。

里面的信息是可以被篡改的,不一定100%正确。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ooXrFCfL-1630045248958)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p429)]

IMAGE_NT_HEADERS(可以看Section数量,后面可以看每个section的详细内容,时间,64还是32位文件等)

1显示PE文件头信息, 前面的IMAGE_DOS_HEADER与MS-DOS-Stub Program没有价值, 不用看。Signature不用看。

2显示关于文件的基本信息。 3显示编译时间,这里可以作假,很老的编译时间意味着古老的攻击,也许杀毒软件可以cover的住。但Delphi程序的编译时间统一为1992-6-19。

IMAGE_OPTIONAL_HEADER(可选映像头)包含:

程序执行入口,AddressOfEntryPoint。 指出文件被执行时的16进制的入口地址, 这是一个RVA地址, 如果在一个可执行文件上附加了一段代码并想让这段代码首先被执行, 那么只需要将这个入口地址指向附加的代码就可以了。

Subsystem,子系统,指出是控制台程序是IMAGE_SUBSYSTEM_WINDOWS_CUI还是图形界面程序IMAGE_SUBSYSTEM_WINDOWS_GUI。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ac6t8Xid-1630045248961)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p430)] IMAGE_SECTION_HEADER, 节名称发生变化是可以的,理论上都是一致的。 1的虚拟大小表示在加载过程中需要分配多少空间给1个section。 2的原始数据大小表示在磁盘上这个section的大小规模, 这2个值应该是相等,表示硬盘与内存相同, 有小差别是正常。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0NzLUEs-1630045248963)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p431)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uo39UpZu-1630045248964)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p432)]

查看SECTION .rdata,[IMPORT/EXPORT]Address Table表示导入导出函数列表

PE Studio【工具】

非教材

PeStudio是一款验证应用程序的免费工具, 适用于开发者、测试员和维护、分析人员。

列出某一个应用程序使用的所有DLL库,字符串等信息。 验证应用程序是否过时,并存在潜在安全风险。

可以直观显示被标记为黑名单的导入导出函数。

PE Viewer【工具】

非教材

Resource Hacker【工具】

老师没提过,如果有用到需要再看那本书,在1.8.2章节

用于分析.rsrc节,资源相关。

链接库与函数

关于可执行文件, 我们能收集到的最有用的信息之一是它所导入的函数列表。

在PE文件头中找到的信息可以看到链接了哪些库。

DLL文件

一般来说,DLL文件没法自已独立运行, 需要被EXE程序调用。

DLL(Dynamic Link Library)文件,又叫动态链接库文件。

静态库和动态库的区别是: 静态库在程序的链接阶段被复制到了程序中;

动态库在链接阶段没有被复制到程序中, 而是程序在运行时由系统动态加载到内存中供程序调用。

使用动态库的优点是系统只需载入一次动态库, 不同的程序可以得到内存中相同的动态库的副本, 因此节省了很多内存, 而且使用动态库也便于模块化更新程序。

DLL和EXE文件一样, 其中包含的也是程序的二进制执行代码和程序所需的资源(比如图标、对话框、字符串等),可是为什么要把代码放在DLL里面,而不是做成EXE呢?

其实DLL中的代码是以API函数形式出现的,通俗地说,DLL中包含的程序代码都被做成了一个个小模块, 应用程序通过按下所需DLL中特定的按钮, 来调用DLL中这个按钮所代表的功能。

在使用“记事本”等程序时,如果要保存文件或打开文件,就会弹出通用文件对话框,让我们选择文件位置。 这就是调用了系统底层DLL中的通用对话框界面。

Windows系统使用DLL文件来实现操作系统的[方法/函数/功能],在DLL文件中可以调用Windows的API供我们编程使用,Win32 API,64等。

当程序加载时,你的pre-code连接程序与功能, 通过PE文件,我们可以看到哪些函数被引用,

库文件一般指计算机上的一类文件,分两种, 一种是静态库,另一种是动态库即

在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。

可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类。在库文件的发展史上经历了“无库-静态链接库-动态链接库”的时代。静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,库中的指令都被直接包含在最终生成的可执行文件中了。但是若使用动态链接库,该库文件则不必被包含在最终可执行文件中,可执行文件执行时可以“动态”地引用和卸载这个与可执行文件独立的库文件。

①扩展应用程序

由于DLL能被应用程序动态载入内存。所以,应用程序可以在需要时才将DLL载入到内存中,这让程序的可维护性变得很高。比如QQ的视频功能需要升级,那么负责编写QQ的程序员不必将QQ所有代码都重写,只需将视频功能相关的DLL文件重写即可。

②便于程序员合作

这个和我们最终用户关系不大,仅供了解。我们都知道编程工具有很多,比如VB、VC、Delphi等,如果好几个人合作来编写一个大的程序,那么可能有的人用VB,有的人用VC,每人负责的部分所使用的编程语言都不同,究竟放在哪个编译器中进行编译呢?这就好比一群来自各个国家的人在共同编写一篇文章,如果他们所使用的语言都不同,写出来的文章怎么可能凑到一起呢?而有了DLL后,可以让VC程序员写一个DLL,然后VB程序员在程序中调用,无需为怎么将它们都编译为一个单独的EXE而发愁了。

③节省内存

如果多个应用程序调用的是同一个动态链接库,那么这个DLL文件不会被重复多次装入内存中,而是由这些应用程序共享同一个已载入内存的DLL。就好比一个办公室中,很少会为每一个员工配置一台饮水机的,而是在一个公共位置放上一个饮水机,所有需要喝水的职员都可以共用这台饮水机,降低了成本又节约了空间。

④共享程序资源

包括刚才提到过的通用文件对话框在内,DLL文件提供了应用程序间共享资源的可能。资源可以是程序对话框、字符串、图标,或者声音文件等。

⑤解决应用程序本地化问题

在下载了某个程序的汉化包后,打开汉化说明,经常可以看到用下载包中的DLL文件覆盖掉程序原来的DLL,汉化就完成了。这些程序都是将执行代码和应用程序界面分开编写了,所以汉化者只需简单地将其中和程序界面相关的DLL汉化并发布即可。

静态、运行时、动态

代码库可以被静态,运行时,动态链接。

静态链接:所有当前代码库中的代码都会被复制到可执行程序中,这会增大可执行程序的体积。难以区分是否被静态链接过,因为PE文件头没有显示相关信息。

运行时链接:在恶意代码中很常用,只有在需要使用函数时,才链接到库。

动态链接:程序启动时链接。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rJVzoaJw-1630045248970)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p425)]

Dependency Walker【工具】

使用Dependency Walker查看可执行文件的动态链接函数。

可以查看exe程序使用的DLL及函数, DLL文件里有多少个函数, 以及EXE调用了哪个DLL的哪些函数?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xlie3JL9-1630045248971)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p426)]

2显示了程序导入的DLL列表,点击2后, 在3处显示导入的函数列表。

4显示这个DLL中所有可被导入的函数,对我们不是特别有用,3,4的列中有序号,可执行文件可以根据序号,而不是根据名字来导入函数。

当根据序号来导入函数时, 函数名字不会在可执行文件中显示, 对于我们分析来说会变难。

可以在4中通过查找序号, 来找出到底导入的是哪个函数。

5、6显示运行程序时装载的DLL版本额外信息和报告的错误。

会展示给我们程序用到所有的函数, 以及这些函数在哪里被引用。

有一些函数是直接调用,有一些函数是间接调用。

Dependency Walker是Microsoft Visual C++ 中提供的非常有用的PE模块依赖性分析工具。

主要功能如下: 查看 PE 模块的导入和导出函数。 动态剖析 PE 模块的模块依赖性。 解析 C++ 函数名称。

官方下载:http://www.dependencywalker.com/

在程序左侧的树状栏中就列出了这个DLL使用了哪些其他DLL的功能函数(原来DLL中还可以调用其他DLLO), 而右侧的两个分栏列表分别显示了函数输入及输出表, 函数输出表即为该DLL提供给其他EXE或者DLL调用的函数的总列表。

函数输出表的Function栏中即为输出函数的名称(见图1),在QQZip.dll中共发现了2个函数:Unzip、Zip。因此可以判断该DLL在QQ程序中负责压缩和解压缩的任务。

https://www.pianshen.com/article/2385335/

导入函数

导入函数如果比较多的话,代表没有被加壳, 但只有少数的导入函数对我们来说是有意义的。

WINDOWS IMPORTS • The imported functions from the Win32 API can tell us a lot about what the program potentially does • Can use several tools to list the imports in a PE file • At the very least, they should pose some questions to direct further analysis • As you become more proficient, you will start to recognise various imports and the potential behaviour they indicate • But at the start you’ll end up having to look up the functions in the documentation (see MSDN)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXk5lHPL-1630045248974)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p421)]

Example taken from Practical Malware Analysis, p19 Explain the W/A suffix… whether the function takes ASCII or Unicode chars Demo where to find documentation

https://docs.microsoft.com/en-us/windows/win32/api/

看完了imports里的东西,要问自己一些问题:

QUESTIONS ARISING • It’s searching for files — which files and why? • It’s creating/manipulating files — which files and why? • It’s hooking into Windows — what for? • It has a GUI — how do we activate it, what options does it give? • Potentially via a hot key (see RegisterHotKey()) — which key combo? • Does the .rsrc section contain something interesting?

导出函数

与导入函数类似,DLL与EXE的导出函数,是用来与其他程序或代码进行交互时所使用的。通常,1个DLL会实现若干个函数,然后将他们导出,使得别的程序可以导入并使用这些函数。

PE文件中包含一个文件中导出了哪些函数的信息。因为DLL文件本身就是实现一些导出函数然后被exe可执行文件使用的,因此导出函数在DLL文件中是最常见的,而在exe文件中却很少见。

将一些函数导出来让其他人用,在PE文件中可以看到这些信息,详略。

2. 基础动态分析

Dynamic Analysis — Looking at the malware ‘as it runs’

在文件运行时去用工具分析, 观察与监控系统中的行为, 它都干了什么,通过工具看到去对比静态时的字符串,有很大的差异。

恶意软件作者发现有其他特殊的软件在运行, 则就什么都不做,因此我们需要使用crabber?

但对待高端的恶意代码往往无效。

先静态,后动态,在静态走到不能走之后再做动态分析。

沙盒

简单但粗糙

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wAduBV2p-1630045248977)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p445)] 模拟一个虚拟的环境,沙盒可以自动做上面的事情, 还可以生成报告,

Cuckoo Sandbox

Hybrid analysis,帮你运行恶意文件,并生成报告。 https://www.hybrid-analysis.com/

Including doing some static analysis

沙盒有一些缺点,详略

运行恶意代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SLe2R3lU-1630045248978)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p438)] cl arguments should be visible as strings in the static analysis

通常可以通过命令行输入命令或双击EXE文件去运行文件, DLL有点特殊,可以用rundll32.exe进行运行。

C:>rundll32.exe DLLname, Export arguments

Export arguments必须是DLL导出函数列表中的函数名或序号(例如#1,#5)。

Process Monitor【工具】

进程监视器,监控所有运行的进程、线程、注册表、文件系统、网络、系统调用等等。

展示一个被监视的事件列表, 告诉你相关的程序在系统中做了什么, 调用哪个windows的API。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0omycD5a-1630045248979)(evernotecid://BCE3D193-8584-4CB1-94B3-46FF37A1AC6C/appyinxiangcom/12192613/ENResource/p453)]

点capture,取消或开启监控,一般几分钟就可以。 所有的系统调用都会被捕获, 时间长了会导致内存不足,虚拟机崩溃。

在进行监控分析之前, 先暂停捕获,File->Capture Events 先clear一下屏幕,Edit->Clear Display

可以使用filter来进行过滤,不然内容太多了, 并不能阻止消耗内存。

可以换背景图来尝试变化。

需要有耐心,可能会有很多事件。 不应该被记录网络行为,因为微软的兼容性原因。

Process Explorer【工具】

微软的免费产品,有点像高级的windows任务管理器, 监视系统上所有活跃的进程、被进程载入的DLL、 各种进程属性和整体系统信息。

进程之间是有层级树状结构的,进程,子进程。

标签: omega变送器os36s

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台