随笔分类 -  逆向基础

摘要:数据库中的数据一般是放在磁盘里面,存取数据的时候就要访问磁盘, 物理访问过程:盘片旋转,磁臂移动 两个过程。盘片旋转到指定位置之后,移动磁臂开始进行数据的存取。 那么存取数据的时间(快慢)主要是在哪部分消耗呢?主要就是定位过程消耗的。 所以:考虑到提高存取数据的速率,实际上就是减少磁盘定位(I/O操 阅读全文
posted @ 2019-12-06 08:46 L丶银甲闪闪 阅读(315) 评论(0) 推荐(0)
摘要:二叉树中使用最广泛的就是搜索二叉树; 搜索二叉树还有其它名称:二叉排序树、二叉查找树等; 1.搜索二叉树的优点 1】有很好的查询性能 2】有很好的新增和删除的性能 3】若左子树不空,则左子树上所有结点的值均小于它的根结点的值 4】若右子树不空,则右子树上所有结点的值均大于它的根结点的值 5】左、右子 阅读全文
posted @ 2019-12-06 08:36 L丶银甲闪闪 阅读(339) 评论(0) 推荐(0)
摘要:1.二叉树的结构 顺序表 ->查找快,新增删除慢; 链表 ->查找慢,新增删除快; 二叉树 ->查找、新增、删除都比较快; 二叉树结构: 满二叉树:所有的节点都是有数据的 完全二叉树:从右往左看,右边的元素可以不满,左边的元素必须是满的 二叉树的一些常用概念: 根节点 ->第一个元素就是根节点,例如 阅读全文
posted @ 2019-12-06 08:34 L丶银甲闪闪 阅读(382) 评论(0) 推荐(0)
摘要:1.关于链表 链表的特点: 1】数据分散存储 2】查询性能没有Vector好 3】新增与删除的性能好于Vector 链表的种类: 单链表 ->由多个节点组成,每一个节点中保存数据和下一个节点的指针; 循环链表 ->最后一个节点中的指针指向头结点; 双向链表 ->每个节点多维护一个指针,两个指针分别指 阅读全文
posted @ 2019-12-04 09:02 L丶银甲闪闪 阅读(430) 评论(0) 推荐(0)
摘要:程序中会使用数据结构;例如:顺序表、链表、二叉树; 数据结构在底层中本质上只有两种:数据之间挨着和不挨着; 1.关于Vector 1】本质就是一个数组 2】可以动态扩充容量 3】支持下标方法,查询性能好 4】新增数据和删除数据较差 比如在A和B之间插入一个元素,B后面的所有数据都要后移 2.实现Ve 阅读全文
posted @ 2019-11-29 11:21 L丶银甲闪闪 阅读(374) 评论(0) 推荐(0)
摘要:1.new和delete 程序的内存分为不同的区; 全局变量区中的变量在程序编译时决定,不需要管理内存; 局部变量一般存放在栈中,当用到时放入栈中,不用时栈中的地址处变成垃圾数据,也不需要管理; 而用malloc在堆中申请的内存在使用完后要调用free函数来释放; 1)关于malloc和free m 阅读全文
posted @ 2019-11-29 11:19 L丶银甲闪闪 阅读(377) 评论(0) 推荐(0)
摘要:1.冒泡排序 代码: void Sort(int* arr,int nLength) { int i; int k; for(i=0;i<nLength-1;i++) { for(k=0;k<nLength-1-i;k++) { if(arr[k]>arr[k+1]) { int temp = ar 阅读全文
posted @ 2019-11-27 10:20 L丶银甲闪闪 阅读(254) 评论(0) 推荐(0)
摘要:1.继承和虚函数 1)没有继承时虚函数表 Base结构,里面有3个函数:Function1、Function2、Function3; 虚表: 2)单继承无函数覆盖 Base结构: Function1、2、3; Sub结构继承Base: Function4、5、6; 虚表: 子类对象的虚表中包含子类和 阅读全文
posted @ 2019-11-27 10:17 L丶银甲闪闪 阅读(246) 评论(0) 推荐(0)
摘要:1.关于虚函数 在名函数前加关键字“virtual”的函数为虚函数; 例如:class Base { public: void Function_1() { printf("Function_1...\n"); } virtual void Function_2() //虚函数 { printf(" 阅读全文
posted @ 2019-11-27 10:15 L丶银甲闪闪 阅读(358) 评论(0) 推荐(0)
摘要:1.使用#include分离函数的定义与实现 c语言可以在xxx.h中定义函数,然后在xxx.cpp中实现函数; 在需要用到这些函数时,只要用#include引入xxx.h即可,这样就不用将所有代码全部写在一个cpp中; 将函数定义与实现分离,代码会有更好的可读性但不是必须的 ; xxx.h str 阅读全文
posted @ 2019-11-27 10:12 L丶银甲闪闪 阅读(242) 评论(0) 推荐(0)
摘要:1.构造函数 通过结构体创建一个对象时,需要先声明结构体变量、再给结构体每个成员赋值(也就是所谓的初始化); 如果能够在声明变量时就直接给结构成员赋值会更加方便;构造函数就是为了达到这一目的; 构造函数: 结构体中的Person函数就是构造函数 struct Person { int age; in 阅读全文
posted @ 2019-11-27 10:09 L丶银甲闪闪 阅读(400) 评论(0) 推荐(0)
摘要:1.用结构作参数 struct Base{ int x; char y; }; int fun(Base b){ return b.x + b.y; } int main(int argc, char* argv[]) { Base b; b.x = 1; b.y = 2; fun(b); getc 阅读全文
posted @ 2019-11-27 10:03 L丶银甲闪闪 阅读(224) 评论(0) 推荐(0)
摘要:1.主要思路 新建一个测试用的dll,在dll的入口函数中添加一个在加载阶段执行的函数Init(); 给目标程序添加一个新节,将导入表移动到新节中; IAT表不能移动,因为程序在调用dll中的函数时,都是call的IAT表的绝对地址;然后在IAT表中找到真实的函数地址; 如果移动了IAT表,需要修复 阅读全文
posted @ 2019-11-21 10:26 L丶银甲闪闪 阅读(1020) 评论(1) 推荐(0)
摘要:例如: 有一个游戏修改器;其中有一个按钮“自动打怪”;点击时游戏会实现相应的功能; 对于游戏程序来说,自动打怪操作本质上就是call调用一个函数; 但是修改器和游戏是两个独立的程序,游戏无法直接调用修改器中的函数; 可以考虑将修改器中的函数封装成一个dll,然后想办法将dll放到游戏的4gb空间,这 阅读全文
posted @ 2019-11-21 10:24 L丶银甲闪闪 阅读(665) 评论(0) 推荐(0)
摘要:1.关于绑定导入 一般情况下,在程序加载前IAT表和INT表中的内容相同,都是程序引用的dll中的函数的函数名或序号; 加载完成后IAT表中将替换为函数的真正地址; 但在加载前IAT表中直接写绝对地址是可以实现的; 加载前在IAT表中保存绝对地址的优点:启动程序快; 在启动程序时需要:申请4gb内存 阅读全文
posted @ 2019-11-19 18:17 L丶银甲闪闪 阅读(722) 评论(0) 推荐(0)
摘要:1.关于IAT(import address table)表 当exe程序中调用dll中的函数时,反汇编可以看到,call后面并不是跟的实际函数的地址,而是给了一个地址; 这些连起来就是一张表,就是IAT表; 1)内存镜像中的dll中函数的调用; 例如:一个exe中调用系统提供的dll中的Messa 阅读全文
posted @ 2019-11-19 11:48 L丶银甲闪闪 阅读(1933) 评论(0) 推荐(1)
摘要:1.移动重定位表 目的:将测试用的DllHello.dll的重定位表移动到一个新增的节中,如果dll还能正常使用说明移动成功; 主要步骤: 1】新增一个节; 新增一个节表 ->判断是否有足够的空间存放新节表,条件是最后一个节表后面到SizeOfHeaders之间是否有80个字节; 新增一个节 ->紧 阅读全文
posted @ 2019-11-15 08:39 L丶银甲闪闪 阅读(778) 评论(0) 推荐(0)
摘要:1.为什么要移动pe结构中的表 1】这些表是编译器生成的,里面存储了非常重要的信息; 比如,导出表中粗存了该pe文件有哪些导出函数并且这些函数的地址在哪; 2】在程序启动的时候,系统会根据这些表做初始化的工作: 比如,将用到的DLL中的函数地址存储到IAT表中. 3】为了保护程序,可以对.exe的二 阅读全文
posted @ 2019-11-13 17:55 L丶银甲闪闪 阅读(885) 评论(1) 推荐(0)
摘要:1.创建一个用来试验的目标dll 头文件: #if !defined(AFX_HELLO_H__87AA4900_2935_4604_AFB2_7CD004B103D8__INCLUDED_) #define AFX_HELLO_H__87AA4900_2935_4604_AFB2_7CD004B1 阅读全文
posted @ 2019-11-09 13:00 L丶银甲闪闪 阅读(1321) 评论(0) 推荐(0)
摘要:1.程序的加载 1)exe程序的加载过程 操作系统会给程序分配一个独立的4gb的虚拟空间;地址从0开始到ffffffff; 其中高2g是内核来使用的,程序无法直接读写高2g的内存,如果想操作该内存需要遵守一定的格式也就是所谓的驱动程序; 然后像贴图一样将程序加载到这段空间; 首先将exe从Image 阅读全文
posted @ 2019-11-08 17:48 L丶银甲闪闪 阅读(643) 评论(0) 推荐(0)