C语言

1:位运算

原码    //3   0000 0011

反码    //    0000 0011

补码    //    0000 0011

 

 

             0000 0110

 

        //-3  1000 0011

        //    1111 1100

        //    1111 1101

        //    1111 1010

 

                   1000 0101

              1000 0110

数据存在低8位

 

   

与&    11->1  10->0  01->0 00->0

或|    11->1  10->1  01->1 00->0

异或^  11->0  00->0  10->1 01->1

 

Int i;

Printf(“%d”,10.1)//

Printf(“%f”,10);

 

 

#include<stdio.h>

#include<stdlib.h>

//显示一个整数的位值

void main()

{

    int s=-3;

    int g = 1<<31;

    if (s<0)

    {

         s = ~s;

         s = s | g;

         s = s + 1;

    }

    for (int i = 1; i < 33; i++)

    {

         int temp = g&s;

         if (temp==0)

         {

             printf("0");

         }

         else

         {

             printf("1");

         }

         if (i%4==0)

         {

             printf(" ");

         }

         s = s<<1 ;

    }

    getchar();

}

 

//交换两个数

#include<stdio.h>

#include<stdlib.h>

 

void main()

{

    int a = 2;

    int b = 3;

    a = a^b;

    b = a^b;

    a = a^b;

    getchar();

 

}

 

2:劫持

#include<stdio.h>

#include<stdlib.h>

#include<Windows.h>

#include"detours.h"

#pragma comment(lib,"detours.lib")

static int (*Oldnewsystem)(char const* _Command)=system;

int newsystem(char const* _Command)

{

    printf("\n111");

    return 0;

}

 

 

void Hook()

{

 

    DetourRestoreAfterWith();//恢复原来状态

    DetourTransactionBegin();//拦截开始

    DetourUpdateThread(GetCurrentThread());//刷新当前线程

     //这里可以连续多次调用DetourAttach,表明HOOK多个函数

 

    DetourAttach((void**)&Oldnewsystem, newsystem);

 

    DetourTransactionCommit();//;拦截生效

 

}

 

void UnHook()

{

    DetourTransactionBegin();//拦截开始

    DetourUpdateThread(GetCurrentThread());//刷新当前线程

     //这里可以连续多次调用DetourAttach,表明撤销HOOK多个函数

    DetourDetach((void**)&Oldnewsystem, newsystem);

    DetourTransactionCommit();//拦截生效

}

 

void main()

{

   

//  MessageBoxW(0, L"11", L"222", 0);

   

//  MessageBoxW(0, L"22", L"222", 0);

    printf("%p", main);

    printf("\n%p %p  %p", Oldnewsystem, newsystem , system);

    Hook();

    printf("\n%p %p  %p", Oldnewsystem, newsystem, system);

    system("pause");

 

    getchar();

}

 

 

指针和数组

函数是具有副本机制的,唯独数组不存在。数组当作参数时,传递的为地址。

编译器会对数组名作特殊处理

一级指针:

1:函数改变外部变量

2:跨进程改变变量

3:数组作为参数(数组会退化为一个指针)

4:访问数组方式指针或者下标

5:retrun的值放在寄存器,没有地址,也有副本机制。函数返回地址,一定不能返回指向栈的地址

6:访问结构体

 

结构体 共用体 枚举

 

指针数组  保存指针的数组 批量管理地址(变量,函数)

数组指针  指向数组的指针

 

 

函数指针数据+劫持

#include<stdlib.h>

#include<stdio.h>

#include<Windows.h>

#include"detours.h"

#pragma comment(lib,"detours.lib")

 

 

 

int do1(int a,int b)

{

    return a + b;

 

}

int do2(int a, int b)

{

    return a + 2*b;

 

}

int do3(int a, int b)

{

    return a + 3 * b;

 

}

int do4(int a, int b)

{

    return a + 4 * b;

 

}

 

 

int do11(int a, int b)

{

    printf("\n%d %d %d", a, b, a + b);

    return a + b;

 

}

int do12(int a, int b)

{

    printf("\n%d %d %d", a, b, a + 2 * b);

    return a + 2 * b;

 

}

int do13(int a, int b)

{

    printf("\n%d %d %d", a, b, a + 3 * b);

    return a + 3 * b;

 

}

int do14(int a, int b)

{

    printf("\n%d %d %d", a, b, a + 4 * b);

    return a + 4 * b;

 

}

 

int(*mydo[4])(int a, int b) = { do1 ,do2 ,do3 ,do4 };

