C#如何去遍历一个由C++或E语言编写的本地DLL导出函数呢 不过在这里我建议对PE一无所知的人
你或许应先补补这方面的知识,我不知道为什么PE方面的 应用在C#中怎么这么少,我查阅过相关
C#的知识大概只见一个人写过关于PE的应用 还只是从PE信息中判断执行文件是X86还是X64方式
编译,难道C#程序员真的很差 真的只能会点Asp.Net / MVC?想想看雪论坛那些玩inline-asm /
inline-hook的牛牛 真是感到有很大差距 不过不论什么语言 在我看来其实都差不多 重点在于人是否
有心。虽然我不敢保证C#可以嵌入动态汇编(auto-asm)但是我可以保证C#可以做inline-hook虽然会
的人比较少,不过也还好,至少C#程序员不会是一群渣渣。不过我在写下述代码时,可是累得紧 写
结构体部分有些麻烦 而且C#与C++有些不同 当然也可以动态偏移地址搞定不过那个有些麻烦了,你
想推敲地址可不是那么好玩的事情,可能你自己推敲半天结果发现你推敲错了,那种方法用在结构体
层次较少的情况下的确可以提升逼格 反正别人看不懂就好嘛? 呵呵。下面的代码需要在X86的环境下
使用主要在于该代码中使用的PE信息全是32位的结构体而非64位的PE信息结构体 所以需要X86环境
不过不论是X86还是X64方法都是相等的,只是两者的结构体与对称不太一样而已。
PE格式,是微软Win32环境可移植执行文件如(exe / sys / dll / vxd / vdm)等都是标准的文件格式
PE格式衍生于VAX / VMS上的COFF文件格式,Portable是指对于不同的Windows版本和不同的
CPU类型上PE文件的格式是一样的,或许CPU不一指令与二进制编码不一,但是文件中各种东
西的布局是一至的。
PE文件中第一个字节是MS-DOS信息头即IMAGE_DOS_HEADER与IMAGE_NT_HEADER中包
含许多PE装载器用到。
[STAThread]
unsafe static void Main()
{
IntPtr hFileBase = Win32Native._lopen(@"C:/Windows/System32/user32.dll", Win32Native.OF_SHARE_COMPAT);
IntPtr hFileMapping = Win32Native.CreateFileMapping(hFileBase, Win32Native.NULL, Win32Native.PAGE_READONLY, 0, 0, null);
IntPtr hMapViewOfFile = Win32Native.MapViewOfFile(hFileMapping, Win32Native.FILE_MAP_READ, 0, 0, Win32Native.NULL);
IMAGE_DOS_HEADER sDosHearder = (IMAGE_DOS_HEADER)Marshal.PtrToStructure(hMapViewOfFile, typeof(IMAGE_DOS_HEADER));
IntPtr pWinNTHeader = (IntPtr)(sDosHearder.e_lfanew + (long)hMapViewOfFile); // e_lfanew 248
IMAGE_NT_HEADERS sWinNTHeader = (IMAGE_NT_HEADERS)Marshal.PtrToStructure(pWinNTHeader, typeof(IMAGE_NT_HEADERS));
// 63 63 72 75 6E 2E 63 6F 6D
IntPtr pExportDirectory = Win32Native.ImageRvaToVa(pWinNTHeader, hMapViewOfFile, sWinNTHeader.OptionalHeader.ExportTable.VirtualAddress, Win32Native.NULL);
IMAGE_EXPORT_DIRECTORY sExportDirectory = (IMAGE_EXPORT_DIRECTORY)Marshal.PtrToStructure(pExportDirectory, typeof(IMAGE_EXPORT_DIRECTORY));
IntPtr ppExportOfNames = Win32Native.ImageRvaToVa(pWinNTHeader, hMapViewOfFile, sExportDirectory.AddressOfNames, Win32Native.NULL);
for (uint i = 0, nNoOfExpo