其他技术区
逆向安全 标签描述

不同于寻常的C语言基本数据类型的学习,这里以汇编的形式来学习不同数据类型的存储方式和差异 C语言的数据类型 C语言的基本类型属于C语言的数据类型的一部分:   这里先从最简单的基本类型进行入手学习,在学习基本类型之前再温故一下先前学习过的汇编的数据类型 汇编的数据类型 整数类型 C语言的整数类型有:charshortintlong   大家可能会觉得疑惑,为什么int和long所表示的貌似一样? 这其实是历史遗留问题,在以前的16位计算机中,int的长度位2字节,但是在32位计算机中,int类型变成了4字节,而long类型原来便是4字节,现在在仍然是4字节 存储方式...

  TEZNKK3IfmPf   2023年11月12日   13   0   0 逆向安全windows

什么是指针 一般关于指针的解释都离不开地址。这里先暂且忘记这个概念 指针其实也是一种数据类型,和先前学习的intfloat等数据类型没有实质上的区别,只不过这个数据类型是在先前学习的所有数据类型后面加上若干个号,如char,int等等,这种数据类型被称为指针 任意类型后面都可以加上号,使其成为新的指针数据类型 可以是任意多个 指针的声明 指针的声明其实在前面介绍什么是指针的时候就已经讲到了,例子如下: structS1{ inta; }; voidfunction(){ chara; shortb; intc; longd; _int64e; floatf; doubleg; S1s...

  TEZNKK3IfmPf   2023年11月12日   8   0   0 逆向安全windows

先前介绍了指针的一些基本的知识,但都没有提到地址的概念,下面承接之前的笔记,继续学习指针 下面要介绍三个相关的内容:获取变量的数据类型、取变量地址和取地址中存储的数据 获取变量的数据类型 在C语言中可以使用下面的方法获取一个变量的数据类型: 代码 include"stdafx.h" include<typeinfo> voidfunction(){ chara; printf("%s\n",typeid(a).name()); } intmain(intargc,charargv[]) { function(); return0; } 运行结果 使用方式 通过上面的例子可以...

  TEZNKK3IfmPf   2023年11月12日   16   0   0 逆向安全windows

先前讲了分支结构的ifelse形式,除此之外还有一种分支结构:switch 此次就来以反汇编的角度研究switch语句,并与ifelse进行比较 Switch语句的使用 有关Switch语句在vc6.0中生成的反汇编可分为4种情况,这4种情况的区分在于case的不同 case数量<=3 代码 include"stdafx.h" voidMySwitch(intx){ switch(x){ case1: printf("numis1\n"); break; case2: printf("numis2\n"); break; case3: printf("numis3\n"); br...

  TEZNKK3IfmPf   2023年11月12日   11   0   0 逆向安全windows

前面我们通过分析反汇编分析了C语言,现在我们来探究如何在C语言里直接自写汇编函数 这里就要引入C语言中裸函数的概念 裸函数 声明裸函数 裸函数与普通函数的区别在于在函数前多声明了 __declspec(naked) 以此来表面该函数是一个裸函数 裸函数作用 要讲裸函数的作用,就不得不提到裸函数与普通函数的区别 裸函数与普通函数区别 前面反汇编C语言的笔记里,我们可以得知一个普通空函数的反汇编代码并不少,保护现场、恢复现场等等都有,那么这些反汇编代码是如何产生的呢? 答案是:编译器 编译器会为我们产生这些反汇编代码 相比之下,只要普通函数加上裸函数前缀转化为裸函数,编译器就会知道这个函数无...

  TEZNKK3IfmPf   2023年11月12日   13   0   0 逆向安全windows

二维数组初始化 intarr[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }; 查看反汇编 7:intarr[3][4]={ 8:{1,2,3,4}, 0040D498movdwordptr[ebp-30h],1 0040D49Fmovdwordptr[ebp-2Ch],2 0040D4A6movdwordptr[ebp-28h],3 0040D4ADmovdwordptr[ebp-24h],4 9:{5,6,7,8}, 0040D4B4movdwordptr[ebp-20h],5 0040D4BBmovdwordptr[ebp-1Ch],6 ...

  TEZNKK3IfmPf   2023年11月12日   15   0   0 逆向安全windows

空函数反汇编 include"stdafx.h" //空函数 voidfunction(){ } intmain(intargc,charargv[]) { //调用空函数 function(); return0; } 我们通过反汇编来分析这段空函数 函数外部 12:function(); 00401048call@ILT+5(function)(0040100a) 13:return0; 0040104Dxoreax,eax 14:} 0040104Fpopedi 00401050popesi 00401051popebx 00401052addesp,40h 004010...

  TEZNKK3IfmPf   2023年11月12日   13   0   0 逆向安全windows

在提及全局变量和局部变量之前,需要先谈谈程序运行时在内存中的状态 任何一个程序在运行时都会把内存分成如下几块区域: 全局变量 全局变量在程序编译完成后地址就已经确定下来了,只要程序启动,全局变量就已经存在了,启动后里面是否有值取决于声明时是否给定了初始值,如果没有,默认为0 全局变量的值可以被所有函数所修改,里面存储的是最后一次修改的值. 全局变量所占内存会一直存在,直到整个进程结束. 全局变量的反汇编识别: MOV寄存器,byte/word/dwordptrds:[0x12345678] 上面的0x12345678是固定的地址,每次程序启动都不变 通过寄存器的宽度,或者byte/...

  TEZNKK3IfmPf   2023年11月12日   14   0   0 逆向安全windows

之前的文章学习过了四种基本类型:charshortintlong的汇编表示形式 因为它们的数据宽度都小于等于32位,所以都可以只用一个通用寄存器来存储 接下来的数组显然就无法只用一个通用寄存器就可以存储了 在学习数组之前,再学习一个数据类型:longlong(__int64),因为它也无法只用一个通用寄存器来存储 longlong(__int64) 其数据宽度为64位,所以也无法只用一个通用寄存器来存储,通过汇编来看看其存储形式 老规矩,先上代码: include"stdafx.h" unsigned__int64function(){ unsigned__int64i=0x1234567...

  TEZNKK3IfmPf   2023年11月12日   17   0   0 逆向安全windows

通过先前指针的学习,了解了指针和地址以及数据的关系,现在结合先前的知识继续学习巩固 指针遍历数组 有了先前的基础,再来看看如何用指针遍历数组 代码 include"stdafx.h" voidfunction(){ shortarr[5]={1,2,3,4,5}; shortp=&arr[0]; shortp2=arr; if(pp2){ printf("equal\n"); }else{ printf("notequal\n"); } inti; for(i=0;i<5;i){ intj=(p+i); printf("addr:%xvalue:%d\n",p+i,j)...

  TEZNKK3IfmPf   2023年11月12日   12   0   0 逆向安全windows

类型转换 类型转换的使用场景 类型转换一般为由数据宽度小的转换成数据宽度大的,不然可能会有高位数据被截断的现象,引起数据丢失 需要一个变量来存储一个数据,刚开始这个数据的数据宽度较小,后来发现存不下了,需要换一个数据宽度更大的变量来存储 类型转换相关汇编指令 MOVSX 先符号扩展,再传送 MOVAL,0FF MOVSXCX,AL MOVAL,80 MOVSXCX,AL MOVZX 先零扩展,再传送 MOVAL,0FF MOVZXCX,AL MOVAL,80 MOVSXCX,AL 类型转换例子 include"stdafx.h" intmain(intargc,charargv[]...

  TEZNKK3IfmPf   2023年11月12日   10   0   0 逆向安全windows

代码 include"stdafx.h" voidfunction(intnum){ num=52; } voidfunction2(intnum){ num=52; } intmain(intargc,charargv[]) { intnum=610; function(num); printf("%d\n",num); function2(&num); printf("%d\n",num); return0; } 运行结果   可以看到没有通过指针进行传参的数据在function内部修改后并没有影响到原本的数值 而通过指针进行传参的数据在function2内部修改...

  TEZNKK3IfmPf   2023年11月12日   8   0   0 逆向安全windows

这次来研究ifelse嵌套在汇编中的表现形式,本次以获取三个数中最大的数这个函数为例子,分析ifelse的汇编形式 求三个数中的最大值 首先贴上代码: include"stdafx.h" intresult=0; intgetMax(inti,intj,intk){ if(i>j){ if(i>k){ returni; }else{ returnk; } }else{ if(j>k){ returnj; }else{ returnk; } } } intmain(intargc,charargv[]) { result=getMax(1,2,3); printf("...

  TEZNKK3IfmPf   2023年11月12日   17   0   0 逆向安全windows