int(*newdo[4])(int, int) = { do11 ,do12 ,do13 ,do14 };

 

void Hook()

{

 

    DetourRestoreAfterWith();//恢复原来状态

    DetourTransactionBegin();//拦截开始

    DetourUpdateThread(GetCurrentThread());//刷新当前线程

    //这里可以连续多次调用DetourAttach,表明HOOK多个函数

    for (int i = 0; i < 4; i++)

    {

         DetourAttach((void**)&mydo[i], newdo[i]);

    }

   

 

    DetourTransactionCommit();//;拦截生效

 

}

 

void UnHook()

{

    DetourTransactionBegin();//拦截开始

    DetourUpdateThread(GetCurrentThread());//刷新当前线程

            

    //这里可以连续多次调用DetourAttach,表明撤销HOOK多个函数

    for (int i = 0; i < 4; i++)

    {

         DetourDetach((void**)&mydo[i], newdo[i]);

    }

    DetourTransactionCommit();//拦截生效

}

 

void main()

{

    Hook();

    int(*s[4])(int a, int b) = { do1 ,do2 ,do3 ,do4 };

 

    for (int i = 0; i < 4; i++)

    {

         printf("\n%d", (*s[i])(2, 2));

    }

    getchar();

}

 

二级指针

通过函数改变一个变量的值,需要变量的地址。改变一个指针的值,需要二级指针。

 

二维数组

#include<stdio.h>

#include<stdlib.h>

 

void main()

{

    int a[3][4] = {1,2,3,4,5,6,7,8,9,1,2};

    for (int i = 0; i < 12; i++)

    {

         *(*a + i) = i;

    }

 

    int (*p)[4] = a;

    for (int i = 0; i < 3; i++)

    {

         for (int j = 0; j < 4; j++)

         {

             printf("%d\n", p[i][j]);

         }

    }

 

    for (int i = 0; i < 3; i++)

    {

         for (int j = 0; j < 4; j++)

         {

             printf("%d\n", *(*(p + i)+j));

         }

   

    }

   

 

    system("pause");

}

 

三维数组

#include<stdio.h>

#include<stdlib.h>

 

void main()

{

    int a[2][3][3] = { {{1,1,1},{1,2,3 },{ 1,1,1 } } ,{ {1,1,1 },{ 1,2,3  },{ 1,1,1 }}};

 

    int(*p)[3][3]=a;

    for (int i = 0; i < 18; i++)

    {

         printf("%d", *(**a + i));

    }

    printf("\n");

    for (int i = 0; i < 2; i++)

    {

         for (int j = 0; j < 3; j++)

         {

             for (int k = 0; k < 3; k++)

             {

                  printf("%d", p[i][j][k]);

                  printf(" ");

             }

             printf("\n");

         }

         printf("\n");

    }

 

    for (int i = 0; i < 2; i++)

    {

         for (int j = 0; j < 3; j++)

         {

             for (int k = 0; k < 3; k++)

             {

                  printf("%d", *(*(*(p+i)+j)+k) );

                  printf(" ");

             }

             printf("\n");

         }

         printf("\n");

    }

 

   

    system("pause");

}

 

//内存分配

#include<stdio.h>

#include<stdlib.h>

 

void main()

{  

    int *i = (int *)malloc(sizeof(int) * 10);

    int *k = (int *)calloc(10, sizeof(int));

 

    k=(int *)realloc(k, 80);

    k = (int *)realloc(k, 80000);

 

    system("pause");

}

 

Cosnt

//const int *p;  const在*左边,则*p是常量。 右边 p为常量

//int const *p

//int *const p

//int const*const p

//const int *const p

 

    文件的打开操作 fopen 打开一个文件

      文件的关闭操作 fclose 关闭一个文件

      文件的读写操作 fgetc 从文件中读取一个字符
              fputc 写一个字符到文件中去
              fgets 从文件中读取一个字符串
              fputs 写一个字符串到文件中去
              fprintf 往文件中写格式化数据
              fscanf 格式化读取文件中数据
              fread 以二进制形式读取文件中的数据
              fwrite 以二进制形式写数据到文件中去
              getw 以二进制形式读取一个整数
              putw 以二进制形式存贮一个整数

    文件状态检查函数 feof 文件结束
              ferror 文件读/写出错
              clearerr 清除文件错误标志
              ftell 了解文件指针的当前位置

      文件定位函数 rewind 反绕
              fseek 随机定位

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值