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_反汇编的更多相关文章

  1. 零基础逆向工程13_C语言07_指针01_反汇编

    1."带*类型"的特征探测 宽度 在同一个平台下,任何指针变量的尺寸都是一样的(都等于系统字长),如在32位平台中任何类型指针宽度都是32位. 声明 1.带有* 的变量类型的标准写 ...

  2. 零基础逆向工程16_C语言10_宏定义_头文件_内存分配_文件读写

    #define 无参数的宏定义的一般形式为:#define 标识符 字符序列 如:#define TRUE 1 注意事项: 1.之作字符序列的替换工作,不作任何语法的检查 2.如果宏定义不当,错误要到 ...

  3. 零基础逆向工程15_C语言09_位运算

    1.汇编中的移位指令 算数移位指令 指令格式:SAL/SAR Reg/Mem, CL/Imm SAL(Shift Arithmetic Left):算数左移 SAR(Shift Arithmetic ...

  4. 零基础逆向工程12_C语言06_switch语句反汇编

    12_C语言06_switch语句反汇编 switch语句反汇编 测试环境:VC++6.0 分支少于4的时候没有意义,编译器会生成类似if...else之类的反汇编,不超过三个分支,不会生成索引表. ...

  5. 零基础逆向工程11_C语言05_结构体

    结构体小结 结构体是按照分配的大小,局部变量会自动数据对齐 1字节对齐,省空间,但cpu查找效率低 4字节对齐,不省空间,但cpu查找效率高 VC6默认的结构对齐大小 项目右键-> settin ...

  6. 狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(2)

    前文链接:狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(1) 小甲鱼在很多情况下是跟着谭浩强鹦鹉学舌,所以谭浩强书中的很多错误他又重复了一次.这样,加上他自己的错误,错谬之处难以胜数. 由于拙 ...

  7. 零基础逆向工程20_PE结构04_任意节空白区_新增节_扩大节添加代码

    向代码节添加代码实现 作者经过一周不断的失败,再思考以及无数次调试终于实现. 思路:八个步骤 1. 文件拷到文件缓冲区(FileBuffer) //图示见(零基础逆向工程18之PE加载过程) 2. 文 ...

  8. 零基础学习C语言入门必备知识

    今天跟大家一起从零学C语言: 1. C语言简介 1.1 C语言发展史 C语言是一种广泛使用的面向过程的计算机程序设计语言,既适合于系统程序设计,又适合于应用程序设计.C语言的发展历程大致如图1-1所示 ...

  9. 网易云课堂_艾叔:零基础一站式C语言|C程序设计精讲_章节12:指针

    课时63指针操作数组 二维数组 #include <stdio.h> #include <stdlib.h> int main() { int age[2][4] = { 1, ...

随机推荐

  1. MVC之一、预备知识储备

    自动属性 隐式类型 对象初始化器与集合初始化器 匿名类 扩展方法 Lambda表达式 (1).自动属性(Auto-Implemented Properties) C#自动属性可以避免原来这样我们手工声 ...

  2. ubuntu 18.04 设置中文输入法

    有下面几种常用选择: IBus拼音:sudo apt-get install ibus-pinyin IBUS五笔:sudo apt-get install ibus-table-wubi 谷歌拼音输 ...

  3. CF-828C

    C. String Reconstruction time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  4. Python之文件输入输出,

      文件输入与输出 • 打开文件返回文件对象 – file_object=open(file_name,access_mode='r') • 关闭文件对象 – file_object.close() ...

  5. cordova之旅之初识

    emmmm, 一直徘徊在移动端采用什么技术比较好,一直也没有找到,让我为了一个移动端而去学习一波react全家桶是不现实的操作,反观自己的技术栈,通过长时间的对比和剖析找到了入口点,不管了先会写再说吧 ...

  6. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  7. 51nod1069【Nim取石子游戏】

    具体看:萌新笔记之Nim取石子游戏可以这么写: #include <bits/stdc++.h> using namespace std; typedef long long LL; in ...

  8. TCP/IP之大明邮差

    大明王朝天启四年, 清晨. 天色刚蒙蒙亮,我就赶着装满货物的马车来到了南城门, 这里是集中处理货物的地方 , 一队一队的马车都来到这里, 城头的士兵带着头盔,身披盔甲, 手持长枪, 虎视眈眈的注视这下 ...

  9. TemplateText TT 在Runtime发生 Could not load type ...... because the format is invalid

    Severity Code Description Project File Line Suppression State Error Running transformation: System.T ...

  10. 洛谷P4003 无限之环(费用流)

    传送门 神仙题啊……不看题解我可能一年都不一定做得出来……FlashHu大佬太强啦 到底是得有怎样的脑回路才能一眼看去就是费用流啊…… 建好图之后套个板子就好了,那么我们着重来讨论一下怎么建图 首先, ...