零基础逆向工程14_C语言08_指针02_反汇编
1.指针数组
5:        char* keyword[] = {"if", "for", "while", "switch"};  //数组指针,大小为4×4=16字节
0040D7D8   mov         dword ptr [ebp-10h],offset string "AAA" (00422028)
0040D7DF   mov         dword ptr [ebp-0Ch],offset string "for" (00422024)
0040D7E6   mov         dword ptr [ebp-8],offset string "DDD" (0042201c)
0040D7ED   mov         dword ptr [ebp-4],offset string "\xb5\xd8\xd6\xb7\xce\xaa%x, \xca\xc7\xb5\xda%d\xb8\xf6\
2.数组和指针
*(p+i) = p[i]
*(*(p+i)+k) = p[i][k]
*(*(*(p+i)+k)+m) = p[i][k][m]
一段反汇编代码分析
5:        int x = 100;
00401028   mov         dword ptr [ebp-4],64h
6:        int* p = &x;
0040102F   lea         eax,[ebp-4]
00401032   mov         dword ptr [ebp-8],eax
7:        int** p1 = &p;
00401035   lea         ecx,[ebp-8]
00401038   mov         dword ptr [ebp-0Ch],ecx
8:
9:        printf("%d\n", x);
0040103B   mov         edx,dword ptr [ebp-4]
0040103E   push        edx
0040103F   push        offset string "%d\n" (0042201c)
00401044   call        printf (004010e0)
00401049   add         esp,8
10:       printf("%d\n", *p);
0040104C   mov         eax,dword ptr [ebp-8]
0040104F   mov         ecx,dword ptr [eax]
00401051   push        ecx
00401052   push        offset string "%d\n" (0042201c)
00401057   call        printf (004010e0)
0040105C   add         esp,8
11:       printf("%d\n", **p1);
0040105F   mov         edx,dword ptr [ebp-0Ch]
00401062   mov         eax,dword ptr [edx]
00401064   mov         ecx,dword ptr [eax]
00401066   push        ecx
00401067   push        offset string "%d\n" (0042201c)
0040106C   call        printf (004010e0)
00401071   add         esp,8
12:       printf("%d\n", p[0]);
00401074   mov         edx,dword ptr [ebp-8]
00401077   mov         eax,dword ptr [edx]
00401079   push        eax
0040107A   push        offset string "%d\n" (0042201c)
0040107F   call        printf (004010e0)
00401084   add         esp,8
13:       printf("%d\n", p1[0][0]);
00401087   mov         ecx,dword ptr [ebp-0Ch]
0040108A   mov         edx,dword ptr [ecx]
0040108C   mov         eax,dword ptr [edx]
0040108E   push        eax
0040108F   push        offset string "%d\n" (0042201c)
00401094   call        printf (004010e0)
00401099   add         esp,8
3.数组指针
一段反汇编代码分析
#include <stdio.h>
char code[]=
{
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,
	0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,
	0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,
	0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,
	0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,
	0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,
	0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,
	0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,
	0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,
	0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64
};
int main()
{
	//1.一维数组指针
	//int (*px)[5];
	//px = (int (*)[5]code);
	//printf("%x\n", *(*(px+2)+2));
	//2.二维数组指针
	char (*py)[2][3];
	py = (char (*)[2][3])code;         //2*3*1 = 6   // 3*1 = 3
	printf("%x\n", *(*(*(py+2)+3)+4));  // 12+9+4 = 25  即结果为0x1a
	//3.三维数组指针
	return 0;
}
4.函数指针
函数的反汇编代码
int Function(int x, int y)
{
	return x+y;
}
00401010 55                   push        ebp
00401011 8B EC                mov         ebp,esp
00401013 83 EC 40             sub         esp,40h
00401016 53                   push        ebx
00401017 56                   push        esi
00401018 57                   push        edi
00401019 8D 7D C0             lea         edi,[ebp-40h]
0040101C B9 10 00 00 00       mov         ecx,10h
00401021 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
00401026 F3 AB                rep stos    dword ptr [edi]
00401028 8B 45 08             mov         eax,dword ptr [ebp+8]
0040102B 03 45 0C             add         eax,dword ptr [ebp+0Ch]
0040102E 5F                   pop         edi
0040102F 5E                   pop         esi
00401030 5B                   pop         ebx
00401031 8B E5                mov         esp,ebp
00401033 5D                   pop         ebp
00401034 C3                   ret
取其硬编码,写函数调用
#include <stdio.h>
int x = 10;
unsigned char arr[] =
{
	0x55,
	0x8B, 0xEC,
	0x83, 0xEC, 0x40,
	0x53,
	0x56,
	0x57,
	0x8D, 0x7D, 0xC0,
	0xB9, 0x10, 0x00, 0x00, 0x00,
	0xB8, 0xCC, 0xCC, 0xCC, 0xCC,
	0xF3, 0xAB,
	0x8B, 0x45, 0x08,
	0x03, 0x45, 0x0C,
	0x5F,
	0x5E,
	0x5B,
	0x8B, 0xE5,
	0x5D,
	0xC3
};
int main()
{
	int (*pFun)(int, int);
	pFun = (int (*)(int ,int ))arr;
	x = pFun(2, 3);
	printf("%d\n", x);
	return 0;
}
补充:指针的本质
1.是一个类型
2.宽度是四
3.可以作加减的运算
4.可以与整数相加相减
5.可以比较大小
零基础逆向工程14_C语言08_指针02_反汇编的更多相关文章
- 零基础逆向工程13_C语言07_指针01_反汇编
		
