随笔分类 -  逆向基础

摘要:例如:一个HelloDll.dll 其导出表信息如下: 该dll有4个函数; 用.def的方式导出; 其中有个匿名函数; 1.分析 导入dll中的函数有两种方式: 1】通过序号 2】通过函数名 例如:显式链接dll时使用的库函数“GetProcAddress”实现了用函数的查找; myPlus = 阅读全文
posted @ 2019-11-01 11:15 L丶银甲闪闪 阅读(1129) 评论(0) 推荐(0)
摘要:exe程序中通常会使用动态链接库dll中的函数; dll相当于一个独立的模块,dll中的代码并不会编译到exe程序中; 这就产生了一个问题:exe怎么知道dll中的代码在什么位置; 这就需要dll提供一个清单,这个清单中能清晰说明有多少个函数、它们的名字、地址; 导出表就是这样的一个清单; exe和 阅读全文
posted @ 2019-10-31 16:40 L丶银甲闪闪 阅读(917) 评论(0) 推荐(0)
摘要:1.代码的重用 一般在程序中,代码重用可以用函数来实现; 给其它程序重用代码的实现有两种方式: 1】静态链接库 2】动态链接库 也就是可以用来实现模块化; 1.静态链接库 1)创建静态链接库 vc6中创建:File ->new ->Projects ->Win32 Static Library 头文 阅读全文
posted @ 2019-10-26 10:54 L丶银甲闪闪 阅读(356) 评论(0) 推荐(0)
摘要:可选pe头结构中最后一个属性:_IMAGE_DATA_DIRECTORY DataDirectory[16];用来表示数据目录 1、我们所了解的PE分为头和节,在每个节中,都包含了我们写的一些代码和数据,但还有一些非常重要 的信息是编译器替我们加到PE文件中的,这些信息可能存在在任何可以利用的地方。 阅读全文
posted @ 2019-10-26 10:53 L丶银甲闪闪 阅读(834) 评论(0) 推荐(0)
摘要:如果pe头部没有足够的空间插入一个新的节表,可以考虑扩大最后一个节; 注意是最后一个节,如果扩大中间的节,很可能造成后面的节整体偏移而找不到; 1.扩大节的大概步骤 1】读取文件到缓冲区; 2】拉伸文件镜像; 3】分配一个新的空间:SizeOfImage + Ex; 4】修改最后一个节表的数据: S 阅读全文
posted @ 2019-10-26 10:52 L丶银甲闪闪 阅读(669) 评论(0) 推荐(0)
摘要:可以向pe程序的空白区添加代码; 但是,如果想要添加一段复杂功能的代码,空白区可能空间不够; 一种解决办法是新增一个节,把自己的代码加到这个节中; 1.添加节需要做的事情 添加节需要做两件事: 1】判断是否有足够的空间 2】修改的数据 pe文件的结构: 可以看到: dos头紧接着一堆垃圾数据; 后面 阅读全文
posted @ 2019-10-24 11:34 L丶银甲闪闪 阅读(878) 评论(0) 推荐(0)
摘要:1.工具头文件 #ifndef PETOOL_H #define PETOOL_H #include "stdafx.h" #include <stdlib.h> #include <windows.h> //函数声明 //************************************** 阅读全文
posted @ 2019-10-23 16:13 L丶银甲闪闪 阅读(829) 评论(0) 推荐(0)
摘要:目标: 往一个exe程序中添加一段代码,运行exe程序时先执行自己添加的代码,然后再开始执行exe程序; 例如:使桌面程序crackme.exe执行前,先弹一个框之类的; 思路: 1】修改程序入口 可选pe头中的AddressOfEntryPoint属性决定了程序的入口地址; 可以将这个值设为目标代 阅读全文
posted @ 2019-10-18 15:21 L丶银甲闪闪 阅读(483) 评论(0) 推荐(0)
摘要:// PEOperate.cpp: implementation of the PEOperate class. // ////////////////////////////////////////////////////////////////////// #include "PEOperate.h" ///////////////////////////////////////////... 阅读全文
posted @ 2019-10-17 17:24 L丶银甲闪闪 阅读(789) 评论(0) 推荐(0)
摘要:直接将一个pe文件读到内存中是无法运行的,必须经过拉伸,然后再做其它处理才能可运行; 文件中的pe文件状态为文件映像; 拉伸后的状态为内存映像; 1.pe加载过程 1)根据SizeOfImage的大小,开辟一块缓冲区(ImageBuffer). SizeOfImage是可选pe头中的一个属性; 2) 阅读全文
posted @ 2019-10-17 16:27 L丶银甲闪闪 阅读(1147) 评论(0) 推荐(0)
摘要:1.联合体 有如下的需求: 我们想存储一个人的学号和身份证号,而且只要存储一个就可以了. 学号需要一个字节 身份证需要四个字节 如果设计成: struct Student { char 学号; int 身份证号; } 因为每次最多用一个成员,那另一个成员的空间永远是浪费的. 关于联合类型: unio 阅读全文
posted @ 2019-10-16 09:57 L丶银甲闪闪 阅读(394) 评论(0) 推荐(0)
摘要:1.dos头 结构: struct _IMAGE_DOS_HEADER { WORD e_magic; WORD e_cblp; WORD e_cp; WORD e_crlc; WORD e_cparhdr; WORD e_minalloc; WORD e_maxalloc; WORD e_ss; 阅读全文
posted @ 2019-10-15 16:04 L丶银甲闪闪 阅读(432) 评论(0) 推荐(0)
摘要:每一种操作系统它最重要的格式就是它的可执行文件格式, 因为操作系统就是为了支持这些文件而生成的,内核里面有很多机制,也是配合这种文件格式设计的。 换句话说,这种文件格式也是适合操作系统设计的。 比如: PE 它是 windows 下的文件格式,是 MZ 打头的(4D5A)只有两个字节,后面很大一片就 阅读全文
posted @ 2019-10-14 18:54 L丶银甲闪闪 阅读(460) 评论(0) 推荐(0)
摘要:(一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等, 事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任何扩展名。 那Windows是怎么区分可执行文件和非可执行文件的呢? 我们调用LoadLibrar 阅读全文
posted @ 2019-10-14 18:53 L丶银甲闪闪 阅读(640) 评论(0) 推荐(0)
摘要:代码想转换成.exe文件,需要经过几个步骤: 替换 ->为了可读性或方便,使用了一些宏定义;在编译前,会有一个工具将宏定义的符号替换成相应的值; 编译 ->将代码转成二进制文件; 连接 ->代码中可能用到了别人写的程序,连接就是将别人的程序复制一份放到自己的程序中; 1.宏定义 1)无参数的宏定义 阅读全文
posted @ 2019-10-14 18:52 L丶银甲闪闪 阅读(2255) 评论(0) 推荐(0)
摘要:1.算术移位指令 指令格式:SAL/SAR Reg/Mem, CL/Imm 左边的操作数可以使寄存器或内存,右边的操作数可以是寄存器cl或立即数 SAL(Shift Arithmetic Left): 算术左移 SAR(Shift Arithmetic Right): 算术右移 1)算术左移 左移一 阅读全文
posted @ 2019-10-14 18:51 L丶银甲闪闪 阅读(427) 评论(0) 推荐(0)
摘要:1.多维数组指针 1)用一维数组指针访问一维数组 代码: void fun(){ int arr[5] = {1,2,3,4,5}; int (*p)[5] = &arr; printf("%d\n", *(*(p) + 2)); //结果是3 int (*px)[2] = (int (*)[2]) 阅读全文
posted @ 2019-10-14 18:50 L丶银甲闪闪 阅读(496) 评论(0) 推荐(0)
摘要:1.*()和[] 定义几个不同级别的指针类型的数据 char* p1; char** p2; char*** p3; char**** p4; char***** p5; char****** p6; char******* p7; 1)*运算 代码: printf("%d",*p1); 反汇编: 阅读全文
posted @ 2019-10-14 18:48 L丶银甲闪闪 阅读(345) 评论(0) 推荐(0)
摘要:1.指针数组 1)关于指针数组 一个数组,里面存储的是指针(也就是带*的类型) 指针数组: char* arr[5] = {0}; //用0填充数组 arr[0] = (char*)1; arr[1] = (char*)2; arr[2] = (char*)3; arr[3] = (char*)4; 阅读全文
posted @ 2019-10-14 18:47 L丶银甲闪闪 阅读(816) 评论(0) 推荐(0)
摘要:1.字符串和字符数组 字符数组 : char arr[6] = {'A','B','C','D','E','F'}; char arr[6] = {'A','B','C','D','E','F'}; 字符串: char names[] = "ABCDE"; char names[] = "ABCDE 阅读全文
posted @ 2019-09-29 10:22 L丶银甲闪闪 阅读(257) 评论(0) 推荐(0)