C语言编写控制台下PE分析工具(二)

五、输出数据目录表信息

由于数据目录数组中包含16个元素,所以循环16次,依次输出每个数据目录表的信息:

void ShowDataDirInfo(PMAP_FILE_STRUCT stMapFile)
{
char strTmp[9] = { 0 };
char data[16][50] = {
"Export Table:",
"Import Table:",
"Resource:    ",
"Exception:   ",
"Security:    ",
"Relocation:  ",
"Debug:       ",
"Copyright:   ",
"Globalptr:   ",
"Tls Table:   ",
"LoadConfig:  ",
"IAT:         ",
"Bound Import:",
"COM:         ",
"Delay Import:",
"No Use:      "
};


PIMAGE_OPTIONAL_HEADER pOH = nullptr;
pOH = GetOptionalHeader(stMapFile->ImageBase);
if (!pOH)
{
return;
}
printf("\n\n[Data Directory]\n");
printf("\t\t\t  RVA\t\t\t  Size\n");
for (int i = 0; i < 16; i++)
{
printf("%s\t\t%08lX\t\t%08lX\n", data[i], pOH->DataDirectory[i].VirtualAddress, pOH->DataDirectory[i].Size);
}
}


结果如下图所示:



六、输出区块表信息

首先获取指向第一个区块表的指针

PIMAGE_SECTION_HEADER  GetFirstSectionHeader(LPVOID ImageBase)
{
if (!ImageBase)
{
return nullptr;
}


PIMAGE_NT_HEADERS pNH = nullptr;
PIMAGE_SECTION_HEADER pSH = nullptr;
pNH = GetNtHeaders(ImageBase);
if (!pNH)
{
return nullptr;
}


pSH = IMAGE_FIRST_SECTION(pNH);
return pSH;
}


然后根据IMAGE_FILE_HEADER中的SizeOfOptionalHeader判断区块表的数目,循环输出每一个区块表:

void ShowSectionHeaderInfo(PMAP_FILE_STRUCT stMapFile)
{
PIMAGE_FILE_HEADER pFH = nullptr;
PIMAGE_SECTION_HEADER pSH = nullptr;


pFH = GetFileHeader(stMapFile->ImageBase);
if (!pFH)
{
return;
}


WORD OptionalLength = pFH->SizeOfOptionalHeader;
PIMAGE_OPTIONAL_HEADER pOH = GetOptionalHeader(stMapFile->ImageBase);
pSH = (PIMAGE_SECTION_HEADER)((DWORD)pOH + OptionalLength);


printf("\n\n[Section Table]\n");
printf(" Name    VAddress   VSize    RAddress   RSize     Flags\n");
for (int i = 0; i < pFH->NumberOfSections; i++)
{
printf("%s\t%08lX  %08lX  %08lX  %08lX  %08lX\n", pSH->Name, pSH->VirtualAddress, pSH->Misc, 
pSH->PointerToRawData, pSH->SizeOfRawData, pSH->Characteristics);
pSH++;
}
}


结果如图所示:



主函数:

MAP_FILE_STRUCT stMapFile = { nullptr, nullptr, nullptr };


