安全逆向
随行之旅
这个作者很懒,什么都没留下…
展开
-
day45.多维数组
第45节:多维数组1、多维数组的定义比如:一个班5个组,每个组9个人:int arr[45] 或者 int arr[5*9] 再或者可以:int arr[5][9]比如:一个县有5个学校,每个学校有3个年级,每个年级有4个班,每个班有5个组,每个组有9个人:int arr[5*3*4*5*9] 或者 int arr[5][3][4][5][9]int arr[5][3][4][5][9] 这种类型...原创 2018-03-25 16:54:21 · 221 阅读 · 0 评论 -
day28.什么是变量
第28节:什么是变量变量是什么?在程序的进程中需要存储一些数据。大家之前学汇编的时候知道了,存储数据可以存到CPU中也就是存在寄存器里也可以存在内存中。但是在C语言中存储数据的时候我们要把这个数据存储到哪里呢?在C语言里所为的变量就是一个容器,也就是一块内存。1、声明变量变量类型 变量名变量类型 用来说明宽度是多大int 4个字节short 2个字节char 1个...原创 2018-02-22 18:37:47 · 327 阅读 · 0 评论 -
day27.什么是参数,什么是返回值通过堆栈形式表示
第27节:什么是参数,什么是返回值通过堆栈形式表示返回类型 函数名( 参数列表){ return;}例子:int plus(int x,int y){ return x+y;}void main() //程序入口{ //调用函数 plus(1,2); return;}1、在上节课主要说了一下函数的写法,和形式,上面的例子回顾一下,...原创 2018-02-21 15:05:00 · 214 阅读 · 0 评论 -
day33.字符与字符串
第33节:字符与字符串例子:int x = 123;//补码float f = 123.4F //IEEE编码int i =‘A’ //储存的是字符1、字符:上面的例子中的字符‘A’在C语言和汇编里的表示如下:C语言例子:#include<stdio.h>void main(){ int i = 'A'; return;}汇编代码:4: int i = 'A...原创 2018-02-28 18:20:14 · 146 阅读 · 0 评论 -
day26.C语言的汇编表示
第26节:C语言的汇编表示1)编写第一个C程序void main() //程序入口,程序开始执行的地方{ __asm{ mov eax,eax mov ecx,ecx } return; //程序结束}以上的代码在MOV eax,eax 按F9下段,进行调试如下汇编代码:0040D440 push ebp0040D441 mov ebp,...原创 2018-02-19 19:26:09 · 385 阅读 · 0 评论 -
day25.什么是JCC
第25节:什么是JCC这节讲一下·JCC指令,回想一下在之前的章节里讲过了,能改EIP的寄存器的一些指令为:JMP、CALL、RET 。这节讲JCC都是可以改EIP寄存器的。这个JCC指令更改寄存器不像JMP指令,这个JCC指令属于无条件修改EIP寄存器,但是JCC这个指令是否要改EIP这个寄存器,它需要看一些条件的,主要看标志寄存器的一些位。首先了解一下标志寄存器如下:1)CF位这个位主要是用来...原创 2018-02-18 14:01:54 · 4875 阅读 · 0 评论 -
day24.什么是EBP寻址
第24节:什么是EBP寻址上节ESP寻址回顾:当我们的汇编函数在执行的时候它怎么去找参数,怎么去找临时的值。主要使用ESP的寻址方式来寻找参数和其他的值,那么这种ESP有一个弊端的情况,因为ESP存储的是堆栈的栈顶的地址,如果当前汇编指令在执行过程中要使用到堆栈的话,那么栈顶就会发生变化(ESP的值会发生变化)。当你在下面再次使用的话,ESP的值会去寻找它的参数和变量,就要修正这个变化,如果不修正...原创 2018-02-17 18:25:39 · 437 阅读 · 0 评论 -
day39.while循环语句介绍
第39节:while循环语句介绍例子:#include "stdio.h"#include "windows.h"void MyPrint(int x){ int i = 0; while(i<=x) { printf("%d\n",i); i++; } return;}void main(){ MyPrint(100); return;}反汇编代码:4: void MyPrint...原创 2018-03-07 20:58:59 · 242 阅读 · 0 评论 -
day15.要点回顾和新指令的用法
第15节: 要点回顾和新指令的用法1、前面我们主要讲了两个问题分别是:1)数据可以存在哪里,可以在CPU的寄存器里或者在内存中,CPU存储的数据是有限的,如果太大了,可以存到内存中。2)数据是如何存放的,前面讲到了大端模式和小端模式。这两个问题弄清楚了,那就知道怎么样处理类似这两的问题的内容了,那么想处理数据我们必须学习新的汇编指令,从这节开始一一介绍。2、指令分为:r/m8,r8 r/m16,...原创 2018-02-08 14:14:45 · 250 阅读 · 0 评论 -
day23.什么是ESP寻址
第23节:什么是ESP寻址寄存器传参与堆栈传参寄存器传参回顾一下:例子: MOV ECX,1 MOV EDX,2 CALL 004183D7 004183D7 MOV EAX,ECX ADD EAX,EDX ...原创 2018-02-16 13:21:11 · 443 阅读 · 0 评论 -
day34.中文字符
第34节:中文字符1、字符串的使用C语言代码:#include<stdio.h>void main(){ char buffer[20] = "中国"; printf("%s \n",buffer); return;}汇编代码:4: char buffer[20] = "中国";00401028 mov eax,[string "\xd6\xd0\xb...原创 2018-03-01 18:21:40 · 136 阅读 · 0 评论 -
day40.do....while语句和while的区别
第40节:do....while语句和while的区别例子:#include "stdio.h"#include "windows.h"void Fun(int x,int y){ do{ printf("%d\n",x); x++; }while(x>y);}void main(){ Fun(1,2); return;}反汇编代码:5: do{6: ...原创 2018-03-09 20:27:31 · 269 阅读 · 0 评论 -
day44.数组(第二节)
第44节:数组(第二节)1、数组的分配char数组例子:4: void main(){00401010 push ebp00401011 mov ebp,esp00401013 sub esp,4Ch00401016 push ebx00401017 push esi00401018 push ...原创 2018-03-24 18:55:56 · 197 阅读 · 0 评论 -
day43.数组(第一节)
第43节:数组(第一节)1、什么时候要用到数组比如:定义一个变量,用来存储一个年龄。或者定义十个变量,用来存储十个人的年龄注意:定义数组的时候数组的值必须是常量。否则编译器会报错。定义数组例子: int age[10];汇编代码:00401010 push ebp00401011 mov ebp,esp00401013 sub e...原创 2018-03-22 21:20:10 · 201 阅读 · 0 评论 -
day37.Switch语句
第37节:Switch语句Switch语法:switch(表达式){ case 常量表达式1: 语句; break; case 常量表达式2: 语句; break; case 常量表达式n: 语句; bre...原创 2018-03-05 20:27:31 · 385 阅读 · 0 评论 -
day42.自动关机小程序
第42节:自动关机小程序#include "stdlib.h"void main(){ system("shutdown -s -t 10");}以上的程序在10后关机原创 2018-03-18 10:49:52 · 484 阅读 · 0 评论 -
day41.for循环介绍
第41节:for循环介绍例子:include "stdio.h"void T1(){ printf("T1 \n");}INT T2(){ printf("T2 \n"); return -1;}void T3(){ printf("T3 \n");}void textfor(){ for(T1();T2();T3()){ printf("T4 \n"); } return;}void main...原创 2018-03-11 18:30:49 · 182 阅读 · 0 评论 -
day36.分支语句
第36节:分支语句通过几个例子来了解分支语句的形成语法:if(表达式) 语句;或者if(表达式){ 语句1; 语句2;}例子1:#include<stdio.h>#include<windows.h>void main(){ int x = 10; int y = 20; if(x==y) { printf("----\n"); printf("+++...原创 2018-03-04 13:57:21 · 186 阅读 · 0 评论 -
day30.函数嵌套调用的内存布局
第30节:函数嵌套调用的内存布局我们在函数里面可以定义变量,可以做加法运算,当然也可以调用其它的函数。例子:#include<stdio.h>int plus1(int x,int y){ return x+y;}int plus(int x,int y,int z){ int m = plus1(x,y); return m+z;}void main() //程序入口{ int...原创 2018-02-24 13:55:34 · 262 阅读 · 0 评论 -
day35.运算符与表达式
第35节:运算符与表达式1、什么是运算符,什么是表达式?例子:int x,yx+y x-y x==y x=y表达式=运算符+变量2、表达式使用的数据类型分为如下:char -> short -> int -> float -> doublechar和short加起来是int,以上数据类型如使用了两个不同数据类型表达式后是由类型最宽来决定输出是什么类型。例子:#incl...原创 2018-03-02 20:21:27 · 203 阅读 · 0 评论 -
day29.变量与参数的布局
第29节:变量与参数的布局在之前的课程里面,大家已经掌握了,函数、调用、变量、参数、返回值等相关的一些概念,那么这节课我们从内存的角度来分析一下,这些所谓的概念它们的本质是什么。这节课解决三个问题:1、参数在内存中的位置2、局部变量在内存中的位置3、返回值是如何返回,如何使用的例子:#include <stdio.h>int plus(int x,int y){ int z = x +...原创 2018-02-23 21:17:19 · 156 阅读 · 0 评论 -
day22.什么是推栈平衡
第22节: 什么是推栈平衡如果要返回一个程序,则当我们在推栈中进行推栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入的栈中的地址。怎么理解这句话呢?我们看一下错误的例子: CALL 0041840D0041840D MOV EAX,1 PUSH ECX RET ...原创 2018-02-15 12:39:07 · 788 阅读 · 0 评论 -
day32.浮点类型
第32节:浮点类型学习数据类型主要有两点,数据类型决定了一个变量能存储多少数据,还是它存储的数据是什么格式的。浮点类型的种类float 4个字节double 8个字节long double 8个字节(某些平台的编译器可能是16个字节)赋值:float x = 1.23;double ...原创 2018-02-27 18:19:48 · 137 阅读 · 0 评论 -
day14.内存存储方式
第14节: 内存存储方式这上面的内存地址也就是内存编号,每一个内存编号对应着一个内存块(单元),这个内存单元大小就是8位,图上出现的是一个程序的内存块大小,它的内存单元是4G,4G有多大呢?如果按照编号来排的话,能够排多少个字节?从0开始,0就是对应一个字节的编号,1也是对应一个字节的编号以此类推,从小到大,内存最小的是0x00000000,最大是0xFFFFFFFF,如果说每一个编号对应一个字节...原创 2018-02-07 22:20:44 · 211 阅读 · 0 评论 -
day10.通用寄存器
第10节:通用寄存器1、什么是寄存器计算机在三个地方可以存储数据分别为:1)在CPU中2)内存中3)硬盘中以上这三个就是所谓的寄存器,用来存储数据的地方,那寄存器有多大呢?取决你CPU的位数比如:CPU是32位的,那它这个CPU里面提供的容器就会有三种类型分别是8位、16位、32位。那如果这个CPU是64位的里面提供的容器8位、16位、32位、64位共四种。大家可能原创 2018-02-02 15:58:02 · 278 阅读 · 0 评论 -
day09.汇编学习环境搭建
第9节:汇编学习环境搭建1、学习环境win7系统安装2、用到的工具:OLLDebug这节开始学习汇编,在讲具体的内容之前,我们要搞清楚几个问题:1)我们学习汇编用在什么地方。2)我们学习到什么程度。3)我们在什么情况下学习汇编,学习那种汇编。那我们一个个解答一下:1、我们学习汇编在什么地方用,首先要强调一点,我们学习汇编不是为了写代码原创 2018-02-02 11:20:29 · 357 阅读 · 0 评论 -
day08.要点回顾
第8节:要点回顾:大家应该知道计算机只认识0和1,如果说运算的话,它会的运算只有位运算,也就是我们所说的与、或、非、异或、左移、右移运算。除了这些其他它都不会。连最基本的加、减、乘、除都无法直接计算,而是要通过位运算来间接实现。那么这节课我们通过位运算来给大家讲一下计算机本身如何通过位运算来实现四则运算。这些问题在很多大的公司当做面试题。我们先看一下4+5=?的运算过程,计算机原创 2018-02-01 20:52:23 · 146 阅读 · 0 评论 -
day07.计算机不会做加法
第7节:计算机不会做加法之前课程里面讲到计算机如何存取数字,那么我们讲解了计算机如何存储正数(有符号的正数)和无符号的正数,在后面的课程中我会告诉大家计算机如何存储浮点数与如何存储字母如何存储汉字,那么仅仅知道计算机如何存储数字还是不够的,这节课主要来了解计算机是如何运算的,大家知道计算机只能认识0和1,这就意味所有的运算归根结底也就是直接对0和1做运算(通常称为位运算)。举个例子原创 2018-02-01 16:56:27 · 592 阅读 · 0 评论 -
day06.数字的编码
第6节:数字的编码假设我们有一个字节有8个位,8个位存储的数据是01010101,我问你这个数字存储是什么?大家现在考虑现在怎么回答。你首先会问存的是什么,我说里面存的是文本文件,那就按照文本文件来解析,我说是视频文件,那么就按照视频文件去解析。上一节讲解到无符号和有符号的第1位是0的时候怎么解析的,那我们回顾一下,我们假设是一个无符号数01010101,它的十六进制解析结果是55,如原创 2018-02-01 11:27:35 · 390 阅读 · 0 评论 -
day01.我们为什么要学习进制
第1节:我们为什么要学习进制1、我们为什么要学习进制:计算机只认识二进制,也就是0和1,为了更好学习计算机,我们首先深入理解什么是进制2、学习进制的障碍很多人学习不好进制,原因是总以十进制为依托去考虑其他进制的需要。运算的时候也总是先转换成十进制,这个方法是错误的。为什么说它是错误的呢?因为并不是需要转换进制,进制和进制之间是完美的,之所以要转换是因为我们本身对进制并不原创 2018-01-31 20:57:42 · 7293 阅读 · 2 评论 -
day05.无符号数和有符号数
第5节 无符号数和有符号数1、无符号数的编码规则 很简单的问题,但是有很多人在这个问题上纠结,包括有经验的程序员也在这个问题上纠结,原因是什么?他们不知道问题的本质,那么我们看一下上一节课讲的数据的宽度,比如:如果数据宽度就是1个字节,那么这1个字节它能存储的数据的范围是有限的,范围是多少呢?从0~0xFF,这个就是1个字节存储的范围,从最小到最大,那么问题又来了在这个里面数据代表什么意原创 2018-01-31 21:02:01 · 260 阅读 · 0 评论 -
day04.数据宽度
第4节:数据宽度数据宽度在上节课了解0和1的关系,同时计算机存储数据,不是无限制可以存储任意数据的,在我们现实中只存储一个数字的话,要么把数字写到本子上或记录到脑子里,那么把它看成无限大的,但是在计算机中不是这样的由于计算机受到硬件的约束,我们在存储数据的时候它是有长度限制的。我们称这个长度的限制叫做数据宽度。如果你要记录的数据超过了这个宽度,那么多余的数据会被丢弃的,在这一点上我们现实生原创 2018-01-31 21:01:17 · 266 阅读 · 0 评论 -
day03.计算机为什么使用二进制
第3节:计算机为什么使用二进制1、计算机为什么使用二进制计算机是需要用电,电路只有2种状态,1为真(通电),0为假(未通电)。计算机中存储的任何文件,接收的任何指令都是由0和1组成的。每一种进制都有它独立的体系,每一种进制都是完美的,并不需要在进制之间进行转换,并且任何进制都可以独立的。为什么计算机只能用二进制,不能使用其他进制呢?这个主要由于硬件的约束造成的,我们用计原创 2018-01-31 21:00:36 · 435 阅读 · 0 评论 -
day11.通用寄存器(二)
第11节:通用寄存器(二)这节课在给大家介绍一下通用寄存器,在上一节课里面讲过32位的CPU它能包含的或它能提供的寄存器有三种类型分别是8位、16位、32位,那么在上一节课介绍了八个32位寄存器。我给大家介绍一下而外的16位寄存器和8位寄存器分为有:ax cx dx bx sp bp si di (16位寄存器)ah bh sh dh al cl dl bl (高8位原创 2018-02-03 01:05:34 · 196 阅读 · 0 评论 -
day16.常用汇编指令
第16节: 常用汇编指令1、MOVS 指令:移动数据从内存到内存之间BYTE/WORD/DWORDMOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]以上的简写形式是:MOVSB、MOVSW、MOVSDMOV...原创 2018-02-09 16:12:37 · 1750 阅读 · 0 评论 -
day21.要点回顾(函数、参数、返回值)
第21节:要点回顾(函数、参数、返回值)1、什么是函数,函数就是一堆指令,这个指令实现的一个功能,这个功能可以反复使用。那么我就可以把这个功能写成一个函数,这样下次用的时候可以拿来用,那么什么是函数调用呢?比如:见到CALL的时候,CALL就是函数调用,那么什么是参数呢?如下:00148FFDC ADD ECX,EDX MOV EAX,ECX ...原创 2018-02-14 11:10:19 · 188 阅读 · 0 评论 -
day20.函数和参数、返回值的概念
第20节:函数和参数、返回值的概念1、什么是函数函数就是一系列指令的集合,为了完成某个会重复使用的特定功能。函数例子:向寄存器中赋值MOV EAX,1MOV ECX,1MOV EDX,1MOV EBX,12、什么是函数的调用函数调用我首先回想到调用一个值使用的JMP,但是JMP不能被调用多次,这时候我们想到了CALL指令和RET指令组合。例子:0041EFCE CALL 0414FFDC0414F...原创 2018-02-13 10:55:38 · 334 阅读 · 0 评论 -
day38.switch语句为什么效率这么高
第38节:switch语句为什么效率这么高Switch语法:switch(表达式){case 常量表达式1:语句;break;case 常量表达式2:语句;break;case 常量表达式n:语句;break;default:语句;}例子:#include "stdio.h"#include "windows.h"void Myprint(int x){ switch(x){ case 1: p...原创 2018-03-06 20:18:32 · 548 阅读 · 0 评论 -
day31.整数类型
第31节:整数类型在之前的课程我们提到了,所谓变量就是一种容器可以存储数据,里面的数据可以改变。整数类型的宽度如下:char、short、int、longchar 8bit 1字节 0~0xFFshort 16bit 2字节 0~0xFFFFint 32bit 4字节 0~0xFFFFFFFFlong 32bit 4字节 0~0x...原创 2018-02-26 20:40:16 · 164 阅读 · 0 评论 -
day19.反调试之FAKE F8
第19节:反调试之FAKE F8前面学的汇编如何使用,其实我们学的汇编是学习编程的基础,它能解决的问题很多,我们现在来介绍一下反调试,大家都知道做底层安全的人,如果看汇编代码的话,跟看C语言没有什么区别,如果一款软件不能让它很容易的调试,就要用到反调试功能。1、单步步入(F7),单步步过(F8)1)单步步入与单步步过的区别F7在程序调试中是一行行执行的,F8也是一样的,但是在某些情况下不一样,如:...原创 2018-02-12 11:08:29 · 374 阅读 · 0 评论