二进制入门学习笔记-2.C语言基础入门

C语言指针

指针使用

声明

char* x;
int* y;

赋值

x = (char*)1;

指针的数据宽度

数据宽度都是4字节

地址符

&

char x;
char* p;
p = &x;

取出x的地址存入p

*符

char x=10;
char* p;
p = &x;
char y;
y = *p;//p=10

函数指针

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
char s[]={
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 argc, char* argv[])
{
    int (*plus)(int,int);
    plus = (int(*)(int,int))&s;
    printf("%d\n",plus(1,19));
    return 0;
}

等价于

#include "stdafx.h"
int plus(int x,int y){
    return x+y;
}
int main(int argc, char* argv[])
{
    printf("%d\n",plus(1,19));
    return 0;
}

C语言位运算

1.算数移位指令(SAL/SAR)

SAL EAX,1
SAL AX,1

SAL最高位放到CF里面,最低位补0 SAR最低位放到CF里面,高位处补符号位

2.逻辑移位指令(SHL,SHR)

SHL EAX,1

空位补0

3.循环位移(ROL,ROR)

ROR al,1
如果al=1000 0001,移完变成0000 0011

4.带进位的循环移位指令(RCL,RCR)

和上面的区别就是把CF位补到圈里

C语言编译相关

从C到exe

C -> 替换 -> 编译 -> 链接 -> 二进制代码

头文件的作用

比如说自己写了一个test.cpp,里面写了一个函数叫plus,现在需要在另一个文件test2.cpp中调用这个plus函数,则需要先在test.h中声明这个plus函数,然后在test2.cpp中

#include "test.h"

内存动态申请

malloc

malloc申请到的内存空间是在堆当中的,使用完成后一定要记得释放内存空间。 例:

ptr = (int *)malloc(sizeof(int)*128);//申请长度为128个int长度的内存空间,并把初始地址存入ptr这个指针。
if (ptr==NULL){
    return 1;
}
memset(ptr,0sizeof(int)*128); //初始化
(*ptr) =  1; //使用
free (ptr); //释放
ptr = NULL;

读一个文件并原样写入另一个文件

// 本程序打开一个notepad.exe复制一份完全相同的notepad2.exe

#include "stdafx.h"
#include<stdlib.h>

int main(int argc, char* argv[])
{
    FILE *fp;
    char *fw;
    int size=0;
    fp=fopen("C:\\Users\\crls\\Desktop\\VC6.0green\\MyProjects\\PEReader\\Debug\\notepad.exe","rb");
    if (fp==NULL){
        printf("Openfile error");
        return NULL;
    }else{
        fseek(fp,0,SEEK_END);
        size = ftell(fp);
        printf("%d",size);

        fseek(fp,0,SEEK_SET);
        fw = (char *)malloc(sizeof(char)*size);
        if (fw==NULL){
            printf("malloc error!\n");
            return NULL;
        }
        size_t n = fread(fw, 1, size, fp);  
        if(!n){
            printf(" 读取数据失败! ");
            free(fw);
            fclose(fp);
            return NULL;
        }
    }
    FILE *newfp;
    if (newfp==NULL){
        printf("malloc error!\n");
        return 1;
    }
    newfp = fopen("C:\\Users\\crls\\Desktop\\VC6.0green\\MyProjects\\PEReader\\Debug\\notepad2.exe","wb");
    fwrite(fw , 1 , size , newfp);
    fclose(newfp);
    fclose(fp);
    free(fw);
}

联合类型

如果需要定义多个类型,但是每次只会用一个类型,为了节省空间就可以使用union联合类型

union test{
    int x;
    char y;
};