int main()
{
LPTSTR filePath = TEXT("D:\\PEInfo_example.exe");
UnLoadFile(&stMapFile);
if (!LoadFile(filePath, &stMapFile))
{
return -1;
}


if (!IsPEFile(stMapFile.ImageBase))
{
UnLoadFile(&stMapFile);
return -1;
}

ShowFileHeaderInfo(&stMapFile);

ShowDataDirInfo(&stMapFile);
ShowSectionHeaderInfo(&stMapFile);

UnLoadFile(&stMapFile);
return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
光盘: ├─chap01....................................第1章 PE文件格式的深入分析 │ └─PEDump.zip ;Matt Pietrek的PEDUMP程序 │ ├─chap02....................................第2章 PE分析工具编写 │ ├─PEInfo_example ;PE分析工具样例 │ └─Test ;TestSH.exe,这个程序的OptionalHeader的大小为0xD0 │ ├─chap03....................................第3章 Win32 调试API │ ├─内存补丁 │ │ ├─进程间内存共享机制应用.txt │ │ ├─使用Dr X调试寄存器框架程序.txt │ │ └─bpm example code ;yoda的实例,演示利用Ntdll.ntcontinue作为跳板在入口点处中断 │ └─脱壳机 │ ├─Unlock.asm ;脱壳机的源程序 │ ├─unlock.exe ;己编译好的脱壳机程序 │ └─locked.exe ;被tElock 0.98保护的记事本程序 │ ├─chap04....................................第4章 Windows下的异常处理 │ ├─sehRelease │ │ ├─sehdef.inc ;完整的异常代码列表 │ │ ├─s1.asm ;例子1.演示Final型异常处理及参数获取 │ │ ├─s2.asm ;例子2.演示Per_Thread型异常处理 │ │ ├─s3.asm ;例子3.演示Per_Thread型异常处理的嵌套处理 │ │ └─S4.ASM ;例子4.演示异常处理的堆栈展开 │ ├─ring ;例子5.演示Windows9x进特权级Ring0 │ ├─singlestep ;例子6.演示SEH实现单步自跟踪 │ └─veh ;例子7.VEH代码演示 │ ├─chap05....................................第5章 反跟踪技术 │ ├─Anti-Debug ;5.1 反调试技术 │ │ ├─MeltICE ;句柄检测 │ │ ├─Back Door ;SoftICE后门指令 │ │ ├─int 68 ;int68子类型 │ │ ├─ICECream ;ICECream子类型 │ │ ├─NticeService ;判断NTICE服务是否运行 │ │ ├─int1 ;INT 1 检测 │ │ ├─UnhandledExceptionFilter ;利用UnhandledExceptionFilter检测 │ │ └─int41 ;INT 41子类型 │ ├─DetectBreakpoint ;5.2 断点检测技术 │ │ ├─SEHbpx ;利用SEH防范BPX断点 │ │ ├─SEHbpm ;利用SEH防范BPM断点 │ │ └─IsBPX ;检测函数首地址 │ ├─Anti-Loader ;5.3 反加载技术 │ │ ├─TEB ;利用TEB检测 │ │ ├─IsDebuggerPresent ;利用IsDebuggerPresent函数检测 │ │ └─CheckParentProc ;检查父进程 │ ├─Anti-Monitor ;5.4 反监视技术 │ │ ├─AntiProcDump ;窗口方法检测ProcDump │ │ └─Anti-Filemon&Regmon ;句柄检测Filemon和Regmon │ ├─Anti-Disassemble ;5.5 反静态分析技术 │ │ ├─pushre ;扰乱汇编代码 │ │ ├─SMC ;SMC技术实现 │ │ └─花指令 ;花指令样例 │ ├─CRC ;5.7 文件完整性校验 │ │ ├─磁盘文件校验 │ │ │ ├─add2crc32 ;计算文件CRC32的工具,可以将结果写进文件里 │ │ │ └─crc32 ;待校验的程序 │ │ ├─内存映像校验 │ │ │ ├─memcrc32 │ │ │ │ └─src │ │ │ │ ├─add2memcrc32 ;计算PE文件代码区块CRC32的工具,可以将结果写进文件里 │ │ │ │ └─memcrc32 ;需要校验内存代码数据的程序 │ │ │ └─Detect Breakpoint ;校验内存中的片段代码的样例 │ │ └─CRC原理 ;arbin翻译的《CRC原理及其逆向分析方法》 │ └─codeEncrypt ;5.8 代码与数据结合技术 │ ├─codeEncrypt ;代码与数据结合的实例 │ └─tools ;Encrypter.exe工具及其源码 │ ├─Chap06....................................第6章 加壳软件编写 │ ├─prot ;本章实例加壳工具prot v0.46及其源码 │ ├─aPLib引擎 ;aPLib压缩引擎 │ └─TestUseVC ;Spring的加壳程序综合运用的实例 │ ├─Chap07....................................第7章 如何让壳与程序融为一体 │ ├─7.1 欺骗检查壳的工具 │ │ ├─aspack212压缩 │ │ ├─aspack212压缩后更改入口代码 │ │ ├─aspack压缩后再修改过的壳加壳 │ │ ├─aspack压缩后再自己加壳 │ │ ├─实例(没加壳) │ │ ├─自己加的壳 │ │ ├─自己的加壳工具 │ │ │ ├─原版壳的程序 │ │ │ └─更改后的壳的程序程序 │ │ └─tools │ │ ├─fi ;测试用的FileInfo工具 │ │ └─aspack212 ;测试用的Aspack加壳工具 │ ├─7.2判断自己是否给脱壳 │ │ ├─7.2.1 判断文件尺寸 │ │ ├─7.2.4 使用存储映像文件检查标记 │ │ ├─7.2.2 使用同步对象检查标记 │ │ ├─7.2.3 使用原子(ATOM)检查标记 │ │ ├─7.2.5 使用线程优先权检查标记 │ │ ├─7.2.6 使用外部文件检查标记 │ │ └─7.2.8 注入一个定时器 │ └─7.3 使用SDK把程序和壳溶为一体 │ ├─test ;实例 │ └─sdk壳的程序 │ ├─chap08....................................第8章 Visual Basic 6 逆向工程 │ ├─example1 ;演示虚函数表的概念 │ ├─example2 ;如何处理事件的虚函数表 │ ├─example3 ;利用SEH反加载 │ ├─example4 ;演示如何更改程序结构 │ ├─example5 ;本例简单说明了如何直接修改vb6程序的控件属性值 │ ├─example6 ;一个VB6 P-code Crackme分析实例 │ └─example7 ;VB“自锁”功能实现的实例 │ ├─附录A.....................................附录A 在Visual C++中使用内联汇编 │ ├─InlineASM ;内联汇编实例 │ └─SeparateASM ;VC 中调用 MASM 独立汇编实例 │ └─附录B.....................................附录B 在Visual Basic中使用汇编 ├─TweakVB ;TweakVB 控件(http://www.tweakvb.com/) ├─VBInlineAsm ;VBInlineAsm控件 └─Compile Controller ;Compile Controller控件 ;(http://www.fawcette.com/archives/premier/mgznarch/vbpj/1999/11nov99/jc1199/jc1199.asp)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值