1."带*类型"的特征探测 宽度 在同一个平台下,任何指针变量的尺寸都是一样的(都等于系统字长),如在32位平台中任何类型指针宽度都是32位. 声明 1.带有* 的变量类型的标准写 ...
 - 零基础逆向工程16_C语言10_宏定义_头文件_内存分配_文件读写
		
#define 无参数的宏定义的一般形式为:#define 标识符 字符序列 如:#define TRUE 1 注意事项: 1.之作字符序列的替换工作,不作任何语法的检查 2.如果宏定义不当,错误要到 ...
 - 零基础逆向工程15_C语言09_位运算
		
1.汇编中的移位指令 算数移位指令 指令格式:SAL/SAR Reg/Mem, CL/Imm SAL(Shift Arithmetic Left):算数左移 SAR(Shift Arithmetic ...
 - 零基础逆向工程12_C语言06_switch语句反汇编
		
12_C语言06_switch语句反汇编 switch语句反汇编 测试环境:VC++6.0 分支少于4的时候没有意义,编译器会生成类似if...else之类的反汇编,不超过三个分支,不会生成索引表. ...
 - 零基础逆向工程11_C语言05_结构体
		
结构体小结 结构体是按照分配的大小,局部变量会自动数据对齐 1字节对齐,省空间,但cpu查找效率低 4字节对齐,不省空间,但cpu查找效率高 VC6默认的结构对齐大小 项目右键-> settin ...
 - 狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(2)
		
前文链接:狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(1) 小甲鱼在很多情况下是跟着谭浩强鹦鹉学舌,所以谭浩强书中的很多错误他又重复了一次.这样,加上他自己的错误,错谬之处难以胜数. 由于拙 ...
 - 零基础逆向工程20_PE结构04_任意节空白区_新增节_扩大节添加代码
		
向代码节添加代码实现 作者经过一周不断的失败,再思考以及无数次调试终于实现. 思路:八个步骤 1. 文件拷到文件缓冲区(FileBuffer) //图示见(零基础逆向工程18之PE加载过程) 2. 文 ...
 - 零基础学习C语言入门必备知识
		
今天跟大家一起从零学C语言: 1. C语言简介 1.1 C语言发展史 C语言是一种广泛使用的面向过程的计算机程序设计语言,既适合于系统程序设计,又适合于应用程序设计.C语言的发展历程大致如图1-1所示 ...
 - 网易云课堂_艾叔:零基础一站式C语言|C程序设计精讲_章节12:指针
		
课时63指针操作数组 二维数组 #include <stdio.h> #include <stdlib.h> int main() { int age[2][4] = { 1, ...
 
随机推荐
- Oracle字段增删改方法总结
			
一.修改字段的语法:alter table tablename modify (字段名 类型 [default value][null/not null],….);有一个表名为tb,字段段名为name ...
 - Java中的IO流(1)
			
字节流: //一个字节一个字节的读写 FileInputStream in=new FileInputStream("源文件"); FileOutputStream out=new ...
 - opencvsharp BitmapSource图片截取问题
			
private BitmapSource GetUiImage(FrameworkElement ui) { RenderTargetBitmap bmp=new RenderTargetBitmap ...
 - Python中的数据结构和算法
			
一.算法 1.算法的时间复杂度 大 O 记法,是描述算法复杂度的符号O(1) 常数复杂度,最快速的算法. 取数组第 1000000 个元素 字典和集合的存取都是 O(1) 数组的存取是 O(1) O( ...
 - ASP.NET学习笔记(五)ASP 对象
			
1.ASP Response 对象用于从服务器向用户发送输出的结果. 2.ASP Request 对象用于从用户那里取得信息 Request.QueryString 命令用于搜集使用 method=& ...
 - .net实现IHttpModule接口顾虑器
			
这篇文章主要介绍了C#使用IHttpModule接口修改http输出的方法,涉及C#操作IHttpModule接口的相关技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了C#使用IHtt ...
 - ASP.NET Core 3.0 自动挡换手动挡:在 Middleware 中执行 Controller Action
			
最近由于发现奇怪的 System.Data.SqlClient 性能问题(详见之前的博文),被迫提前了向 .NET Core 3.0 的升级工作(3.0 Preview 5 中问题已被修复).郁闷的是 ...
 - 【异步编程】Part1:await&async语法糖让异步编程如鱼得水
			
前导 Asynchronous programming Model(APM)异步编程模型以BeginMethod(...) 和 EndMethod(...)结对出现. IAsyncResult Beg ...
 - SpringBoot进阶教程(五十九)整合Codis
			
上一篇博文<详解Codis安装与部署>中,详细介绍了codis的安装与部署,这篇文章主要介绍介绍springboot整合codis.如果之前看过<SpringBoot进阶教程(五十二 ...
 - mac系统之前做过Windows8系统,可能移除时没有通过boot camp助理移除,所以想要再安装windows系统时,点击boot camp助理的继续,弹出启动磁盘不能被分区或恢复单分区。
			
因为把bootcamp分区抹掉,卸载,装载,点减号,合并成单分区,一直是操作失败.为了通过boot camp安装上Windows系统,索性重新安装mac ox系统,重新分区.重新开机,按住comman ...