自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小喇叭儿滴滴的吹

———— 安安静静的做一名代码观察师 ^_^

  • 博客(107)
  • 收藏
  • 关注

原创 csdn博客转markdown

近期完成了csdn上的部分博客转到个人博客上,csdn使用的传统编辑器,个人博客使用的markdown,所以下面分享一下两者之间转化。

2023-03-18 15:21:18 1431

原创 ARM汇编基础下

这一篇主要就总结一下ARM汇编中一些指令相关的知识点,指令相关的东西还是挺多的,所以只能挑一些重点来记录。在上一篇中有说指令集相关的内容,这里的话主要是讨论arm指令集,也就是4字节的。首先,先来看一下指令的一般编码格式,固定占用四字节对于上图的符号以及参数说明如下:opcode : 指令操作符编码cond : 指令执行的条件编码S : 决定指令的操作是否影响CPSR的值(是否影响标志寄存器)Rd : 目标寄存器编码Rn : 包含第1个操作数的寄存器编

2021-04-12 09:25:16 749

原创 ARM汇编基础上

ARM是一个精简指令集处理器,其指令集的设计是定长的,也就是其汇编对应的机器码是定长的(2字节或者4字节)。那么对于定长而言,其优点就是更快的被执行,因为这样CPU取指令译码的速度相对x86的CPU会快一些,但是缺点也比较明显,毕竟定长,那么表示其指令有限(指令少),所以一定程度上会软件的复杂度(需要几条指令才能完成一个功能)。ARM的指令集一开始设计定长都是2字节的,随着时间的发展,会发现指令可能已经不够表达了,所以后面又出现了4字节的指令集。对于2字节的指令集称为thumb指令集,而4字节的称为ar

2020-08-09 13:24:41 1108 1

原创 ARM逆向-表达式求值

