首页
社区
课程
招聘
[原创]分析实战读书笔记4_汇编中C代码结构
发表于: 2020-12-18 16:31 5726

[原创]分析实战读书笔记4_汇编中C代码结构

2020-12-18 16:31
5726

image-20201217173938069

全局变量:

全局变量在汇编中以mov eax,dword ptr ds:[0xXXXXXXXX]的形式表现, 在一个立即数地址中存储.

在IDA中表现为dword_XXXXXXXX

局部变量:

局部变量在汇编中以mov eax,dword ptr ds:[EBP-X]的形式, 存储在子程序的栈中.

在IDA中表现为var_X

自增自减

取模

普通if else

ida中的图形化表示

image-20201217183448742

可以看到明显的两个分支只能执行其中一个

嵌套if else

for循环由四部分组成:初始化 比较 执行代码 递增或递减, 汇编中分辨这四个模块可以快速判断出是一个for循环代码

在IDA中视图体现为:

image-20201218112331139

while循环类似for循环, 仅少了递增递减的部分 : 初始化 比较 执行代码 再次比较

image-20201218113049780

switch在反汇编中的体现分为两类if样式 跳转表样式

if样式

image-20201218132037564

if样式下, switch语句被视为与if语句相同

跳转表样式

当switch语句的case过多时, 编译器进行了优化生成了一张跳转表

image-20201218132535883

在IDA中体现为:

image-20201218132621754

可以看到多个代码块共用一个jmp, 通过下标进行跳转, 这样可以节省字节空间

image-20201218140631655

数组的格式比较简单, 类似[ebp-x+ecx*4] ,[ebp-x]可以理解为数组首地址, ecx代表数组元素的位置, 4代表每个元素的宽度, 就像查数一样

image-20201218141125337

上图是一份C代码例子,下面是汇编中的体现

image-20201218141155718

image-20201218141204166

可以看到结构体类似数组, 原理都是通过首地址进行成员的访问, 只是结构体的成员宽度不一定相同,因此在访问时不像数组有固定的格式

image-20201218143016372

链表节点指向另一个链表的首地址

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

main函数只调用了一个401000, 进去查看汇编

image-20201218145205651

位于0x40105F的子过程是什么?

这个程序的目的是什么?

程序在入口时首先判断网络状态, 分支结构下执行了同一个函数sub_40105F也就是printf

image-20201218145704165

所以整个样本的功能就是判断网络连接状态后进行打印

main函数调用的第一个子过程执行了什么操作?

image-20201218152233572

位于0x40117F的子过程是什么?

被main函数调用的第二个子过程做了什么?

image-20201218153030963

image-20201218154140161

在这个子过程中使用了什么类型的代码结构?

在这个程序中有任何基于网络的指示吗?

这个恶意代码的目的是什么?

比较在main函数与实验6-2的main函数的调用。从main中调用的新的函数是什么?

这个新的函数使用的参数是什么?

这个函数包含的主要代码结构是什么?

这个函数能够做什么?

在这个恶意代码中有什么本地特征吗?

这个恶意代码的目的是什么?

在实验6-3和6-4的main函数中的调用之间的区别是什么?

什么新的代码结构已经被添加到main中?

这个实验的解析HTML的函数和前面实验中的那些有什么区别?

这个程序会运行多久?(假设它已经连接到互联网。)

在这个恶意代码中有什么新的基于网络的迹象吗?

这个恶意代码的目的是什么?

int a=0;
a++;/a--;
 
mov [ebp-4],0
mov eax,[ebp-4]
add eax,1 / sub eax,1
mov [ebp-4],eax
int a=0;
a++;/a--;
 
mov [ebp-4],0
mov eax,[ebp-4]
add eax,1 / sub eax,1
mov [ebp-4],eax
int a = 10;
int b = 0;
b = a % 3;
 
mov [ebp-4],0xA
mov [ebp-8],0
mov eax,[ebp-4//将被除数存到eax中
cdq           
mov ecx,3    //将除数存到ecx中
idiv ecx
mov [ebp-8],edx    //结果会存到edx中
int a = 10;
int b = 0;
b = a % 3;
 
mov [ebp-4],0xA
mov [ebp-8],0
mov eax,[ebp-4//将被除数存到eax中
cdq           
mov ecx,3    //将除数存到ecx中
idiv ecx
mov [ebp-8],edx    //结果会存到edx中
int x = 1, y = 2;
if(x==y){
    code1
}else{
    code2
}
 
mov [ebp-4],1
mov [ebp-8],2
mov eax,[ebp-4]
cmp eax,[ebp-8]
jnz code2     //else
code1        //if
jmp xxx    //后续代码  可以看到两段代码只能有其中一段被执行,因此这个jmp是关键
int x = 1, y = 2;
if(x==y){
    code1
}else{
    code2
}
 
mov [ebp-4],1
mov [ebp-8],2
mov eax,[ebp-4]
cmp eax,[ebp-8]
jnz code2     //else
code1        //if
jmp xxx    //后续代码  可以看到两段代码只能有其中一段被执行,因此这个jmp是关键
int x=0,y=1,z=2;
if(x==y){
    if(z==0){
        code1
    }else{
        code2
    }
}else{
    if(z==0){
        code3
    }else{
        code4
    }
}
 
mov [ebp-4],0
mov [ebp-8],1
mov [ebp-c],2
mov eax,[ebp-4]
cmp eax,[ebp-8]   //外层if
jnz FLAG2        //外层else
cmp eax,[ebp-c]        //外层if->内层if
jnz FLAG1        //外层if->内层else
code1
jmp XXX        //跳出
FLAG1:code2   
jmp xxx
FLAG2:cmp eax,[ebp-c]        //外层else->内层if
jnz code4        //外层else->内层else
code3
int x=0,y=1,z=2;
if(x==y){
    if(z==0){
        code1
    }else{
        code2
    }
}else{
    if(z==0){
        code3
    }else{
        code4
    }
}
 
mov [ebp-4],0
mov [ebp-8],1
mov [ebp-c],2
mov eax,[ebp-4]
cmp eax,[ebp-8]   //外层if
jnz FLAG2        //外层else
cmp eax,[ebp-c]        //外层if->内层if
jnz FLAG1        //外层if->内层else
code1
jmp XXX        //跳出
FLAG1:code2   
jmp xxx
FLAG2:cmp eax,[ebp-c]        //外层else->内层if
jnz code4        //外层else->内层else
code3
for(int i=0;i<100;i++){
    code1
}
code2
 
mov [ebp-4],0        //初始化
jmp FLAG1            //比较
FLAG2:mov eax,[ebp-4]    //递增
add eax,1
mov [ebp-4],eax
FLAG1:cmp [ebp-4],0x64    //比较
jge code2    //跳出循环
code1    //执行代码
jmp FLAG2        //递增
for(int i=0;i<100;i++){
    code1

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
支持
分享
最新回复 (5)
雪    币: 255
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
6666
2020-12-28 11:39
0
雪    币: 255
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
666
2020-12-29 14:37
0
雪    币: 38
活跃值: (240)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
666 老哥,你这是啥书啊
2021-1-12 21:33
0
雪    币: 1484
活跃值: (14662)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
5
Node Sans 666 老哥,你这是啥书啊
恶意代码分析实战, 我在笔记1中发了下载链接
2021-1-13 09:33
0
雪    币: 38
活跃值: (240)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
SSH山水画 恶意代码分析实战, 我在笔记1中发了下载链接
ok谢谢
2021-1-14 10:54
0
游客
登录 | 注册 方可回帖
返回
//