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

1.“带*类型”的特征探测

宽度

在同一个平台下,任何指针变量的尺寸都是一样的(都等于系统字长),如在32位平台中任何类型指针宽度都是32位。

声明

1.带有* 的变量类型的标准写法:变量类型* 变量名
2.任何类型都可以带* 加上* 以后是新的类型
3.*可以是任意多个

赋值:相同类型赋值

范例:int* a = (int*)666;

++ -- 或 加上/减去 一个整数

规则:以指针指向的变量为步长,进行步长倍数的加减操作

求差值

规则:作差后除以步长
两个类型相同的一级指针相减,会自动转换为int型(证明方法:相见赋给int型变量编译不会有warning)

比较

指针变量可以进行大小的比较

2.模拟实现CE的数据搜索功能(内存遍历)

数字的搜索

#include <stdio.h>

char data[50] =
{
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,
	0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,
	0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,
	0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,
	0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x50,
};

void find_byte()
{
	int i;
	char* p = NULL;  //一个字节
	p = data;
	for(i = 0; i < 50; i++)  //一个字节,即为50
		printf("%x ", *(p+i) );
}

void find_word()
{
	int i;
	short* p = NULL;
	p = (short*)data;
	for(i = 0; i < 25; i++)
		printf("%x ", *(p+i) );
}

void find_dword()
{
	int i;
	int* p = NULL;
	p = (int*)data;
	for(i = 0; i < 12; i++)
		printf("%x ", *(p+i) );
}

int main()
{
	find_byte();
	printf("下面宽度是word型
");
	find_word();
	printf("下面宽度是dword型:
");
	find_dword();
	return 0;
}
//为了在内存中能够实现完全搜索,因而指针应该每次移动一个字节,来实现完全搜索内存

void find_dword()
{
	int i;
	int* p = (int*)data;
	int* temp_p = NULL;
	for(i = 0; i < 45; i++)
	{
		temp_p=(int*)((char *)p)+i;  //为了将指针以字节移动,从而强制转换
		printf("%x ", *(temp_p));

	//printf("%x ",*((int*)(((char *)p)+i)));
		
	}
}

字符串搜索

从反汇编角度的代码分析:
char* x = "china";  //"china"放在常量区,把"china"首地址赋给x,x变量是可以被改变的,字符串不可被更改
char y[] = "china";  //"china"放在常量区,但会把常量区的"china"拷贝一份到栈中,因而字符串可以被改变
原文地址:https://www.cnblogs.com/flatcc/p/7482602.html