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

浙公网安备 33010602011771号