零基础逆向工程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型\n");
find_word();
printf("下面宽度是dword型:\n");
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"拷贝一份到栈中,因而字符串可以被改变