标签:mamicode 技术 一个 image get std -- 功能 介绍
1 void __declspec(naked) Function()
2
3 {
4 ...
5 }
1 #define NAKED __declspec(naked)
2
3 void NAKED code(void)
4 {
5 __asm
6 {
7 ret
8 }
9 }
1 // xiaoyu1.cpp : Defines the entry point for the console application.
2 //
3
4 #include "stdafx.h"
5
6 void Plus1()
7 {
8
9 }
10
11 int main(int argc, char* argv[])
12 {
13 Plus1();
14 return 0;
15 }
在这个窗口处,右键选择Go To Disassembly,进入我们的反汇编窗口
点击之后进入如下界面
看到最左边那一列有个向右的小黄色箭头了吗?这标志我们的程序停在这,黄色箭头处的代码:
1 00401068 call @ILT+0(Plus1) (00401005)
1 00401005 jmp Plus1 (00401020)
再按下F11,如下所示
1 00401020 push ebp
2 00401021 mov ebp,esp
3 00401023 sub esp,40h
4 00401026 push ebx
5 00401027 push esi
6 00401028 push edi
7 00401029 lea edi,[ebp-40h]
8 0040102C mov ecx,10h
9 00401031 mov eax,0CCCCCCCCh
10 00401036 rep stos dword ptr [edi]
11 00401038 pop edi
12 00401039 pop esi
13 0040103A pop ebx
14 0040103B mov esp,ebp
15 0040103D pop ebp
16 0040103E ret
在最底层,发现事情都不是明面上看到的那么简单,C语言中一个什么都不写的最简单的一个函数,编译器居然为我们生成了这么多的汇编代码,如果你不懂这段,可以移步我的这一篇博文https://www.cnblogs.com/Reverse-xiaoyu/p/11489082.html
1 // xiaoyu1.cpp : Defines the entry point for the console application.
2 //
3
4 #include "stdafx.h"
5
6 void __declspec(naked) plus()
7 {
8
9 }
10
11 void Plus1()
12 {
13
14 }
15
16 int main(int argc, char* argv[])
17 {
18 plus();
19 return 0;
20 }
1 --- D:\Project\xiaoyu1\xiaoyu1.cpp ---------------------------------------------------------------------------------------------------------------------------
2 15:
3 16: int main(int argc, char* argv[])
4 17: {
5 00401020 push ebp
6 00401021 mov ebp,esp
7 00401023 sub esp,40h
8 00401026 push ebx
9 00401027 push esi
10 00401028 push edi
11 00401029 lea edi,[ebp-40h]
12 0040102C mov ecx,10h
13 00401031 mov eax,0CCCCCCCCh
14 00401036 rep stos dword ptr [edi]
15 18: plus();
16 00401038 call @ILT+10(plus) (0040100f)
17 19: return 0;
18 0040103D xor eax,eax
19 20: }
20 0040103F pop edi
21 00401040 pop esi
22 00401041 pop ebx
23 00401042 add esp,40h
24 00401045 cmp ebp,esp
25 00401047 call __chkesp (0040d430)
26 0040104C mov esp,ebp
27 0040104E pop ebp
28 0040104F ret
1 // xiaoyu1.cpp : Defines the entry point for the console application.
2 //
3
4 #include "stdafx.h"
5
6 void __declspec(naked) plus()
7 {
8 __asm
9 {
10 ret
11 }
12 }
13
14 void Plus1()
15 {
16
17 }
18
19 int main(int argc, char* argv[])
20 {
21 plus();
22 return 0;
23 }
1 void __declspec(naked) plus()
2 {
3 __asm
4 {
5 //提升堆栈
6 push ebp
7 mov ebp,esp
8 sub ebp,0x40
9 //保护现场
10 push ebx
11 push esi
12 push edi
13 //向缓冲区填充数据
14 lea edi,dword ptr ds:[ebp-0x40]
15 mov eax,0xCCCCCCCC
16 mov ecx,0x10
17 rep stosd ;rep stos dword ptr es:[edi]
18 //恢复现场
19 pop edi
20 pop esi
21 pop ebx
22 //降低堆栈
23 mov esp,ebp
24 pop ebp
25 //返回函数调用前的下一行地址
26 ret
27 }
28 }
1 int __declspec(naked) plus(int x, int y)
2 {
3 __asm
4 {
5 //提升堆栈
6 push ebp
7 mov ebp,esp
8 sub esp,0x40
9 //保护现场
10 push ebx
11 push esi
12 push edi
13 //向缓冲区填充数据
14 lea edi,dword ptr ds:[ebp-0x40]
15 mov eax,0xCCCCCCCC
16 mov ecx,0x10
17 rep stos dword ptr es:[edi]
18
19 //函数核心功能块
20 mov eax,dword ptr ds:[ebp+0x8]
21 add eax,dword ptr ds:[ebp+0xC]
22
23 //恢复现场
24 pop edi
25 pop esi
26 pop ebx
27
28 //降低堆栈
29 mov esp,ebp
30 pop ebp
31 //返回函数调用前的下一行地址
32 ret
33 }
34 }
1 int __declspec(naked) plus(int x, int y)
2 {
3 __asm
4 {
5 //提升堆栈
6 push ebp
7 mov ebp,esp
8 sub esp,0x40
9 //保护现场
10 push ebx
11 push esi
12 push edi
13 //向缓冲区填充数据
14 lea edi,dword ptr ds:[ebp-0x40]
15 mov eax,0xCCCCCCCC
16 mov ecx,0x10
17 rep stos dword ptr es:[edi]
18
19 //局部变量入栈
20 mov dword ptr ds:[ebp-0x4]
21 mov dword ptr ds:[ebp-0x8]
22
23 //函数核心功能块
24 mov eax,dword ptr ds:[ebp+0x8]
25 add eax,dword ptr ds:[ebp+0xC]
26
27 //恢复现场
28 pop edi
29 pop esi
30 pop ebx
31 //降低堆栈
32 mov esp,ebp
33 pop ebp
34 //返回函数调用前的下一行地址
35 ret
36 }
37 }
标签:mamicode 技术 一个 image get std -- 功能 介绍
原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/11575682.html