请来看看,小弟我从exe文件中读取了一段字节,小弟我知道它是IMAGE_NT_HEADERS结构,就用BinaryFormatter()反序列化,结果出错
请来看看,我从exe文件中读取了一段字节,我知道它是IMAGE_NT_HEADERS结构,就用BinaryFormatter()反序列化,结果出错,
我从一个exe文件里读取一段字节数组arryBtye, 它是个IMAGE_NT_HEADERS32结构,
开始我只是简单直接的用下标访问值arryBtye[0] arryBtye[1]....
后来我感觉这样访问很麻烦 很容易出错,
于就是通过 PInvoke平台调用导进了IMAGE_NT_HEADERS32结构
并且想通过 BinaryFormatter()把它直接刻成IMAGE_NT_HEADERS32结构
的数据,这样就可以容易访问了,结果下面那个注释的个地方报:
An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dllAdditional information: 输入流是无效的二进制格式。开始内容(以字节为单位)是: 50-45-00-00-4C-01-04-00-01-52-CF-53-00-00-00-00-00...
public static IMAGE_NT_HEADERS32
Deserialize<T>(byte[] byteArray)
{
IFormatter formatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
ms.Write(byteArray, 0, byteArray.Length);
ms.Position = 0;
//下面这句出错,它
IMAGE_NT_HEADERS32 o = (IMAGE_NT_HEADERS32)formatter.Deserialize(ms);
return o;
}
我确定自己扣出来的字节数组就是完整无误的IMAGE_NT_HEADERS32,但是转不过来呀我去...请问怎么办
------解决方案--------------------
不可以的,因为 C# 的 序列化是有格式头的。
不是纯粹的 二进制。
使用 Marshal。
------解决方案--------------------
封装和转换可以参考这个
http://www.cr173.com/html/11930_1.html
至于那个结构体最终翻译是
我从一个exe文件里读取一段字节数组arryBtye, 它是个IMAGE_NT_HEADERS32结构,
开始我只是简单直接的用下标访问值arryBtye[0] arryBtye[1]....
后来我感觉这样访问很麻烦 很容易出错,
于就是通过 PInvoke平台调用导进了IMAGE_NT_HEADERS32结构
并且想通过 BinaryFormatter()把它直接刻成IMAGE_NT_HEADERS32结构
的数据,这样就可以容易访问了,结果下面那个注释的个地方报:
An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dllAdditional information: 输入流是无效的二进制格式。开始内容(以字节为单位)是: 50-45-00-00-4C-01-04-00-01-52-CF-53-00-00-00-00-00...
public static IMAGE_NT_HEADERS32
Deserialize<T>(byte[] byteArray)
{
IFormatter formatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
ms.Write(byteArray, 0, byteArray.Length);
ms.Position = 0;
//下面这句出错,它
IMAGE_NT_HEADERS32 o = (IMAGE_NT_HEADERS32)formatter.Deserialize(ms);
return o;
}
我确定自己扣出来的字节数组就是完整无误的IMAGE_NT_HEADERS32,但是转不过来呀我去...请问怎么办
------解决方案--------------------
不可以的,因为 C# 的 序列化是有格式头的。
不是纯粹的 二进制。
使用 Marshal。
------解决方案--------------------
封装和转换可以参考这个
http://www.cr173.com/html/11930_1.html
至于那个结构体最终翻译是
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct IMAGE_NT_HEADERS32 {
/// DWORD->unsigned int
public uint Signature;
/// IMAGE_FILE_HEADER->_IMAGE_FILE_HEADER
public IMAGE_FILE_HEADER FileHeader;
/// IMAGE_OPTIONAL_HEADER->IMAGE_OPTIONAL_HEADER32->_IMAGE_OPTIONAL_HEADER
public IMAGE_OPTIONAL_HEADER32 OptionalHeader;
}
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct IMAGE_FILE_HEADER {
/// WORD->unsigned short
public ushort Machine;
/// WORD->unsigned short
public ushort NumberOfSections;
/// DWORD->unsigned int
public uint TimeDateStamp;
/// DWORD->unsigned int
public uint PointerToSymbolTable;
/// DWORD->unsigned int
public uint NumberOfSymbols;
/// WORD->unsigned short
public ushort SizeOfOptionalHeader;
/// WORD->unsigned short
public ushort Characteristics;
}
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct IMAGE_OPTIONAL_HEADER32 {
/// WORD->unsigned short
public ushort Magic;
/// BYTE->unsigned char
public byte MajorLinkerVersion;
/// BYTE->unsigned char
public byte MinorLinkerVersion;
/// DWORD->unsigned int
public uint SizeOfCode;
/// DWORD->unsigned int
public uint SizeOfInitializedData;
/// DWORD->unsigned int
public uint SizeOfUninitializedData;
/// DWORD->unsigned int
public uint AddressOfEntryPoint;
/// DWORD->unsigned int
public uint BaseOfCode;
/// DWORD->unsigned int
public uint BaseOfData;
/// DWORD->unsigned int