表达式求值也就是把各类加减乘除的运算都看一遍,这里主要记录的是Release版中的一些优化,各种优化手段我感觉有x86的逆向基础还是会比较好理解的,因为很多都很类似。首先看一下加减的运算,这里主要可能会出现常量折叠和常量传播等优化手段int main(int argc,char* argv[]){ int n1 = argc; int n2 = 0; scanf("%d", &n2); n1 = n1 - 100; n1 = n1 + 5 - n2

2020-07-14 21:09:24 503

原创 C++ 虚继承

对于虚继承而言,是用于解决其在多重继承时出现的二义性问题,所以首先我们先来看看多重继承时会出现的问题//家具类class CFurniture{public: CFurniture() { m_nPrice = 0; } virtual ~CFurniture() { printf("virtual ~CFurni...

2020-07-06 22:35:02 633

原创 逆向-字符串

在C语言中,字符串其实就是一个特殊的数组,一个以零结尾的字符数组而已,所以对于定位字符串中的字符的话可以参考上一篇博客-数组。这篇博客主要用于记录字符串的一些操作函数,以便于在逆向识别的时候可以顺利的还原为函数。这里因为在release版下其字符串操作函数会内嵌汇编,也就是说并不是使用call来调用函数,所以我们需要来逆向识别一下。所以下面我们讨论的都是release版下的情况,并且使用的编译...

2020-06-29 13:59:38 3875

原创 64位汇编入门

忽然间想记录一下64位的汇编...这里的话主要就是记录一下和32位汇编的一些比较大的差别,主要就是寄存器和函数调用这两方面,指令什么的话我觉得就遇到查就可以了,有时间的话整理吧。首先先来看寄存器,如下图对于上图而言,白色背景部分表示兼容x86的寄存器,支持所有的模式,而对于灰色部分而言,表示扩展的寄存器,只支持64位模式。先来看通用寄存器,可以发现扩展了8个通用的寄存器,也就是R8-R15,并且由原先的32字节扩展为64个字节,总共16个寄存器EAX -> RAXEBX -&g

2020-06-20 17:49:27 6111

原创 逆向-数组

对于数组而言,我们需要理解其数组的寻址公式,而其公式又与其内存的分布息息相关,所以当你了解了其内存分布,那么这个公式自然而然也能推出来。首先数组有如下两点性质连续性-排列连续一致性-类型一致因为有其连续的特点,所以其内存模型也就比较好理解,下面我们来看一下如下代码int arr[5] = {0,1,2,3,4}上面就是其内存模型,对于一致性的特点,可以推定其每个元素占...

2020-06-14 12:50:17 467

原创 逆向-函数

函数的工作机制主要是依托栈结构来实现的,首先栈的一种后进先出的结构,为什么使用这种数据结构,因为这和我们函数调用的流程很类似,当程序嵌套调用时,最后一个调用的函数总是最先返回。对于函数,我们先从宏观上大体的先去了解,后面在看一些内部细节,简单理解函数调用的话,就是在程序动态的运行中,每进入一个函数,总有一块独立的栈函数空间供它使用,这段空间可以存储各类函数需要用到信息,如局部变量,参数等等,当...

2020-06-07 14:13:27 601

原创 逆向-循环结构

对于循环结构而言,主要就三种,do-while循环,while循环,for循环,这三种循环,在debug下其特点还是比较明显的,在release下的话可以说基本上都被优化为do-while循环(效率高),所以说release下的循环,根据其汇编代码我们只能做等价的还原。下面先来看do-while循环int main(int argc, char* argv[]){ int i ...

2020-05-26 16:20:58 660

原创 逆向-分支结构下

上一篇说完IF结构,这一篇就接着总结分支结构中的switch,对于switch结构,编译器共有四种方案提供选择,我们不必去关心编译器何时会选择何种结构,因为这个完全取决于编译器作者,所以我们只需能识别出这四种方案是switch结构即可。对于switch结构而言,不管哪种方案,其主要分两部分引导代码case块集合对于不同的方案,其case块集合是不变的,主要在于其引导方式的变化。...

2020-05-18 19:03:56 289

原创 逆向-分支结构上

前面把一些基本的运算都记录完了,后面开始流程结构,其流程结构主要分为分支结构和循环结构。对于流程结构的逆向识别,主要在于首先需要识别是什么,然后识别语句体(花括号上下界位置),因为确定好了这两步后,其里面的主体内容就是前面的基本运算或者又是流程结构(递归进行逐步分解)。对于流程结构主要就以debug版为主了,因为debug版更加利于研究其结构如何,而release中除了结构以外,还混有一些的优...

2020-05-08 17:12:43 305

原创 逆向-三目运算

首先,先简单回顾一下三目运算符(条件表达式)的格式表达式一 ? 表达式二 : 表达式三当表达式一的结果为真时,选择执行表达式二,否则执行表达式三。看完这个格式,很明显这是一个有分支的结构,那么编译器会老老实实的都按分支语句进行编译么,下面我们还是需要来分情况讨论一下。1.当表达式二或表达式三不为常量2.表达式二或表达式三为常量 2.1 当表达式一为0的等值比较,表达式...

2020-04-28 13:58:36 339

原创 C++ 虚函数

对于虚函数而言,这篇博客主要侧重于理解虚函数的实现机制,也就是如何实现的多态?在C++中,使用virtual关键字声明的函数为虚函数。当类中有虚函数时,编译器会将该类中所有虚函数的首地址保存在一张表中,这张表也称为虚函数地址表(虚表),在我们代码层面可以理解为函数指针数组。同时编译器还会在类中添加一个隐藏数据成员,该成员称为虚表指针,该指针也就是用于保存前面所说的虚表首地址。好了,下面就先...

2020-04-19 20:21:01 603

原创 逆向-取模运算

除法终于整理结束了,这篇开始整理取模运算,对于取模运算来说,个别的情况还是需要使用除法的,所以除法运算的基础还是得牢靠。取模也叫取余,表达为 a % b。下面需要对b的情况进行区分来分析1. 变量2. 常量 2.1 无符号 2.1.1 2的幂 2.1.2 非2的幂 2.2 有符号 2.1.1 2的幂 ...

2020-04-15 14:15:29 3914 1

原创 逆向-除法优化下

由于除法优化实在太多了,所以这一篇继续讲,前面一篇说了除数为正数情况(常量),那么这篇就来说一说除数为负数的情况。首先里面涉及的很多基础知识请翻上一篇查看,其实如果理解了上一篇的那些基本原理,除法为负的情况也是很好理解的,因为除数为负的情况都是在除数为正的情况之上做了一点点的变化。首先还是先来分一下情况除数为常量-除数为负数情况 1.被除数无符号情况 2.被除数有符号情况...

2020-04-10 15:11:07 382

原创 逆向-除法优化上

上一篇说完加减乘的优化,这篇来说说除法,首先先打个铺垫,除法的优化涉及到各种数学公式,这里我们主要探讨一下结论,具体的证明可以参考《C++反汇编与逆向分析技术揭秘》,这里做一个总结。首先,如果除数为变量时,是没有任何的优化空间的,所以老老实实的上对应的汇编代码即可,所以就不讨论了。下面主要来讨论下除数为常量的情况,并且这个常量还是正数,负数情况下一篇博客介绍。首先,先来看一下需要讨...

2020-04-02 23:54:28 810

原创 逆向-加减乘运算

后面打算记录一下逆向识别的学习过程,也就是把每个C语言中的基础关键点都反汇编,然后对比观察。虽然说这里的每一步都是很简单,但是就算简单也还是得看,毕竟每个程序都是由这些一个个简单的点组合而成,当进行反汇编还原时,也就是将反汇编一点点拆分成这若干块的小知识点。好了,首先看最基础的四则运算,也就是加减乘除,当然这篇博客并不包括除,除法的话下面博客再记录吧(因为优化有些复杂了,怕篇幅过长)。首先...

2020-03-22 19:32:34 569

原创 PE结构-重定位表

首先,先来说一下为什么需要重定位表,先来观察一段程序00401000 >/$ 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL00401002 |. 68 1D204000 push 0040201D ...

2020-03-04 19:41:44 355

原创 PE结构-导出表

在上一篇博客中说了导入表,所谓的导入表,其实相当于记录程序所依赖的函数库信息,类似于你要调用外部函数,总得记录下这个函数在哪个库中,名字或者序号是什么。有了这些信息后,我们就可以LoadLibrary和GetProcAddress获取函数地址了那么,操作系统是如何来获取函数地址呢,也就是GetProcAddress的实现,这里就涉及到了导出表。导出表,会记录这个库函数的地址是多少,所以简单来说...

2020-03-02 23:36:17 360

原创 PE结构-导入表

首先就是确定如何定位导入表的位置,导入表是位于数据目录项的第二项前四个字节为相对虚拟地址(RVA),后四个字节为大小(这里做个参考,不依赖)好了,既然是RVA,那么说的就是内存中情况,那么如何在文件中定位到导入表位置呢,这里我们则需要做的就是将RVA转换为FA,这里的话就大致来说明一下,不清楚的可以参考下其他博客先来看一下节区的分布情况,有2个节,分别在0x1000处和0x2000...

2020-02-13 17:58:18 397

原创 PE结构-节

首先,节的话有两部分,一部分是节表,另外一部分就是节区了,节表是用于描述节区信息的,而节区呢,简单点说就是数据块。在上一篇博客中有提及过如何定位节表,重点就是需要根据选项头的大小来定位,这里的话就直接上一点代码吧,前两篇概念较多 PIMAGE_DOS_HEADER pDosHeader = GetDosHeader(); //获取dos头 if (pDosHeader ==...

2020-02-12 22:12:11 444

原创 PE结构-Nt头部

首先,我们需要知道如何定位到Nt头部,这个在上篇博客中Dos头部的e_lfanew字段中,该字段可定位到Nt头部先来看一下这个32位的Nt结构typedef struct _IMAGE_NT_HEADERS { DWORD Signature; //50 45 00 00 PE标志 IMAGE_FILE_HEADER FileHeader; //文件头 IMA...

2020-02-11 23:53:24 359

原创 PE结构-Dos头部

啥是PE结构?简单来说,就是将代码和数据按照一定的约定进行存放,为进程的创建做准备。微软当初在设计PE结构时,目标是设计成多平台的,所以里面很多字段考虑了跨平台因数,当然现在来看,这个跨平台...en..就不用多说啥了。先来了解一下PE结构的大概情况IMAGE_DOS_HEADER //DOS头IMAGE_NT_HEADERS //NT头 DWORD Signature /...

2020-02-10 19:34:06 355

原创 模态对话框引发的窗口过程重入问题

首先,先普及下什么是模态对话框,模态对话框的话就是不能在对话框和该程序的其他窗口之间进行切换,必须结束该对话框才可以进行其他操作。可以使用DialogBox创建一个模态对话框,至于为啥这个对话框会造成上面的原因呢,其实msdn上有那么一段解释:The DialogBox macro uses the CreateWindowEx function to create the dialog...

2019-09-15 15:30:52 281

原创 C++ 继承

对于继承,我们先不说概念。下面我还是先用C模拟并借助汇编的方式来理解它,侧重于学习继承的内存模型。我们先来看代码,设计三个类,People类,Teacher类,Student类struct Person { int age; //年龄 int sex; //性别 }; struct Teacher { int age; //年龄 int sex; //性...

2019-08-10 19:14:11 762

原创 C++ 权限控制

首先,先来谈谈为什么会有权限控制这一东西?看如下代码struct Test{ int a; int b;};int main(){ Test test; test.a = 2; test.b = 3; test.a = 4; system("pause");}这段代码是不是写起来特别爽,一直写一直爽。好了,此时假设对于这...

2019-08-05 23:41:30 636

原创 C++ 构造和析构

啥是构造和析构,下面我们还是从C语言的角度来学习C++,简述构造和析构语法的设计由来。先看如下代码:struct Test{ int a; int b;};int main(){ Test test; test.a = 5; test.b = 7; printf("%d %d",test.a,test.b); return...

2019-08-04 19:10:17 501

原创 C语言到C++的改进

下面总结下C语言到C++后的一些改进,主要偏语法上哈1. 类型敏感//C and C++unsigned int i = -1; // ok//Cunsigned int i = {-1}; // ok//C++unsigned int i = {-1}; // err int转换到unsigned int需要收缩转换//Cfloat f = {3.14}; ...

2019-08-04 01:03:34 428

原创 C语言到C++的过渡

C++是由C演变过来的,两者必定是有联系的。这篇博客主要是过渡C,引出一些C++的基础概念,下面我会用C来模拟并借助汇编的方式来帮助大家更好的理解C++。typedef struct Base{ int a; int b;}Base;int getMax(Base base){ return base.a >= base.b ? base.a :...

2019-08-03 17:42:58 278

原创 洗牌算法

所谓的洗牌算法,大概意思就是将一组数随机打乱,说到随机,很容易就想到C里面的rand函数,en...说到这个函数,看看该函数如何使用#include <stdio.h>#include <time.h>#include <stdlib.h>int main(int argc, char *argv[]){ srand(time(NULL));...

2019-07-02 21:02:02 441 1

原创 使用WinHex观察内存(C)

咳咳,好久没写博客了,主要太忙(懒)了,以后会坚持写博客,记录学习的一点一滴。1. 首先,编写个bat脚本,使用命令行进行C的编译链接,这里需配置环境变量@echo offset /p var=请输入源代码文件名:@echo oncl /c /W4 /WX %var%.clink %var%.obj@echo offpausecls@echo on%var%.ex...

2019-06-23 23:47:23 2805 2

原创 C语言选择结构与循环结构逆向分析

首先,得先会正向开发的选择和循环结构,不会正向,如何逆向呢?收藏一句话:开发的水平决定了你逆向的高度,en....很有道理编译器:VC++ 6.0学习之前需要先了解几个汇编指令:JMP 指令:指令格式:MOV EIP,寄存器/立即数 简写为 JMP 寄存器/立即数无条件跳转,修改EIP的值。CMP指令:指令格式:CMP R/M,R/M/IMM...

2017-11-30 23:07:28 854

原创 C语言基本类型与其数据存储方式

好久没有更新博客了,最近对逆向十分着迷,信息安全的知识量是真的庞大,是时候该做一波笔记了,哈哈。看下图,C语言数据类型分为右边四大类型,这篇博客重点讲基本类型,因为其他类型还没学呢~~整数类型数据类型分为 char short int long 四种char 8BIT 1字节 -----宽度...

2017-11-24 23:37:16 4126

原创 ACM-红与黑

问题描述        有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。输入数据        包括多个数据集合。每个数据集合的第一行是两个整数 W 和 H,分别表示 x 方向和 y 方向瓷砖的数量。 W 和 H 都不超过 20。在接下来的 H 行中,每行

2017-04-14 15:23:51 1039

原创 ACM-放苹果

问题描述        把 M 个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用 K 表示)注意: 5, 1, 1 和 1, 5, 1 是同一种分法。输入数据       第一行是测试数据的数目 t( 0 输出要求       对输入的每组数据 M 和 N,用一行输出相应的 K。输入样例17

2017-04-14 14:28:54 613 1

原创 ACM-逆波兰表达式

问题描述        逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式 2 + 3 的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4 的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括 + - * / 四个。输入数据        输入为一行,其中运算

2017-04-14 13:22:35 740

原创 ACM-二叉树

问题描述      满二叉树        如上图所示,由正整数 1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结点(编号是 1 的结点)都有一条唯一的路径,比如从 10 到根结点的路径是(10, 5, 2, 1),从 4 到根结点的路径是(4, 2, 1),从根结点 1 到根结点的路径上只

2017-04-14 11:23:12 865

原创 ACM-讨厌的青蛙

问题描述        在韩国,有一种小的青蛙。每到晚上,这种青蛙会跳越稻田,从而踩踏稻子。农民在早上看到被踩踏的稻子,希望找到造成最大损害的那只青蛙经过的路径。每只青蛙总是沿着一条直线跳越稻田,而且每次跳跃的距离都相同,如图 8-4 所示。 稻田里的稻子组成一个栅格,每棵稻子位于一个格点上,如图 8-5 所示。而青蛙总是从稻田的一侧跳进稻田,然后沿着某条直线穿越稻田,从另一侧跳出去,如图

2017-04-14 10:38:51 1512

原创 ACM-熄灯问题

问题描述        有一个由按钮组成的矩阵,其中每行有 6 个按钮,共 5 行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变 3 盏灯的状态;在矩阵边上的按钮改变 4 盏灯的状态;其他的按钮改变 5 盏灯的状态。在下图 8-1 中,左边矩

2017-04-13 16:25:33 829

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除