识别汇编中的C代码结构

本章探讨了如何识别C代码结构如全局/局部变量、if、for、while、switch语句、函数调用约定、数组和结构体在汇编代码中的表现。通过分析实验,展示了如何理解恶意代码的功能,包括网络连接检查、执行不同操作和持续执行的机制。
摘要由CSDN通过智能技术生成

知识点

本章将通过讨论超过十种的不同的C代码结构来分析不同的汇编代码,帮助我们快速的提升形成恶意代码功能的高级视图的能力

**全局变量|局部变量:**全局变量可以被程序中任意函数访问和使用,局部变量只能在它被定义的函数中访问,在汇编代码中,全局变量通过内存地址引用,而局部变量通过栈地址引用。

**识别if语句:**有if语句一定存在跳转,但是有跳转不一定是if语句,if语句前有一个cmp指令用于对比条件,之后会有一个jnz指令来决定是否进行跳转。

for循环:for循环是一个C变成使用的基本循环机制。for循环总之有四个组件:初始化、比较、执行命令、变量的递增或递减。

while循环:while循环与for循环的汇编代码类似,但是区别在于while循环没有递增或者递减的代码。当一个cmp指令返回一定的值后while循环就会终止。

switch语句:switch语句通常以两种方式被编译,使用if样式或者使用跳转表。跳转表是编译器对汇编代码做出的优化,一旦很多个cmp指令的数据成等差数列,则编译器会把跳转地址与数据联系起来做成跳转表。

**函数调用约定:**函数调用约定决定了函数调用发生的方式,这些约定包含了参数被放在栈上或寄存器中的次序,以及是由调用者还是被调用者负责在函数执行完成时清理栈。以下时常见的三种调用约定;

  • cdecl:这是最常用的调用约定之一,此约定下。参数从右至左被压入栈,当函数执行完成后由调用者清理栈。
  • stdcall:除了被调用者在函数执行完成之后清理栈之外,其他与cdecl约定非常类似。
  • fastcall:fastcall调用约定跨编译器时变化最多,但是整体上的工作情况时类似的,在此约定中,前一些参数(典型的是前两个)被传到寄存器中,备用的寄存器是EDX和ECX(微软fastcall约定),如果需要的话,剩下的参数再以从右至左的次序被加载到栈上,通常使用fastcall比其他约定更高效。

**反汇编数组:**在汇编代码中,数组是通过一个基地址作为起始点来进行访问的,每一个元素的大小并不总是明显的,但是可以通过看这个数组是如何被索引的来进行判断。

**识别结构体:**结构体和数组类似,在IDA中可以使用热键T来建立结构体的识别。

课后练习

Lab6-1

在这个实验中,你将分析在文件Lab06-01.exe中发现的恶意代码。

问题

1.由main函数调用的唯一子过程中发现的主要代码结构是什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值