主要看了一下汇编的语法知识,指令算比较熟悉了
一点笔记贴上来
80X86汇编学习笔记
代码
====================================================
; Example: Hello World
; Author GYARMY
; Date: 2018-4-10
.386
.MODEL FLAT
ExitProcess PROTO stdcall, dwExitCode:DWORD
.STACK 4096
.DATA
msg BYTE "Hello Wor...
理解定长
理解可变长
MOdR/M
SIB
全文下载
直接分享给大家,DT的课件
硬编码.xls
Intel白皮书.zip
主要学习了,PE的简单知识,代码进行了实现
// PEOperate.cpp: implementation of the PEOperate class.
//
//////////////////////////////////////////////////////////////////////
#include "PEOperate.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
////////////...
测试代码的效果,
只适用于 win自带的 程序
void TestPrintBindImportDirectory(LPSTR lpszFile)
{
LPVOID pFileBuffer = NULL;
pFileBuffer= ReadPEFile(lpszFile);
if(!pFileBuffer)
{
printf("文件读取失败\n");
return;
}
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader ...
导入表有些复杂,文件与内存中的格式不太一样
理解导入表的结构是关键
void TestPrintImportDirectory(LPSTR lpszFile)
{
LPVOID pFileBuffer = NULL;
pFileBuffer= ReadPEFile(lpszFile);
if(!pFileBuffer)
{
printf("文件读取失败\n");
return;
}
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FIL...
直接更改文件的ImageBase,进行的测试
void testUseReloc(LPSTR lpszFile)
{
LPVOID pFileBuffer = NULL;
pFileBuffer= ReadPEFile(lpszFile);
if(!pFileBuffer)
{
printf("文件读取失败\n");
return;
}
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HE...
很笨的方法
(写过才能知道,哪些地方,需要注意,开始想的很简单,就三部,写了 一个多小时!!)
void TestMoveRelocDirectory(LPSTR lpszFile)
{
/*
1 新增一个节
2 把重定位的表 移动到那个节中
3 更改标志位
*/
LPVOID pFileBuffer = NULL;
pFileBuffer= ReadPEFile(lpszFile);
if(!pFileBuffer)
{
printf("文件读取失败\n");
return;
}
PIMAGE_DOS_HE...
具体创建如何创建def类型的导出表可以直接自己测试
这里只贴 使用的代码
// 20171111_01.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#pragma comment(lib,"TestDef.lib")
/*
extern "C" __declspec(dllimport) __stdcall Plus(int x,int y);
extern "...
1 在DLL中新增一个节, 并返回新增的FOA
2 复制AddressOfFunctions 长度:4*NumberOfFunctions
3 复制AddressOfNameOrdinals 长度:NumberOfNames*2
4 复制AddressOfNames 长度:NumberOfNames*4
5 复制所有的函数名
长度不确定,复制时直接修复AddressOfNames
6 复制IMAGE_EXPORT_DIRECTORY结构
7 修复IMAGE_EXPORT_DIRECTORY结构中的
AddressOfFunctions
Ad...
了解表结构,输出信息,一个函数的实现
void printDirectoryRelocTable(LPSTR lpszFile)
{
LPVOID pFileBuffer = NULL;
pFileBuffer= ReadPEFile(lpszFile);
if(!pFileBuffer)
{
printf("文件读取失败\n");
return;
}
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pP...
网址:http://blog.csdn.net/reversalc/article/details/8022977
1 基本概念
下表描述了贯穿于本文中的一些概念:
名称
描述
地址
是“虚拟地址”而不是“物理地址”。为什么不是“物理地址”呢?因为数据在内存的位置经常在变,这样可以节省内存开支、避开错误的内存位置等的优势。同时用户并不需要知道具体的“真实地址”,因...
两个函数的具体实现
直接上代码了, 懒得讲了
// PEOperate.cpp: implementation of the PEOperate class.
//
//////////////////////////////////////////////////////////////////////
#include "PEOperate.h"
//////////////////////////////////////////////////////////////////////
// Constructi...
测试打印PE输出表信息
主要是RVA 和 FOA 之间的转换要注意, 单独写了一个函数进行转换
转换函数
DWORD RVAToFileOffset(LPVOID pFileBuffer,DWORD dwRva)
{
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHead...
开始以为很简单(直接可以进行文件更改)
一开始的思路
主要是是对节表进行合并
1: 更改节表(变为一个,更改内存大小, 更改文件大小)
2:更改属性
3: 更改节的数目
直接使用文件修改的方法(手动修改方法)
全部无法运行, 蛋疼的厉害
然后,直接先转换为 ImageBuffer, 再次修改, 几个属性,才搞定
我也不知道为什么.
贴一下修改的代码
// PEOperate.cpp: implementation...
添加一个节 需要修改的数据
1 添加一个新的节 (copy一份)
2 在新增节的后安眠, 填充40个00
3 修改pe头中节的 数量
4 修改SizeOfImage的大小
5 在原有的数据的最后,新增一个节的数据,(内存对齐的整数倍)
6 修正增加的节的属性
手动新增一个节表和节 保证修改后的程序能正常运行
编程实现,新增一个节, 病添加代码
编程实现,扩大最后一个节,并添加代码
测试代码,写的很垃圾, 可用, 不过,不推荐大家使用
void TestAddSecToFile(LP...