导入表结构 typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; DWORD OriginalFirstThunk; //RVA 指向IMAGE_THUNK_DATA结构数组 }; DWORD TimeDateStamp; //时间戳 DWORD ForwarderChain; DWORD Name; //RVA,指向dll名字,该名字已0结尾 DWORD FirstThunk; //RVA,指向IMAG…
数据目录 1.我们所了解的PE分为头和节,在每个节中,都包含了我们写的一些代码和数据,但还有一些非常重要 的信息是编译器替我们加到PE文件中的,这些信息可能存在在任何可以利用的地方. 2.这些信息之所以重要,是因为这些信息包含了诸如: PE程序的图标在哪里? 用到了哪些系统提供的函数? 为其他的程序提供哪些函数? 3.编译器添加了这么多信息,那程序是如何找到这些信息的呢? 答案就是:数据目录 4.数据目录定位: 可选PE头最后一个成员,就是数据目录.一共有16个: typedef struct…
向代码节添加代码实现 作者经过一周不断的失败,再思考以及无数次调试终于实现. 思路:八个步骤 1. 文件拷到文件缓冲区(FileBuffer) //图示见(零基础逆向工程18之PE加载过程) 2. 文件缓冲区扩展到内存映像缓冲区(ImageBuffer) 3. 判断代码空闲区是否有足够空间存储ShellCode代码 4. 将代码复制到空闲区 5. 修正E8 6. 修正E9 7. 修改OEP 8. 内存映像缓冲区到新文件缓冲区(NewBuffer) 9. 新文件缓冲区到文件 向其他节(如数据段)空…
重定位表 待补充 IAT表 待补充…
联合体 特点 1.联合体的成员是共享内存空间的 2.联合体的内存空间大小是联合体成员中对内存空间大小要求最大的空间大小 3.联合体最多只有一个成员有效 节表数据结构说明 PE 加载 过程 FileBuffer-ImageBuffer 文件偏移.内存偏移的计算 待补充…
1.获取MessageBox地址,构造ShellCode代码 三种获取方法,参考文章末的一篇帖子. E8 E9计算公式 call 的硬编码:E8 00 00 00 00 jmp 的硬编码:E9 00 00 00 00 计算方法1:E8后面的值 = 真正要跳转的地址 - E8这条指令的下一行地址 计算方法2:E8后面的值 = 要跳转的地址 - (E8的地址 + 5) 2.在代码区手动添加代码 3.修改OEP,指向ShellCode 参考:http://bbs.pediy.com/thread-21…
PE文件的两种状态 1.在硬盘中 节省硬盘空间 硬盘对齐 内存对齐 2.在内存中 3.PE磁盘文件与内存映像结构图 PE文件为什么要分节 -- 手动解析:PE文件 分析软件:飞鸽传书http://www.gpxz.com/soft/jiaoxue/wendang/219212.html 1. DOS头: struct _IMAGE_DOS_HEADER { 0x00 WORD e_magic; //5A4D 0x02 WORD e_cblp; //0090 0x04 WORD e_cp; //0…
1 进程的创建过程 打开系统 --> 双击要运行的程序 --> EXE开始执行 步骤一: 当系统启动后,创建一个进程:Explorer.exe(也就是桌面进程) 步骤二: 当用户双击某一个EXE时,Explorer 进程使用CreateProcess函数创建被双击的EXE,也就是说,我们在桌面上双 击创建的进程都是Explorer进程的子进程. CreateProcess BOOL CreateProcess( LPCTSTR lpApplicationName, // name of exe…
1 引入 为什么会存在临界区这中机制呢?是为多线程同时访问全局变量而引入的.也就是上一篇帖子的末尾流出的问题程序的解决办法. 看懂了上面的,那么我们再罗嗦总结一下: 1.多线程访问全局变量时,存在线程安全问题. 2.局部变量不存在线程安全问题. 2 临界区的使用 2.1 创建CRITICAL_SECTION: CRITICAL_SECTION cs; 2.2 在使用前进行初始化 InitializeCriticalSection(&cs); 2.3 在函数中使用 DWORD WINAPI 线程A…
线程控制 实验 挂起线程 ::SuspendThread(hThread); 恢复线程 ::ResumeThread(hThread); 终止线程 (这里讲了同步调用与异步调用) 方式一: 此方法结束线程会自动清理堆栈 ::ExitThread(DWORD dwExitCode); 方式二: 线程函数返回 方式三: 而此方法结束线程不会自动清理堆栈 ::TerminateThread(hThread,2); ::WaitForSingleObject(hThread,INFINITE); 判断线…