很明显,NT headers被修改过,于是去down了一个CFF Explorer来,将NumberOfRvaAndSizes的值由原来的0000000F改成了00000010,然后再用reFlector打开,发现又提示:contains zero or multiple module definitions.
表中有多个目录,去网上搜了一下相关资料,看到这篇文章:http://hi.baidu.com/dreamzgj/blog/item/5cd5f1456fedc388b2b7dc8a.html,于是打算照他的方法去做,
但是问题又出现了,我执行:Stream->Tables->Module这个操作的时候,一点那个tables,CFF 就出问题了,点其它的没事,而且用CFF打开这个dll的时候,那个tables是灰色的文件夹,也就是说,它是不可用的,请问哪位大侠有办法解决些问题,先谢谢了,有兴趣者,可以加我QQ:568437613,我发dll文件过来。
31 个解决方案
#1
不懂,帮顶!
#2
-____-!!!
#3
哈哈,我笑了,我也在搞人家的东西,还待解决呢
#4
试图反编译腾讯部分DLL
#5
可能是要对某种语言用某种反编才可以吧
#7
这dll文件是asp.net网站bin目录下面的。
这个程序是买的别人的,但是买的时候,对方没有提供cs文件,但是我需要对它的功能进行扩充,或者说是二开发,不把那个反编译出来,不好搞啊。
这个程序是买的别人的,但是买的时候,对方没有提供cs文件,但是我需要对它的功能进行扩充,或者说是二开发,不把那个反编译出来,不好搞啊。
#8
dll被加密过?
#9
肯定混淆啦
#10
还能反编译?
#12
俺提一个检查点把,这个可能是大家忽视的,为了方便大家我用c#的结构体描述
数据目录总共16项。
/// </summary>
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Sequential, Size = 128)]
public struct DataDirectories
{
public ImageDataDirectory ExportTable;
public ImageDataDirectory ImportTable;
public ImageDataDirectory ResourceTable;
public ImageDataDirectory ExceptionTable;
public ImageDataDirectory CertificateTable;
public ImageDataDirectory BaseRelocationTable;
public ImageDataDirectory DebugTable;
public ImageDataDirectory ArchitectureTable;
public ImageDataDirectory GlobalPtrTable;
public ImageDataDirectory TLSTable;
public ImageDataDirectory LoadConfigTable;
public ImageDataDirectory BoundImport;
public ImageDataDirectory IAT;
public ImageDataDirectory DelayImportDescriptorTable;
public ImageDataDirectory CLRRuntimeHeader;
public ImageDataDirectory other; ;注意检查这一项,它必须为0,你可以使用一些工具检查下文件中的值是否为0,如果不为0,请修改为0
}
数据目录总共16项。
/// </summary>
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Sequential, Size = 128)]
public struct DataDirectories
{
public ImageDataDirectory ExportTable;
public ImageDataDirectory ImportTable;
public ImageDataDirectory ResourceTable;
public ImageDataDirectory ExceptionTable;
public ImageDataDirectory CertificateTable;
public ImageDataDirectory BaseRelocationTable;
public ImageDataDirectory DebugTable;
public ImageDataDirectory ArchitectureTable;
public ImageDataDirectory GlobalPtrTable;
public ImageDataDirectory TLSTable;
public ImageDataDirectory LoadConfigTable;
public ImageDataDirectory BoundImport;
public ImageDataDirectory IAT;
public ImageDataDirectory DelayImportDescriptorTable;
public ImageDataDirectory CLRRuntimeHeader;
public ImageDataDirectory other; ;注意检查这一项,它必须为0,你可以使用一些工具检查下文件中的值是否为0,如果不为0,请修改为0
}
#13
帮顶~
#14
UP~~
#15
12楼的朋友,请问你说的那个用什么工具可以检测出来?
楼上的朋友说代码被混淆了,混没混淆我不知道,但是我估计要先脱壳才行,因为被混淆了,至少能看到里面的混淆过的代码。但是现在什么都看不到。
哪位有什么好的办法,麻烦告诉一下,谢谢了。
楼上的朋友说代码被混淆了,混没混淆我不知道,但是我估计要先脱壳才行,因为被混淆了,至少能看到里面的混淆过的代码。但是现在什么都看不到。
哪位有什么好的办法,麻烦告诉一下,谢谢了。
#16
脱壳的问题需要楼主自己看dll是加的何种壳,使用peid就可以检查,根据楼主所提的问题,我判断楼主对脱壳,crack的工作并不熟悉,因此常用壳直接使用脱壳机进行脱壳把(有些虚拟机加的壳,俺现在都在头疼),
这里由于自己知识有限,和涉及篇幅过广,不好多说,具体去看雪论坛查查 www.pediy.com
对于楼主说的问题,UE,16进制编辑就可以解决,前提是你必须对pe结构比较熟悉(这也是破解的基础)。如果你熟悉了,不需要工具也行了,具体了参考微软的pe文档,这里给个汉化版本的链接
http://www.pediy.com/document/PE/pecoff_v8.rar
你可以用.net来写,刚好我封装了点头文件,也贴出来把
//代表winnt的pe文件中节表的个数
static public class WinntConstants
{
public const byte IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;
public const byte IMAGE_SIZEOF_SHORT_NAME = 8;
//用来测试导入表,导入查找表中最高位是否为1(为1代表按序号导入)
public const uint IMAGE_ORDINAL_FLAG32 = 0x80000000;
//内存相对偏移地址转文件偏移地址,返回值
unsafe static public uint RvaToOffset(DosHeardStructure* lpDosHead, uint rva)
{
uint ret = 0;
ImageNtHeaders32* lpImageNtHeader = (ImageNtHeaders32*)((uint)lpDosHead + (*lpDosHead).e_lfanew);
//此处申明一个节表头仅用来获取尺寸,防止后续工作中产生多余的内存浪费
ImageNtHeaders32 imageNt = new ImageNtHeaders32();
ImageSectionHeader ish = new ImageSectionHeader();
ImageSectionHeader* lpImageSectionHeader = (ImageSectionHeader*)((uint)lpImageNtHeader +
Marshal.SizeOf(imageNt));
for (int i = 0; i < (*lpImageNtHeader).FileHeader.NumberOfSections; i++)
{
if ((rva >= (*lpImageSectionHeader).VirtualAddress) &&
(rva < ((*lpImageSectionHeader).VirtualAddress +
(*lpImageSectionHeader).SizeOfRawData)))
{
//数据相对于节的起始地址的偏移地址RVA
uint sectionOffset = rva - (*lpImageSectionHeader).VirtualAddress;
ret = (*lpImageSectionHeader).PointerToRawData + sectionOffset;
break;
}
lpImageSectionHeader =
(ImageSectionHeader*)((uint)lpImageSectionHeader + Marshal.SizeOf(ish));
}
return ret;
}
//ImageFileHeader中Machine的含义
public enum MachineEnum:ushort
{
IMAGE_FILE_MACHINE_UNKNOWN = 0x0, //适用于任何类型处理器
IMAGE_FILE_MACHINE_AM33 = 0x1d3, //Matsushita AM33处理器
IMAGE_FILE_MACHINE_AMD64 = 0x8664, //x64处理器
IMAGE_FILE_MACHINE_ARM = 0x1c0, //ARM小尾处理器
IMAGE_FILE_MACHINE_EBC = 0xebc, //EFI字节码处理器
IMAGE_FILE_MACHINE_I386 = 0x14c, //Intel 386或后继处理器及其兼容处理器
IMAGE_FILE_MACHINE_IA64 = 0x200, //Intel Itanium处理器家族
IMAGE_FILE_MACHINE_M32R = 0x9041, //Mitsubishi M32R小尾处理器
IMAGE_FILE_MACHINE_MIPS16 = 0x266, //MIPS16处理器
IMAGE_FILE_MACHINE_MIPSFPU = 0x366, //带FPU的MIPS处理器
IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466, //带FPU的MIPS16处理器
IMAGE_FILE_MACHINE_POWERPC = 0x1f0, //PowerPC小尾处理器
IMAGE_FILE_MACHINE_POWERPCFP = 0x1f1, //带浮点运算支持的PowerPC处理器
IMAGE_FILE_MACHINE_R4000 = 0x166, //MIPS 小尾处理器
IMAGE_FILE_MACHINE_SH3 = 0x1a2, //Hitachi SH3处理器
IMAGE_FILE_MACHINE_SH3DSP = 0x1a3, //Hitachi SH3 DSP处理器
IMAGE_FILE_MACHINE_SH4 = 0x1a6, //Hitachi SH4处理器
IMAGE_FILE_MACHINE_SH5 = 0x1a8, //Hitachi SH5处理器
IMAGE_FILE_MACHINE_THUMB = 0x1c2, //Thumb处理器
IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169, //MIPS小尾WCE v2处理器
}
public enum SubSystemEnum : ushort
{
IMAGE_SUBSYSTEM_UNKNOWN = 0, //未知子系统
IMAGE_SUBSYSTEM_NATIVE = 1, //设备驱动程序和Native Windows进程
IMAGE_SUBSYSTEM_WINDOWS_GUI = 2, //Windows图形用户界面(GUI)子系统
IMAGE_SUBSYSTEM_WINDOWS_CUI = 3, //Windows字符模式(CUI)子系统
IMAGE_SUBSYSTEM_POSIX_CUI = 7, //Posix字符模式子系统
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9, //Windows CE
IMAGE_SUBSYSTEM_EFI_APPLICATION = 10, //可扩展固件接口(EFI)应用程序
IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11, // 带引导服务的EFI驱动程序
IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12, //带运行时服务的EFI驱动程序
IMAGE_SUBSYSTEM_EFI_ROM = 13, //EFI ROM映像
IMAGE_SUBSYSTEM_XBOX =14, //XBOX
}
//dos头结构
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit)]
public struct DosHeardStructure
{
[System.Runtime.InteropServices.FieldOffset(0)]
public ushort e_magic;
[System.Runtime.InteropServices.FieldOffset(2)]
public ushort e_cblp;
[System.Runtime.InteropServices.FieldOffset(4)]
public ushort e_cp;
[System.Runtime.InteropServices.FieldOffset(6)]
public ushort e_crlc;
[System.Runtime.InteropServices.FieldOffset(8)]
public ushort e_cparhdr;
[System.Runtime.InteropServices.FieldOffset(10)]
public ushort e_minalloc;
[System.Runtime.InteropServices.FieldOffset(12)]
public ushort e_maxalloc;
[System.Runtime.InteropServices.FieldOffset(14)]
public ushort e_ss;
[System.Runtime.InteropServices.FieldOffset(16)]
public ushort e_sp;
[System.Runtime.InteropServices.FieldOffset(18)]
public ushort e_csum;
[System.Runtime.InteropServices.FieldOffset(20)]
public ushort e_ip;
[System.Runtime.InteropServices.FieldOffset(22)]
public ushort e_cs;
[System.Runtime.InteropServices.FieldOffset(24)]
public ushort e_lfarlc;
[System.Runtime.InteropServices.FieldOffset(26)]
public ushort e_ovno;
[System.Runtime.InteropServices.FieldOffset(28)]
unsafe public fixed ushort e_res[4];
[System.Runtime.InteropServices.FieldOffset(36)]
public ushort e_oemid;
[System.Runtime.InteropServices.FieldOffset(38)]
public ushort e_oeminfo;
[System.Runtime.InteropServices.FieldOffset(40)]
unsafe public fixed ushort e_res2[10];
[System.Runtime.InteropServices.FieldOffset(60)]
public uint e_lfanew;
}
这里由于自己知识有限,和涉及篇幅过广,不好多说,具体去看雪论坛查查 www.pediy.com
对于楼主说的问题,UE,16进制编辑就可以解决,前提是你必须对pe结构比较熟悉(这也是破解的基础)。如果你熟悉了,不需要工具也行了,具体了参考微软的pe文档,这里给个汉化版本的链接
http://www.pediy.com/document/PE/pecoff_v8.rar
你可以用.net来写,刚好我封装了点头文件,也贴出来把
//代表winnt的pe文件中节表的个数
static public class WinntConstants
{
public const byte IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;
public const byte IMAGE_SIZEOF_SHORT_NAME = 8;
//用来测试导入表,导入查找表中最高位是否为1(为1代表按序号导入)
public const uint IMAGE_ORDINAL_FLAG32 = 0x80000000;
//内存相对偏移地址转文件偏移地址,返回值
unsafe static public uint RvaToOffset(DosHeardStructure* lpDosHead, uint rva)
{
uint ret = 0;
ImageNtHeaders32* lpImageNtHeader = (ImageNtHeaders32*)((uint)lpDosHead + (*lpDosHead).e_lfanew);
//此处申明一个节表头仅用来获取尺寸,防止后续工作中产生多余的内存浪费
ImageNtHeaders32 imageNt = new ImageNtHeaders32();
ImageSectionHeader ish = new ImageSectionHeader();
ImageSectionHeader* lpImageSectionHeader = (ImageSectionHeader*)((uint)lpImageNtHeader +
Marshal.SizeOf(imageNt));
for (int i = 0; i < (*lpImageNtHeader).FileHeader.NumberOfSections; i++)
{
if ((rva >= (*lpImageSectionHeader).VirtualAddress) &&
(rva < ((*lpImageSectionHeader).VirtualAddress +
(*lpImageSectionHeader).SizeOfRawData)))
{
//数据相对于节的起始地址的偏移地址RVA
uint sectionOffset = rva - (*lpImageSectionHeader).VirtualAddress;
ret = (*lpImageSectionHeader).PointerToRawData + sectionOffset;
break;
}
lpImageSectionHeader =
(ImageSectionHeader*)((uint)lpImageSectionHeader + Marshal.SizeOf(ish));
}
return ret;
}
//ImageFileHeader中Machine的含义
public enum MachineEnum:ushort
{
IMAGE_FILE_MACHINE_UNKNOWN = 0x0, //适用于任何类型处理器
IMAGE_FILE_MACHINE_AM33 = 0x1d3, //Matsushita AM33处理器
IMAGE_FILE_MACHINE_AMD64 = 0x8664, //x64处理器
IMAGE_FILE_MACHINE_ARM = 0x1c0, //ARM小尾处理器
IMAGE_FILE_MACHINE_EBC = 0xebc, //EFI字节码处理器
IMAGE_FILE_MACHINE_I386 = 0x14c, //Intel 386或后继处理器及其兼容处理器
IMAGE_FILE_MACHINE_IA64 = 0x200, //Intel Itanium处理器家族
IMAGE_FILE_MACHINE_M32R = 0x9041, //Mitsubishi M32R小尾处理器
IMAGE_FILE_MACHINE_MIPS16 = 0x266, //MIPS16处理器
IMAGE_FILE_MACHINE_MIPSFPU = 0x366, //带FPU的MIPS处理器
IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466, //带FPU的MIPS16处理器
IMAGE_FILE_MACHINE_POWERPC = 0x1f0, //PowerPC小尾处理器
IMAGE_FILE_MACHINE_POWERPCFP = 0x1f1, //带浮点运算支持的PowerPC处理器
IMAGE_FILE_MACHINE_R4000 = 0x166, //MIPS 小尾处理器
IMAGE_FILE_MACHINE_SH3 = 0x1a2, //Hitachi SH3处理器
IMAGE_FILE_MACHINE_SH3DSP = 0x1a3, //Hitachi SH3 DSP处理器
IMAGE_FILE_MACHINE_SH4 = 0x1a6, //Hitachi SH4处理器
IMAGE_FILE_MACHINE_SH5 = 0x1a8, //Hitachi SH5处理器
IMAGE_FILE_MACHINE_THUMB = 0x1c2, //Thumb处理器
IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169, //MIPS小尾WCE v2处理器
}
public enum SubSystemEnum : ushort
{
IMAGE_SUBSYSTEM_UNKNOWN = 0, //未知子系统
IMAGE_SUBSYSTEM_NATIVE = 1, //设备驱动程序和Native Windows进程
IMAGE_SUBSYSTEM_WINDOWS_GUI = 2, //Windows图形用户界面(GUI)子系统
IMAGE_SUBSYSTEM_WINDOWS_CUI = 3, //Windows字符模式(CUI)子系统
IMAGE_SUBSYSTEM_POSIX_CUI = 7, //Posix字符模式子系统
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9, //Windows CE
IMAGE_SUBSYSTEM_EFI_APPLICATION = 10, //可扩展固件接口(EFI)应用程序
IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11, // 带引导服务的EFI驱动程序
IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12, //带运行时服务的EFI驱动程序
IMAGE_SUBSYSTEM_EFI_ROM = 13, //EFI ROM映像
IMAGE_SUBSYSTEM_XBOX =14, //XBOX
}
//dos头结构
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit)]
public struct DosHeardStructure
{
[System.Runtime.InteropServices.FieldOffset(0)]
public ushort e_magic;
[System.Runtime.InteropServices.FieldOffset(2)]
public ushort e_cblp;
[System.Runtime.InteropServices.FieldOffset(4)]
public ushort e_cp;
[System.Runtime.InteropServices.FieldOffset(6)]
public ushort e_crlc;
[System.Runtime.InteropServices.FieldOffset(8)]
public ushort e_cparhdr;
[System.Runtime.InteropServices.FieldOffset(10)]
public ushort e_minalloc;
[System.Runtime.InteropServices.FieldOffset(12)]
public ushort e_maxalloc;
[System.Runtime.InteropServices.FieldOffset(14)]
public ushort e_ss;
[System.Runtime.InteropServices.FieldOffset(16)]
public ushort e_sp;
[System.Runtime.InteropServices.FieldOffset(18)]
public ushort e_csum;
[System.Runtime.InteropServices.FieldOffset(20)]
public ushort e_ip;
[System.Runtime.InteropServices.FieldOffset(22)]
public ushort e_cs;
[System.Runtime.InteropServices.FieldOffset(24)]
public ushort e_lfarlc;
[System.Runtime.InteropServices.FieldOffset(26)]
public ushort e_ovno;
[System.Runtime.InteropServices.FieldOffset(28)]
unsafe public fixed ushort e_res[4];
[System.Runtime.InteropServices.FieldOffset(36)]
public ushort e_oemid;
[System.Runtime.InteropServices.FieldOffset(38)]
public ushort e_oeminfo;
[System.Runtime.InteropServices.FieldOffset(40)]
unsafe public fixed ushort e_res2[10];
[System.Runtime.InteropServices.FieldOffset(60)]
public uint e_lfanew;
}
#17
//coff格式标准文件头
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit)]
public struct ImageFileHeader
{
/// <summary>
/// 标识目标机器类型的数字。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(0)]
public MachineEnum Machine;
/// <summary>
/// 节的数目。它给出了节表的大小,而节表紧跟着文件头。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(2)]
public Int16 NumberOfSections;
/// <summary>
/// 从UTC时间1970年1月1日00:00起的总秒数(一个C运行时time_t类型的值)的低32位,
/// 它指出文件何时被创建。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(4)]
public uint TimeDateStamp;
/// <summary>
/// COFF符号表的文件偏移。如果不存在COFF符号表,此值为0。
/// 对于映像文件来说,此值应该为0,因为已经不赞成使用COFF调试信息了。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(8)]
public Int32 PointerToSymbolTable;
/// <summary>
/// 符号表中的元素数目。由于字符串表紧跟符号表,
/// 所以可以利用这个值来定位字符串表。对于映像文件来说,此值应该为0,
/// 因为已经不赞成使用COFF调试信息了。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(12)]
public Int32 NumberOfSymbols;
/// <summary>
/// 可选文件头的大小。可执行文件需要可选文件头而目标文件并不需要。
/// 对于目标文件来说,此值应该为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(16)]
public Int16 SizeOfOptionalHeader;
/// <summary>
/// 指示文件属性的标志,每一位都具有含义
/// </summary>
[System.Runtime.InteropServices.FieldOffset(18)]
public Int16 Characteristics;
}
/// <summary>
/// 数据目录
/// </summary>
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit,Size=8)]
public struct ImageDataDirectory
{
/// <summary>
/// 加载进内存时相对于映像基地址的偏移地址RVA
/// </summary>
[System.Runtime.InteropServices.FieldOffset(0)]
public uint VirtualAddress;
/// <summary>
/// 表的大小
/// </summary>
[System.Runtime.InteropServices.FieldOffset(4)]
public uint Size;
}
/// <summary>
/// 由于c#在结构体中数组的限制,因此做编写此类
/// </summary>
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Sequential, Size = 128)]
public struct DataDirectories
{
public ImageDataDirectory ExportTable;
public ImageDataDirectory ImportTable;
public ImageDataDirectory ResourceTable;
public ImageDataDirectory ExceptionTable;
public ImageDataDirectory CertificateTable;
public ImageDataDirectory BaseRelocationTable;
public ImageDataDirectory DebugTable;
public ImageDataDirectory ArchitectureTable;
public ImageDataDirectory GlobalPtrTable;
public ImageDataDirectory TLSTable;
public ImageDataDirectory LoadConfigTable;
public ImageDataDirectory BoundImport;
public ImageDataDirectory IAT;
public ImageDataDirectory DelayImportDescriptorTable;
public ImageDataDirectory CLRRuntimeHeader;
public ImageDataDirectory Other;
}
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit)]
public struct ImageFileHeader
{
/// <summary>
/// 标识目标机器类型的数字。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(0)]
public MachineEnum Machine;
/// <summary>
/// 节的数目。它给出了节表的大小,而节表紧跟着文件头。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(2)]
public Int16 NumberOfSections;
/// <summary>
/// 从UTC时间1970年1月1日00:00起的总秒数(一个C运行时time_t类型的值)的低32位,
/// 它指出文件何时被创建。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(4)]
public uint TimeDateStamp;
/// <summary>
/// COFF符号表的文件偏移。如果不存在COFF符号表,此值为0。
/// 对于映像文件来说,此值应该为0,因为已经不赞成使用COFF调试信息了。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(8)]
public Int32 PointerToSymbolTable;
/// <summary>
/// 符号表中的元素数目。由于字符串表紧跟符号表,
/// 所以可以利用这个值来定位字符串表。对于映像文件来说,此值应该为0,
/// 因为已经不赞成使用COFF调试信息了。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(12)]
public Int32 NumberOfSymbols;
/// <summary>
/// 可选文件头的大小。可执行文件需要可选文件头而目标文件并不需要。
/// 对于目标文件来说,此值应该为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(16)]
public Int16 SizeOfOptionalHeader;
/// <summary>
/// 指示文件属性的标志,每一位都具有含义
/// </summary>
[System.Runtime.InteropServices.FieldOffset(18)]
public Int16 Characteristics;
}
/// <summary>
/// 数据目录
/// </summary>
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit,Size=8)]
public struct ImageDataDirectory
{
/// <summary>
/// 加载进内存时相对于映像基地址的偏移地址RVA
/// </summary>
[System.Runtime.InteropServices.FieldOffset(0)]
public uint VirtualAddress;
/// <summary>
/// 表的大小
/// </summary>
[System.Runtime.InteropServices.FieldOffset(4)]
public uint Size;
}
/// <summary>
/// 由于c#在结构体中数组的限制,因此做编写此类
/// </summary>
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Sequential, Size = 128)]
public struct DataDirectories
{
public ImageDataDirectory ExportTable;
public ImageDataDirectory ImportTable;
public ImageDataDirectory ResourceTable;
public ImageDataDirectory ExceptionTable;
public ImageDataDirectory CertificateTable;
public ImageDataDirectory BaseRelocationTable;
public ImageDataDirectory DebugTable;
public ImageDataDirectory ArchitectureTable;
public ImageDataDirectory GlobalPtrTable;
public ImageDataDirectory TLSTable;
public ImageDataDirectory LoadConfigTable;
public ImageDataDirectory BoundImport;
public ImageDataDirectory IAT;
public ImageDataDirectory DelayImportDescriptorTable;
public ImageDataDirectory CLRRuntimeHeader;
public ImageDataDirectory Other;
}
#18
//可选文件头结构IMAGE_OPTIONAL_HEADER32 ,普通pe32结构
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit)]
public struct ImageOptionalHeader32
{
/// <summary>
/// PE状态签名这个无符号整数指出了映像文件的状态。
/// 最常用的数字是0x10B,它表明这是一个正常的可执行文件。
/// 0x107表明这是一个ROM映像,0x20B表明这是一个PE32+可执行文件。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(0)]
public ushort Magic;
/// <summary>
/// //链接器的主版本号
/// </summary>
[System.Runtime.InteropServices.FieldOffset(2)]
public byte MajorLinkerVersion;
/// <summary>
/// 链接器的次版本号
/// </summary>
[System.Runtime.InteropServices.FieldOffset(3)]
public byte MinorLinkerVersion;
/// <summary>
/// 代码节(.text)的大小。如果有多个代码节的话,它是所有代码节的和。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(4)]
public uint SizeOfCode;
/// <summary>
/// 已初始化数据节的大小。如果有多个这样的数据节的话,它是所有这些数据节的和。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(8)]
public uint SizeOfInitializedData;
/// <summary>
/// 未初始化数据节(.bss)的大小。如果有多个.bss节的话,它是所有这些节的和。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(12)]
public uint SizeOfUninitializedData;
/// <summary>
/// 当可执行文件被加载进内存时其入口点相对于映像基址的偏移地址。
/// 对于一般程序映像来说,它就是启动地址。
/// 对于设备驱动程序来说,它是初始化函数的地址。
/// 入口点对于DLL来说是可选的。如果不存在入口点的话,这个域必须为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(16)]
public uint AddressOfEntryPoint;
/// <summary>
/// 当映像被加载进内存时代码节的开头相对于映像基址的偏移地址。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(20)]
public uint BaseOfCode;
/// <summary>
/// 当映像被加载进内存时数据节的开头相对于映像基址的偏移地址,它并不存在于PE32+中
/// </summary>
[System.Runtime.InteropServices.FieldOffset(24)]
public uint BaseOfData;
/// <summary>
/// 当加载进内存时映像的第一个字节的首选地址。它必须是64K的倍数。
/// DLL默认是0x10000000。Windows CE EXE默认是0x00010000。
/// Windows NT、Windows 2000、Windows XP、 Windows 95、Windows 98
/// 和 Windows Me 默认是0x00400000
/// </summary>
[System.Runtime.InteropServices.FieldOffset(28)]
public uint ImageBase;
/// <summary>
/// 当加载进内存时节的对齐值(以字节计)。
/// 它必须大于或等于FileAlignment。默认是相应系统的页面大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(32)]
public uint SectionAlignment;
/// <summary>
/// 用来对齐映像文件的节中的原始数据的对齐因子(以字节计)。
/// 它应该是界于512和64K之间的2的幂(包括这两个边界值)。
/// 默认是512。如果SectionAlignment小于相应系统的页面大小,
/// 那么FileAlignment必须与SectionAlignment匹配。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(36)]
public uint FileAlignment;
/// <summary>
/// 所需操作系统的主版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(40)]
public ushort MajorOperatingSystemVersion;
/// <summary>
/// 所需操作系统的次版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(42)]
public ushort MinorOperatingSystemVersion;
/// <summary>
/// 映像的主版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(44)]
public ushort MajorImageVersion;
/// <summary>
/// 映像的次版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(46)]
public ushort MinorImageVersion;
/// <summary>
/// 子系统的主版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(48)]
public ushort MajorSubsystemVersion;
/// <summary>
/// 子系统的次版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(50)]
public ushort MinorSubsystemVersion;
/// <summary>
/// 保留,必须为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(52)]
public uint Win32VersionValue;
/// <summary>
/// 当映像被加载进内存时的大小(以字节计),包括所有的文件头。
/// 它必须是SectionAlignment的倍数。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(56)]
public uint SizeOfImage;
/// <summary>
/// MS-DOS占位程序、PE文件头和节头的总大小,向上舍入为FileAlignment的倍数。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(60)]
public uint SizeOfHeaders;
/// <summary>
/// 映像文件的校验和。计算校验和的算法被合并到了IMAGEHLP.DLL 中。
/// 以下程序在加载时被校验以确定其是否合法:
/// 所有的驱动程序、任何在引导时被加载的DLL以及加载进关键Windows进程中的DLL。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(64)]
public uint CheckSum;
/// <summary>
/// 运行此映像所需的子系统。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(68)]
public SubSystemEnum Subsystem;
/// <summary>
/// DLL特征,不同位具有各自含义
/// </summary>
[System.Runtime.InteropServices.FieldOffset(70)]
public ushort DllCharacteristics;
/// <summary>
/// 保留的堆栈大小。只有SizeOfStackCommit指定的部分被提交;
/// 其余的每次可用一页,直到到达保留的大小为止。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(72)]
public uint SizeOfStackReserve;
/// <summary>
/// 提交的堆栈大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(76)]
public uint SizeOfStackCommit;
/// <summary>
/// 保留的局部堆空间大小。只有SizeOfHeapCommit指定的部分被提交;
/// 其余的每次可用一页,直到到达保留的大小为止。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(80)]
public uint SizeOfHeapReserve;
/// <summary>
/// 提交的局部堆空间大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(84)]
public uint SizeOfHeapCommit;
/// <summary>
/// 保留,必须为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(88)]
public uint LoaderFlags;
/// <summary>
/// 可选文件头其余部分中数据目录项的个数。每个数据目录描述了一个表的位置和大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(92)]
public uint NumberOfRvaAndSizes;
/// <summary>
/// 数据目录
/// </summary>
[System.Runtime.InteropServices.FieldOffset(96)]
public DataDirectories DataDirectory;
}
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit)]
public struct ImageOptionalHeader32
{
/// <summary>
/// PE状态签名这个无符号整数指出了映像文件的状态。
/// 最常用的数字是0x10B,它表明这是一个正常的可执行文件。
/// 0x107表明这是一个ROM映像,0x20B表明这是一个PE32+可执行文件。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(0)]
public ushort Magic;
/// <summary>
/// //链接器的主版本号
/// </summary>
[System.Runtime.InteropServices.FieldOffset(2)]
public byte MajorLinkerVersion;
/// <summary>
/// 链接器的次版本号
/// </summary>
[System.Runtime.InteropServices.FieldOffset(3)]
public byte MinorLinkerVersion;
/// <summary>
/// 代码节(.text)的大小。如果有多个代码节的话,它是所有代码节的和。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(4)]
public uint SizeOfCode;
/// <summary>
/// 已初始化数据节的大小。如果有多个这样的数据节的话,它是所有这些数据节的和。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(8)]
public uint SizeOfInitializedData;
/// <summary>
/// 未初始化数据节(.bss)的大小。如果有多个.bss节的话,它是所有这些节的和。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(12)]
public uint SizeOfUninitializedData;
/// <summary>
/// 当可执行文件被加载进内存时其入口点相对于映像基址的偏移地址。
/// 对于一般程序映像来说,它就是启动地址。
/// 对于设备驱动程序来说,它是初始化函数的地址。
/// 入口点对于DLL来说是可选的。如果不存在入口点的话,这个域必须为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(16)]
public uint AddressOfEntryPoint;
/// <summary>
/// 当映像被加载进内存时代码节的开头相对于映像基址的偏移地址。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(20)]
public uint BaseOfCode;
/// <summary>
/// 当映像被加载进内存时数据节的开头相对于映像基址的偏移地址,它并不存在于PE32+中
/// </summary>
[System.Runtime.InteropServices.FieldOffset(24)]
public uint BaseOfData;
/// <summary>
/// 当加载进内存时映像的第一个字节的首选地址。它必须是64K的倍数。
/// DLL默认是0x10000000。Windows CE EXE默认是0x00010000。
/// Windows NT、Windows 2000、Windows XP、 Windows 95、Windows 98
/// 和 Windows Me 默认是0x00400000
/// </summary>
[System.Runtime.InteropServices.FieldOffset(28)]
public uint ImageBase;
/// <summary>
/// 当加载进内存时节的对齐值(以字节计)。
/// 它必须大于或等于FileAlignment。默认是相应系统的页面大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(32)]
public uint SectionAlignment;
/// <summary>
/// 用来对齐映像文件的节中的原始数据的对齐因子(以字节计)。
/// 它应该是界于512和64K之间的2的幂(包括这两个边界值)。
/// 默认是512。如果SectionAlignment小于相应系统的页面大小,
/// 那么FileAlignment必须与SectionAlignment匹配。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(36)]
public uint FileAlignment;
/// <summary>
/// 所需操作系统的主版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(40)]
public ushort MajorOperatingSystemVersion;
/// <summary>
/// 所需操作系统的次版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(42)]
public ushort MinorOperatingSystemVersion;
/// <summary>
/// 映像的主版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(44)]
public ushort MajorImageVersion;
/// <summary>
/// 映像的次版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(46)]
public ushort MinorImageVersion;
/// <summary>
/// 子系统的主版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(48)]
public ushort MajorSubsystemVersion;
/// <summary>
/// 子系统的次版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(50)]
public ushort MinorSubsystemVersion;
/// <summary>
/// 保留,必须为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(52)]
public uint Win32VersionValue;
/// <summary>
/// 当映像被加载进内存时的大小(以字节计),包括所有的文件头。
/// 它必须是SectionAlignment的倍数。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(56)]
public uint SizeOfImage;
/// <summary>
/// MS-DOS占位程序、PE文件头和节头的总大小,向上舍入为FileAlignment的倍数。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(60)]
public uint SizeOfHeaders;
/// <summary>
/// 映像文件的校验和。计算校验和的算法被合并到了IMAGEHLP.DLL 中。
/// 以下程序在加载时被校验以确定其是否合法:
/// 所有的驱动程序、任何在引导时被加载的DLL以及加载进关键Windows进程中的DLL。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(64)]
public uint CheckSum;
/// <summary>
/// 运行此映像所需的子系统。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(68)]
public SubSystemEnum Subsystem;
/// <summary>
/// DLL特征,不同位具有各自含义
/// </summary>
[System.Runtime.InteropServices.FieldOffset(70)]
public ushort DllCharacteristics;
/// <summary>
/// 保留的堆栈大小。只有SizeOfStackCommit指定的部分被提交;
/// 其余的每次可用一页,直到到达保留的大小为止。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(72)]
public uint SizeOfStackReserve;
/// <summary>
/// 提交的堆栈大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(76)]
public uint SizeOfStackCommit;
/// <summary>
/// 保留的局部堆空间大小。只有SizeOfHeapCommit指定的部分被提交;
/// 其余的每次可用一页,直到到达保留的大小为止。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(80)]
public uint SizeOfHeapReserve;
/// <summary>
/// 提交的局部堆空间大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(84)]
public uint SizeOfHeapCommit;
/// <summary>
/// 保留,必须为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(88)]
public uint LoaderFlags;
/// <summary>
/// 可选文件头其余部分中数据目录项的个数。每个数据目录描述了一个表的位置和大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(92)]
public uint NumberOfRvaAndSizes;
/// <summary>
/// 数据目录
/// </summary>
[System.Runtime.InteropServices.FieldOffset(96)]
public DataDirectories DataDirectory;
}
#19
Reflector 是太出名了,当然很多软件商想办法反它,但是可以不用这个工具的,你试试 ILDASM 是否能读,况且能看到IL码的话,你可以反编译出来修改的。如果不能,你就要脱壳了。
my blog
http://ufo-crackerx.blog.163.com/
my blog
http://ufo-crackerx.blog.163.com/
#20
万幸的是,现在某些虚拟机加壳工具对msil支持并不好,也就是说,常见的都是些基本壳
#21
zhu_jiang,你写的那些代码,我不知道怎么用,留着以后再看了,呵呵,谢谢。
我的确对汇编啊,脱壳之类的不了解,因为一直是做网站的,加壳解壳那些好少接触到,最近准备恶补,看雪学院,老早就听说过了,不过那是四五年前了,那时候基础太差,进了一次后,就没有再进了,今天又重新注册了账号,发现里面好多不错的东西,等明天之后我就可以下了。
crackdung,用 ILDASM 能读,请问这时候要用什么工具来反编译呢?ILASM么?
我的确对汇编啊,脱壳之类的不了解,因为一直是做网站的,加壳解壳那些好少接触到,最近准备恶补,看雪学院,老早就听说过了,不过那是四五年前了,那时候基础太差,进了一次后,就没有再进了,今天又重新注册了账号,发现里面好多不错的东西,等明天之后我就可以下了。
crackdung,用 ILDASM 能读,请问这时候要用什么工具来反编译呢?ILASM么?
#23
crackdung,我主要是想进行二次开发,但是这个程序是发布版本的,我要在上面进行扩展,所以我想取得它的cs文件,但是因为是发布版的,dll还都被处理过了,没法操作,所以才想把这个文件给破解了。不知道你有什么建议或者方案给我没。
#24
肯定是加密过的。
基本很困难。
不要考虑了。
基本很困难。
不要考虑了。
#26
尽可能的还原cs代码吧,比如我要改动某个页面,我先改了aspx文件,并且这个时候还要改它的cs代码,如果不能还原,那我怎么做才能在不影响程序运行的情况下,对程序进行扩展呢?
#27
要做大量工作的话,我建议你不要考虑了。如果你想改图标这类的东西,可以考虑。
如果你懂得IL码的,你可以直接用ILDASM转存,然后直接在IL文件修改它,我也经常这样做,只是我改动的地方不多,我只是达到破解的目的。
现在不知道你DLL加密的强度,不好说的。
my blog
http://ufo-crackerx.blog.163.com/
如果你懂得IL码的,你可以直接用ILDASM转存,然后直接在IL文件修改它,我也经常这样做,只是我改动的地方不多,我只是达到破解的目的。
现在不知道你DLL加密的强度,不好说的。
my blog
http://ufo-crackerx.blog.163.com/
#28
我想尽量试试,就算破解不成,也明白很多东西了,实在不行,买的这套程序就当过渡用了,先让它上线,然后组织人手来重新开发一个一样的。
crackdung,你方便的话,加一下我的QQ,我发一个dll给你,你帮我看看,看看能不能看出它是如何加密的,能不能解密,好么?QQ:229495352
crackdung,你方便的话,加一下我的QQ,我发一个dll给你,你帮我看看,看看能不能看出它是如何加密的,能不能解密,好么?QQ:229495352
#29
楼主您的这个问题解决了吗?我现在刚好在开发的时候也碰到了和您一样的问题!!!请问如何解决的???
#30
我也正在学习反编汇,进来受教了。
#31
我也是碰到同样的问题,如何解决
#1
不懂,帮顶!
#2
-____-!!!
#3
哈哈,我笑了,我也在搞人家的东西,还待解决呢
#4
试图反编译腾讯部分DLL
#5
可能是要对某种语言用某种反编才可以吧
#6
#7
这dll文件是asp.net网站bin目录下面的。
这个程序是买的别人的,但是买的时候,对方没有提供cs文件,但是我需要对它的功能进行扩充,或者说是二开发,不把那个反编译出来,不好搞啊。
这个程序是买的别人的,但是买的时候,对方没有提供cs文件,但是我需要对它的功能进行扩充,或者说是二开发,不把那个反编译出来,不好搞啊。
#8
dll被加密过?
#9
肯定混淆啦
#10
还能反编译?
#11
看这个 希望有所帮助
通过ILDASM反编译和ILASM重编译.NET混淆程序
通过ILDASM反编译和ILASM重编译.NET混淆程序
#12
俺提一个检查点把,这个可能是大家忽视的,为了方便大家我用c#的结构体描述
数据目录总共16项。
/// </summary>
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Sequential, Size = 128)]
public struct DataDirectories
{
public ImageDataDirectory ExportTable;
public ImageDataDirectory ImportTable;
public ImageDataDirectory ResourceTable;
public ImageDataDirectory ExceptionTable;
public ImageDataDirectory CertificateTable;
public ImageDataDirectory BaseRelocationTable;
public ImageDataDirectory DebugTable;
public ImageDataDirectory ArchitectureTable;
public ImageDataDirectory GlobalPtrTable;
public ImageDataDirectory TLSTable;
public ImageDataDirectory LoadConfigTable;
public ImageDataDirectory BoundImport;
public ImageDataDirectory IAT;
public ImageDataDirectory DelayImportDescriptorTable;
public ImageDataDirectory CLRRuntimeHeader;
public ImageDataDirectory other; ;注意检查这一项,它必须为0,你可以使用一些工具检查下文件中的值是否为0,如果不为0,请修改为0
}
数据目录总共16项。
/// </summary>
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Sequential, Size = 128)]
public struct DataDirectories
{
public ImageDataDirectory ExportTable;
public ImageDataDirectory ImportTable;
public ImageDataDirectory ResourceTable;
public ImageDataDirectory ExceptionTable;
public ImageDataDirectory CertificateTable;
public ImageDataDirectory BaseRelocationTable;
public ImageDataDirectory DebugTable;
public ImageDataDirectory ArchitectureTable;
public ImageDataDirectory GlobalPtrTable;
public ImageDataDirectory TLSTable;
public ImageDataDirectory LoadConfigTable;
public ImageDataDirectory BoundImport;
public ImageDataDirectory IAT;
public ImageDataDirectory DelayImportDescriptorTable;
public ImageDataDirectory CLRRuntimeHeader;
public ImageDataDirectory other; ;注意检查这一项,它必须为0,你可以使用一些工具检查下文件中的值是否为0,如果不为0,请修改为0
}
#13
帮顶~
#14
UP~~
#15
12楼的朋友,请问你说的那个用什么工具可以检测出来?
楼上的朋友说代码被混淆了,混没混淆我不知道,但是我估计要先脱壳才行,因为被混淆了,至少能看到里面的混淆过的代码。但是现在什么都看不到。
哪位有什么好的办法,麻烦告诉一下,谢谢了。
楼上的朋友说代码被混淆了,混没混淆我不知道,但是我估计要先脱壳才行,因为被混淆了,至少能看到里面的混淆过的代码。但是现在什么都看不到。
哪位有什么好的办法,麻烦告诉一下,谢谢了。
#16
脱壳的问题需要楼主自己看dll是加的何种壳,使用peid就可以检查,根据楼主所提的问题,我判断楼主对脱壳,crack的工作并不熟悉,因此常用壳直接使用脱壳机进行脱壳把(有些虚拟机加的壳,俺现在都在头疼),
这里由于自己知识有限,和涉及篇幅过广,不好多说,具体去看雪论坛查查 www.pediy.com
对于楼主说的问题,UE,16进制编辑就可以解决,前提是你必须对pe结构比较熟悉(这也是破解的基础)。如果你熟悉了,不需要工具也行了,具体了参考微软的pe文档,这里给个汉化版本的链接
http://www.pediy.com/document/PE/pecoff_v8.rar
你可以用.net来写,刚好我封装了点头文件,也贴出来把
//代表winnt的pe文件中节表的个数
static public class WinntConstants
{
public const byte IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;
public const byte IMAGE_SIZEOF_SHORT_NAME = 8;
//用来测试导入表,导入查找表中最高位是否为1(为1代表按序号导入)
public const uint IMAGE_ORDINAL_FLAG32 = 0x80000000;
//内存相对偏移地址转文件偏移地址,返回值
unsafe static public uint RvaToOffset(DosHeardStructure* lpDosHead, uint rva)
{
uint ret = 0;
ImageNtHeaders32* lpImageNtHeader = (ImageNtHeaders32*)((uint)lpDosHead + (*lpDosHead).e_lfanew);
//此处申明一个节表头仅用来获取尺寸,防止后续工作中产生多余的内存浪费
ImageNtHeaders32 imageNt = new ImageNtHeaders32();
ImageSectionHeader ish = new ImageSectionHeader();
ImageSectionHeader* lpImageSectionHeader = (ImageSectionHeader*)((uint)lpImageNtHeader +
Marshal.SizeOf(imageNt));
for (int i = 0; i < (*lpImageNtHeader).FileHeader.NumberOfSections; i++)
{
if ((rva >= (*lpImageSectionHeader).VirtualAddress) &&
(rva < ((*lpImageSectionHeader).VirtualAddress +
(*lpImageSectionHeader).SizeOfRawData)))
{
//数据相对于节的起始地址的偏移地址RVA
uint sectionOffset = rva - (*lpImageSectionHeader).VirtualAddress;
ret = (*lpImageSectionHeader).PointerToRawData + sectionOffset;
break;
}
lpImageSectionHeader =
(ImageSectionHeader*)((uint)lpImageSectionHeader + Marshal.SizeOf(ish));
}
return ret;
}
//ImageFileHeader中Machine的含义
public enum MachineEnum:ushort
{
IMAGE_FILE_MACHINE_UNKNOWN = 0x0, //适用于任何类型处理器
IMAGE_FILE_MACHINE_AM33 = 0x1d3, //Matsushita AM33处理器
IMAGE_FILE_MACHINE_AMD64 = 0x8664, //x64处理器
IMAGE_FILE_MACHINE_ARM = 0x1c0, //ARM小尾处理器
IMAGE_FILE_MACHINE_EBC = 0xebc, //EFI字节码处理器
IMAGE_FILE_MACHINE_I386 = 0x14c, //Intel 386或后继处理器及其兼容处理器
IMAGE_FILE_MACHINE_IA64 = 0x200, //Intel Itanium处理器家族
IMAGE_FILE_MACHINE_M32R = 0x9041, //Mitsubishi M32R小尾处理器
IMAGE_FILE_MACHINE_MIPS16 = 0x266, //MIPS16处理器
IMAGE_FILE_MACHINE_MIPSFPU = 0x366, //带FPU的MIPS处理器
IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466, //带FPU的MIPS16处理器
IMAGE_FILE_MACHINE_POWERPC = 0x1f0, //PowerPC小尾处理器
IMAGE_FILE_MACHINE_POWERPCFP = 0x1f1, //带浮点运算支持的PowerPC处理器
IMAGE_FILE_MACHINE_R4000 = 0x166, //MIPS 小尾处理器
IMAGE_FILE_MACHINE_SH3 = 0x1a2, //Hitachi SH3处理器
IMAGE_FILE_MACHINE_SH3DSP = 0x1a3, //Hitachi SH3 DSP处理器
IMAGE_FILE_MACHINE_SH4 = 0x1a6, //Hitachi SH4处理器
IMAGE_FILE_MACHINE_SH5 = 0x1a8, //Hitachi SH5处理器
IMAGE_FILE_MACHINE_THUMB = 0x1c2, //Thumb处理器
IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169, //MIPS小尾WCE v2处理器
}
public enum SubSystemEnum : ushort
{
IMAGE_SUBSYSTEM_UNKNOWN = 0, //未知子系统
IMAGE_SUBSYSTEM_NATIVE = 1, //设备驱动程序和Native Windows进程
IMAGE_SUBSYSTEM_WINDOWS_GUI = 2, //Windows图形用户界面(GUI)子系统
IMAGE_SUBSYSTEM_WINDOWS_CUI = 3, //Windows字符模式(CUI)子系统
IMAGE_SUBSYSTEM_POSIX_CUI = 7, //Posix字符模式子系统
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9, //Windows CE
IMAGE_SUBSYSTEM_EFI_APPLICATION = 10, //可扩展固件接口(EFI)应用程序
IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11, // 带引导服务的EFI驱动程序
IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12, //带运行时服务的EFI驱动程序
IMAGE_SUBSYSTEM_EFI_ROM = 13, //EFI ROM映像
IMAGE_SUBSYSTEM_XBOX =14, //XBOX
}
//dos头结构
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit)]
public struct DosHeardStructure
{
[System.Runtime.InteropServices.FieldOffset(0)]
public ushort e_magic;
[System.Runtime.InteropServices.FieldOffset(2)]
public ushort e_cblp;
[System.Runtime.InteropServices.FieldOffset(4)]
public ushort e_cp;
[System.Runtime.InteropServices.FieldOffset(6)]
public ushort e_crlc;
[System.Runtime.InteropServices.FieldOffset(8)]
public ushort e_cparhdr;
[System.Runtime.InteropServices.FieldOffset(10)]
public ushort e_minalloc;
[System.Runtime.InteropServices.FieldOffset(12)]
public ushort e_maxalloc;
[System.Runtime.InteropServices.FieldOffset(14)]
public ushort e_ss;
[System.Runtime.InteropServices.FieldOffset(16)]
public ushort e_sp;
[System.Runtime.InteropServices.FieldOffset(18)]
public ushort e_csum;
[System.Runtime.InteropServices.FieldOffset(20)]
public ushort e_ip;
[System.Runtime.InteropServices.FieldOffset(22)]
public ushort e_cs;
[System.Runtime.InteropServices.FieldOffset(24)]
public ushort e_lfarlc;
[System.Runtime.InteropServices.FieldOffset(26)]
public ushort e_ovno;
[System.Runtime.InteropServices.FieldOffset(28)]
unsafe public fixed ushort e_res[4];
[System.Runtime.InteropServices.FieldOffset(36)]
public ushort e_oemid;
[System.Runtime.InteropServices.FieldOffset(38)]
public ushort e_oeminfo;
[System.Runtime.InteropServices.FieldOffset(40)]
unsafe public fixed ushort e_res2[10];
[System.Runtime.InteropServices.FieldOffset(60)]
public uint e_lfanew;
}
这里由于自己知识有限,和涉及篇幅过广,不好多说,具体去看雪论坛查查 www.pediy.com
对于楼主说的问题,UE,16进制编辑就可以解决,前提是你必须对pe结构比较熟悉(这也是破解的基础)。如果你熟悉了,不需要工具也行了,具体了参考微软的pe文档,这里给个汉化版本的链接
http://www.pediy.com/document/PE/pecoff_v8.rar
你可以用.net来写,刚好我封装了点头文件,也贴出来把
//代表winnt的pe文件中节表的个数
static public class WinntConstants
{
public const byte IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;
public const byte IMAGE_SIZEOF_SHORT_NAME = 8;
//用来测试导入表,导入查找表中最高位是否为1(为1代表按序号导入)
public const uint IMAGE_ORDINAL_FLAG32 = 0x80000000;
//内存相对偏移地址转文件偏移地址,返回值
unsafe static public uint RvaToOffset(DosHeardStructure* lpDosHead, uint rva)
{
uint ret = 0;
ImageNtHeaders32* lpImageNtHeader = (ImageNtHeaders32*)((uint)lpDosHead + (*lpDosHead).e_lfanew);
//此处申明一个节表头仅用来获取尺寸,防止后续工作中产生多余的内存浪费
ImageNtHeaders32 imageNt = new ImageNtHeaders32();
ImageSectionHeader ish = new ImageSectionHeader();
ImageSectionHeader* lpImageSectionHeader = (ImageSectionHeader*)((uint)lpImageNtHeader +
Marshal.SizeOf(imageNt));
for (int i = 0; i < (*lpImageNtHeader).FileHeader.NumberOfSections; i++)
{
if ((rva >= (*lpImageSectionHeader).VirtualAddress) &&
(rva < ((*lpImageSectionHeader).VirtualAddress +
(*lpImageSectionHeader).SizeOfRawData)))
{
//数据相对于节的起始地址的偏移地址RVA
uint sectionOffset = rva - (*lpImageSectionHeader).VirtualAddress;
ret = (*lpImageSectionHeader).PointerToRawData + sectionOffset;
break;
}
lpImageSectionHeader =
(ImageSectionHeader*)((uint)lpImageSectionHeader + Marshal.SizeOf(ish));
}
return ret;
}
//ImageFileHeader中Machine的含义
public enum MachineEnum:ushort
{
IMAGE_FILE_MACHINE_UNKNOWN = 0x0, //适用于任何类型处理器
IMAGE_FILE_MACHINE_AM33 = 0x1d3, //Matsushita AM33处理器
IMAGE_FILE_MACHINE_AMD64 = 0x8664, //x64处理器
IMAGE_FILE_MACHINE_ARM = 0x1c0, //ARM小尾处理器
IMAGE_FILE_MACHINE_EBC = 0xebc, //EFI字节码处理器
IMAGE_FILE_MACHINE_I386 = 0x14c, //Intel 386或后继处理器及其兼容处理器
IMAGE_FILE_MACHINE_IA64 = 0x200, //Intel Itanium处理器家族
IMAGE_FILE_MACHINE_M32R = 0x9041, //Mitsubishi M32R小尾处理器
IMAGE_FILE_MACHINE_MIPS16 = 0x266, //MIPS16处理器
IMAGE_FILE_MACHINE_MIPSFPU = 0x366, //带FPU的MIPS处理器
IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466, //带FPU的MIPS16处理器
IMAGE_FILE_MACHINE_POWERPC = 0x1f0, //PowerPC小尾处理器
IMAGE_FILE_MACHINE_POWERPCFP = 0x1f1, //带浮点运算支持的PowerPC处理器
IMAGE_FILE_MACHINE_R4000 = 0x166, //MIPS 小尾处理器
IMAGE_FILE_MACHINE_SH3 = 0x1a2, //Hitachi SH3处理器
IMAGE_FILE_MACHINE_SH3DSP = 0x1a3, //Hitachi SH3 DSP处理器
IMAGE_FILE_MACHINE_SH4 = 0x1a6, //Hitachi SH4处理器
IMAGE_FILE_MACHINE_SH5 = 0x1a8, //Hitachi SH5处理器
IMAGE_FILE_MACHINE_THUMB = 0x1c2, //Thumb处理器
IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169, //MIPS小尾WCE v2处理器
}
public enum SubSystemEnum : ushort
{
IMAGE_SUBSYSTEM_UNKNOWN = 0, //未知子系统
IMAGE_SUBSYSTEM_NATIVE = 1, //设备驱动程序和Native Windows进程
IMAGE_SUBSYSTEM_WINDOWS_GUI = 2, //Windows图形用户界面(GUI)子系统
IMAGE_SUBSYSTEM_WINDOWS_CUI = 3, //Windows字符模式(CUI)子系统
IMAGE_SUBSYSTEM_POSIX_CUI = 7, //Posix字符模式子系统
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9, //Windows CE
IMAGE_SUBSYSTEM_EFI_APPLICATION = 10, //可扩展固件接口(EFI)应用程序
IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11, // 带引导服务的EFI驱动程序
IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12, //带运行时服务的EFI驱动程序
IMAGE_SUBSYSTEM_EFI_ROM = 13, //EFI ROM映像
IMAGE_SUBSYSTEM_XBOX =14, //XBOX
}
//dos头结构
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit)]
public struct DosHeardStructure
{
[System.Runtime.InteropServices.FieldOffset(0)]
public ushort e_magic;
[System.Runtime.InteropServices.FieldOffset(2)]
public ushort e_cblp;
[System.Runtime.InteropServices.FieldOffset(4)]
public ushort e_cp;
[System.Runtime.InteropServices.FieldOffset(6)]
public ushort e_crlc;
[System.Runtime.InteropServices.FieldOffset(8)]
public ushort e_cparhdr;
[System.Runtime.InteropServices.FieldOffset(10)]
public ushort e_minalloc;
[System.Runtime.InteropServices.FieldOffset(12)]
public ushort e_maxalloc;
[System.Runtime.InteropServices.FieldOffset(14)]
public ushort e_ss;
[System.Runtime.InteropServices.FieldOffset(16)]
public ushort e_sp;
[System.Runtime.InteropServices.FieldOffset(18)]
public ushort e_csum;
[System.Runtime.InteropServices.FieldOffset(20)]
public ushort e_ip;
[System.Runtime.InteropServices.FieldOffset(22)]
public ushort e_cs;
[System.Runtime.InteropServices.FieldOffset(24)]
public ushort e_lfarlc;
[System.Runtime.InteropServices.FieldOffset(26)]
public ushort e_ovno;
[System.Runtime.InteropServices.FieldOffset(28)]
unsafe public fixed ushort e_res[4];
[System.Runtime.InteropServices.FieldOffset(36)]
public ushort e_oemid;
[System.Runtime.InteropServices.FieldOffset(38)]
public ushort e_oeminfo;
[System.Runtime.InteropServices.FieldOffset(40)]
unsafe public fixed ushort e_res2[10];
[System.Runtime.InteropServices.FieldOffset(60)]
public uint e_lfanew;
}
#17
//coff格式标准文件头
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit)]
public struct ImageFileHeader
{
/// <summary>
/// 标识目标机器类型的数字。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(0)]
public MachineEnum Machine;
/// <summary>
/// 节的数目。它给出了节表的大小,而节表紧跟着文件头。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(2)]
public Int16 NumberOfSections;
/// <summary>
/// 从UTC时间1970年1月1日00:00起的总秒数(一个C运行时time_t类型的值)的低32位,
/// 它指出文件何时被创建。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(4)]
public uint TimeDateStamp;
/// <summary>
/// COFF符号表的文件偏移。如果不存在COFF符号表,此值为0。
/// 对于映像文件来说,此值应该为0,因为已经不赞成使用COFF调试信息了。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(8)]
public Int32 PointerToSymbolTable;
/// <summary>
/// 符号表中的元素数目。由于字符串表紧跟符号表,
/// 所以可以利用这个值来定位字符串表。对于映像文件来说,此值应该为0,
/// 因为已经不赞成使用COFF调试信息了。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(12)]
public Int32 NumberOfSymbols;
/// <summary>
/// 可选文件头的大小。可执行文件需要可选文件头而目标文件并不需要。
/// 对于目标文件来说,此值应该为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(16)]
public Int16 SizeOfOptionalHeader;
/// <summary>
/// 指示文件属性的标志,每一位都具有含义
/// </summary>
[System.Runtime.InteropServices.FieldOffset(18)]
public Int16 Characteristics;
}
/// <summary>
/// 数据目录
/// </summary>
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit,Size=8)]
public struct ImageDataDirectory
{
/// <summary>
/// 加载进内存时相对于映像基地址的偏移地址RVA
/// </summary>
[System.Runtime.InteropServices.FieldOffset(0)]
public uint VirtualAddress;
/// <summary>
/// 表的大小
/// </summary>
[System.Runtime.InteropServices.FieldOffset(4)]
public uint Size;
}
/// <summary>
/// 由于c#在结构体中数组的限制,因此做编写此类
/// </summary>
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Sequential, Size = 128)]
public struct DataDirectories
{
public ImageDataDirectory ExportTable;
public ImageDataDirectory ImportTable;
public ImageDataDirectory ResourceTable;
public ImageDataDirectory ExceptionTable;
public ImageDataDirectory CertificateTable;
public ImageDataDirectory BaseRelocationTable;
public ImageDataDirectory DebugTable;
public ImageDataDirectory ArchitectureTable;
public ImageDataDirectory GlobalPtrTable;
public ImageDataDirectory TLSTable;
public ImageDataDirectory LoadConfigTable;
public ImageDataDirectory BoundImport;
public ImageDataDirectory IAT;
public ImageDataDirectory DelayImportDescriptorTable;
public ImageDataDirectory CLRRuntimeHeader;
public ImageDataDirectory Other;
}
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit)]
public struct ImageFileHeader
{
/// <summary>
/// 标识目标机器类型的数字。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(0)]
public MachineEnum Machine;
/// <summary>
/// 节的数目。它给出了节表的大小,而节表紧跟着文件头。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(2)]
public Int16 NumberOfSections;
/// <summary>
/// 从UTC时间1970年1月1日00:00起的总秒数(一个C运行时time_t类型的值)的低32位,
/// 它指出文件何时被创建。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(4)]
public uint TimeDateStamp;
/// <summary>
/// COFF符号表的文件偏移。如果不存在COFF符号表,此值为0。
/// 对于映像文件来说,此值应该为0,因为已经不赞成使用COFF调试信息了。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(8)]
public Int32 PointerToSymbolTable;
/// <summary>
/// 符号表中的元素数目。由于字符串表紧跟符号表,
/// 所以可以利用这个值来定位字符串表。对于映像文件来说,此值应该为0,
/// 因为已经不赞成使用COFF调试信息了。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(12)]
public Int32 NumberOfSymbols;
/// <summary>
/// 可选文件头的大小。可执行文件需要可选文件头而目标文件并不需要。
/// 对于目标文件来说,此值应该为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(16)]
public Int16 SizeOfOptionalHeader;
/// <summary>
/// 指示文件属性的标志,每一位都具有含义
/// </summary>
[System.Runtime.InteropServices.FieldOffset(18)]
public Int16 Characteristics;
}
/// <summary>
/// 数据目录
/// </summary>
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit,Size=8)]
public struct ImageDataDirectory
{
/// <summary>
/// 加载进内存时相对于映像基地址的偏移地址RVA
/// </summary>
[System.Runtime.InteropServices.FieldOffset(0)]
public uint VirtualAddress;
/// <summary>
/// 表的大小
/// </summary>
[System.Runtime.InteropServices.FieldOffset(4)]
public uint Size;
}
/// <summary>
/// 由于c#在结构体中数组的限制,因此做编写此类
/// </summary>
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Sequential, Size = 128)]
public struct DataDirectories
{
public ImageDataDirectory ExportTable;
public ImageDataDirectory ImportTable;
public ImageDataDirectory ResourceTable;
public ImageDataDirectory ExceptionTable;
public ImageDataDirectory CertificateTable;
public ImageDataDirectory BaseRelocationTable;
public ImageDataDirectory DebugTable;
public ImageDataDirectory ArchitectureTable;
public ImageDataDirectory GlobalPtrTable;
public ImageDataDirectory TLSTable;
public ImageDataDirectory LoadConfigTable;
public ImageDataDirectory BoundImport;
public ImageDataDirectory IAT;
public ImageDataDirectory DelayImportDescriptorTable;
public ImageDataDirectory CLRRuntimeHeader;
public ImageDataDirectory Other;
}
#18
//可选文件头结构IMAGE_OPTIONAL_HEADER32 ,普通pe32结构
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit)]
public struct ImageOptionalHeader32
{
/// <summary>
/// PE状态签名这个无符号整数指出了映像文件的状态。
/// 最常用的数字是0x10B,它表明这是一个正常的可执行文件。
/// 0x107表明这是一个ROM映像,0x20B表明这是一个PE32+可执行文件。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(0)]
public ushort Magic;
/// <summary>
/// //链接器的主版本号
/// </summary>
[System.Runtime.InteropServices.FieldOffset(2)]
public byte MajorLinkerVersion;
/// <summary>
/// 链接器的次版本号
/// </summary>
[System.Runtime.InteropServices.FieldOffset(3)]
public byte MinorLinkerVersion;
/// <summary>
/// 代码节(.text)的大小。如果有多个代码节的话,它是所有代码节的和。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(4)]
public uint SizeOfCode;
/// <summary>
/// 已初始化数据节的大小。如果有多个这样的数据节的话,它是所有这些数据节的和。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(8)]
public uint SizeOfInitializedData;
/// <summary>
/// 未初始化数据节(.bss)的大小。如果有多个.bss节的话,它是所有这些节的和。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(12)]
public uint SizeOfUninitializedData;
/// <summary>
/// 当可执行文件被加载进内存时其入口点相对于映像基址的偏移地址。
/// 对于一般程序映像来说,它就是启动地址。
/// 对于设备驱动程序来说,它是初始化函数的地址。
/// 入口点对于DLL来说是可选的。如果不存在入口点的话,这个域必须为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(16)]
public uint AddressOfEntryPoint;
/// <summary>
/// 当映像被加载进内存时代码节的开头相对于映像基址的偏移地址。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(20)]
public uint BaseOfCode;
/// <summary>
/// 当映像被加载进内存时数据节的开头相对于映像基址的偏移地址,它并不存在于PE32+中
/// </summary>
[System.Runtime.InteropServices.FieldOffset(24)]
public uint BaseOfData;
/// <summary>
/// 当加载进内存时映像的第一个字节的首选地址。它必须是64K的倍数。
/// DLL默认是0x10000000。Windows CE EXE默认是0x00010000。
/// Windows NT、Windows 2000、Windows XP、 Windows 95、Windows 98
/// 和 Windows Me 默认是0x00400000
/// </summary>
[System.Runtime.InteropServices.FieldOffset(28)]
public uint ImageBase;
/// <summary>
/// 当加载进内存时节的对齐值(以字节计)。
/// 它必须大于或等于FileAlignment。默认是相应系统的页面大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(32)]
public uint SectionAlignment;
/// <summary>
/// 用来对齐映像文件的节中的原始数据的对齐因子(以字节计)。
/// 它应该是界于512和64K之间的2的幂(包括这两个边界值)。
/// 默认是512。如果SectionAlignment小于相应系统的页面大小,
/// 那么FileAlignment必须与SectionAlignment匹配。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(36)]
public uint FileAlignment;
/// <summary>
/// 所需操作系统的主版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(40)]
public ushort MajorOperatingSystemVersion;
/// <summary>
/// 所需操作系统的次版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(42)]
public ushort MinorOperatingSystemVersion;
/// <summary>
/// 映像的主版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(44)]
public ushort MajorImageVersion;
/// <summary>
/// 映像的次版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(46)]
public ushort MinorImageVersion;
/// <summary>
/// 子系统的主版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(48)]
public ushort MajorSubsystemVersion;
/// <summary>
/// 子系统的次版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(50)]
public ushort MinorSubsystemVersion;
/// <summary>
/// 保留,必须为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(52)]
public uint Win32VersionValue;
/// <summary>
/// 当映像被加载进内存时的大小(以字节计),包括所有的文件头。
/// 它必须是SectionAlignment的倍数。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(56)]
public uint SizeOfImage;
/// <summary>
/// MS-DOS占位程序、PE文件头和节头的总大小,向上舍入为FileAlignment的倍数。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(60)]
public uint SizeOfHeaders;
/// <summary>
/// 映像文件的校验和。计算校验和的算法被合并到了IMAGEHLP.DLL 中。
/// 以下程序在加载时被校验以确定其是否合法:
/// 所有的驱动程序、任何在引导时被加载的DLL以及加载进关键Windows进程中的DLL。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(64)]
public uint CheckSum;
/// <summary>
/// 运行此映像所需的子系统。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(68)]
public SubSystemEnum Subsystem;
/// <summary>
/// DLL特征,不同位具有各自含义
/// </summary>
[System.Runtime.InteropServices.FieldOffset(70)]
public ushort DllCharacteristics;
/// <summary>
/// 保留的堆栈大小。只有SizeOfStackCommit指定的部分被提交;
/// 其余的每次可用一页,直到到达保留的大小为止。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(72)]
public uint SizeOfStackReserve;
/// <summary>
/// 提交的堆栈大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(76)]
public uint SizeOfStackCommit;
/// <summary>
/// 保留的局部堆空间大小。只有SizeOfHeapCommit指定的部分被提交;
/// 其余的每次可用一页,直到到达保留的大小为止。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(80)]
public uint SizeOfHeapReserve;
/// <summary>
/// 提交的局部堆空间大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(84)]
public uint SizeOfHeapCommit;
/// <summary>
/// 保留,必须为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(88)]
public uint LoaderFlags;
/// <summary>
/// 可选文件头其余部分中数据目录项的个数。每个数据目录描述了一个表的位置和大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(92)]
public uint NumberOfRvaAndSizes;
/// <summary>
/// 数据目录
/// </summary>
[System.Runtime.InteropServices.FieldOffset(96)]
public DataDirectories DataDirectory;
}
[System.Runtime.InteropServices.StructLayout
(LayoutKind.Explicit)]
public struct ImageOptionalHeader32
{
/// <summary>
/// PE状态签名这个无符号整数指出了映像文件的状态。
/// 最常用的数字是0x10B,它表明这是一个正常的可执行文件。
/// 0x107表明这是一个ROM映像,0x20B表明这是一个PE32+可执行文件。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(0)]
public ushort Magic;
/// <summary>
/// //链接器的主版本号
/// </summary>
[System.Runtime.InteropServices.FieldOffset(2)]
public byte MajorLinkerVersion;
/// <summary>
/// 链接器的次版本号
/// </summary>
[System.Runtime.InteropServices.FieldOffset(3)]
public byte MinorLinkerVersion;
/// <summary>
/// 代码节(.text)的大小。如果有多个代码节的话,它是所有代码节的和。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(4)]
public uint SizeOfCode;
/// <summary>
/// 已初始化数据节的大小。如果有多个这样的数据节的话,它是所有这些数据节的和。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(8)]
public uint SizeOfInitializedData;
/// <summary>
/// 未初始化数据节(.bss)的大小。如果有多个.bss节的话,它是所有这些节的和。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(12)]
public uint SizeOfUninitializedData;
/// <summary>
/// 当可执行文件被加载进内存时其入口点相对于映像基址的偏移地址。
/// 对于一般程序映像来说,它就是启动地址。
/// 对于设备驱动程序来说,它是初始化函数的地址。
/// 入口点对于DLL来说是可选的。如果不存在入口点的话,这个域必须为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(16)]
public uint AddressOfEntryPoint;
/// <summary>
/// 当映像被加载进内存时代码节的开头相对于映像基址的偏移地址。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(20)]
public uint BaseOfCode;
/// <summary>
/// 当映像被加载进内存时数据节的开头相对于映像基址的偏移地址,它并不存在于PE32+中
/// </summary>
[System.Runtime.InteropServices.FieldOffset(24)]
public uint BaseOfData;
/// <summary>
/// 当加载进内存时映像的第一个字节的首选地址。它必须是64K的倍数。
/// DLL默认是0x10000000。Windows CE EXE默认是0x00010000。
/// Windows NT、Windows 2000、Windows XP、 Windows 95、Windows 98
/// 和 Windows Me 默认是0x00400000
/// </summary>
[System.Runtime.InteropServices.FieldOffset(28)]
public uint ImageBase;
/// <summary>
/// 当加载进内存时节的对齐值(以字节计)。
/// 它必须大于或等于FileAlignment。默认是相应系统的页面大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(32)]
public uint SectionAlignment;
/// <summary>
/// 用来对齐映像文件的节中的原始数据的对齐因子(以字节计)。
/// 它应该是界于512和64K之间的2的幂(包括这两个边界值)。
/// 默认是512。如果SectionAlignment小于相应系统的页面大小,
/// 那么FileAlignment必须与SectionAlignment匹配。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(36)]
public uint FileAlignment;
/// <summary>
/// 所需操作系统的主版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(40)]
public ushort MajorOperatingSystemVersion;
/// <summary>
/// 所需操作系统的次版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(42)]
public ushort MinorOperatingSystemVersion;
/// <summary>
/// 映像的主版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(44)]
public ushort MajorImageVersion;
/// <summary>
/// 映像的次版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(46)]
public ushort MinorImageVersion;
/// <summary>
/// 子系统的主版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(48)]
public ushort MajorSubsystemVersion;
/// <summary>
/// 子系统的次版本号。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(50)]
public ushort MinorSubsystemVersion;
/// <summary>
/// 保留,必须为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(52)]
public uint Win32VersionValue;
/// <summary>
/// 当映像被加载进内存时的大小(以字节计),包括所有的文件头。
/// 它必须是SectionAlignment的倍数。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(56)]
public uint SizeOfImage;
/// <summary>
/// MS-DOS占位程序、PE文件头和节头的总大小,向上舍入为FileAlignment的倍数。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(60)]
public uint SizeOfHeaders;
/// <summary>
/// 映像文件的校验和。计算校验和的算法被合并到了IMAGEHLP.DLL 中。
/// 以下程序在加载时被校验以确定其是否合法:
/// 所有的驱动程序、任何在引导时被加载的DLL以及加载进关键Windows进程中的DLL。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(64)]
public uint CheckSum;
/// <summary>
/// 运行此映像所需的子系统。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(68)]
public SubSystemEnum Subsystem;
/// <summary>
/// DLL特征,不同位具有各自含义
/// </summary>
[System.Runtime.InteropServices.FieldOffset(70)]
public ushort DllCharacteristics;
/// <summary>
/// 保留的堆栈大小。只有SizeOfStackCommit指定的部分被提交;
/// 其余的每次可用一页,直到到达保留的大小为止。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(72)]
public uint SizeOfStackReserve;
/// <summary>
/// 提交的堆栈大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(76)]
public uint SizeOfStackCommit;
/// <summary>
/// 保留的局部堆空间大小。只有SizeOfHeapCommit指定的部分被提交;
/// 其余的每次可用一页,直到到达保留的大小为止。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(80)]
public uint SizeOfHeapReserve;
/// <summary>
/// 提交的局部堆空间大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(84)]
public uint SizeOfHeapCommit;
/// <summary>
/// 保留,必须为0。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(88)]
public uint LoaderFlags;
/// <summary>
/// 可选文件头其余部分中数据目录项的个数。每个数据目录描述了一个表的位置和大小。
/// </summary>
[System.Runtime.InteropServices.FieldOffset(92)]
public uint NumberOfRvaAndSizes;
/// <summary>
/// 数据目录
/// </summary>
[System.Runtime.InteropServices.FieldOffset(96)]
public DataDirectories DataDirectory;
}
#19
Reflector 是太出名了,当然很多软件商想办法反它,但是可以不用这个工具的,你试试 ILDASM 是否能读,况且能看到IL码的话,你可以反编译出来修改的。如果不能,你就要脱壳了。
my blog
http://ufo-crackerx.blog.163.com/
my blog
http://ufo-crackerx.blog.163.com/
#20
万幸的是,现在某些虚拟机加壳工具对msil支持并不好,也就是说,常见的都是些基本壳
#21
zhu_jiang,你写的那些代码,我不知道怎么用,留着以后再看了,呵呵,谢谢。
我的确对汇编啊,脱壳之类的不了解,因为一直是做网站的,加壳解壳那些好少接触到,最近准备恶补,看雪学院,老早就听说过了,不过那是四五年前了,那时候基础太差,进了一次后,就没有再进了,今天又重新注册了账号,发现里面好多不错的东西,等明天之后我就可以下了。
crackdung,用 ILDASM 能读,请问这时候要用什么工具来反编译呢?ILASM么?
我的确对汇编啊,脱壳之类的不了解,因为一直是做网站的,加壳解壳那些好少接触到,最近准备恶补,看雪学院,老早就听说过了,不过那是四五年前了,那时候基础太差,进了一次后,就没有再进了,今天又重新注册了账号,发现里面好多不错的东西,等明天之后我就可以下了。
crackdung,用 ILDASM 能读,请问这时候要用什么工具来反编译呢?ILASM么?
#22
#23
crackdung,我主要是想进行二次开发,但是这个程序是发布版本的,我要在上面进行扩展,所以我想取得它的cs文件,但是因为是发布版的,dll还都被处理过了,没法操作,所以才想把这个文件给破解了。不知道你有什么建议或者方案给我没。
#24
肯定是加密过的。
基本很困难。
不要考虑了。
基本很困难。
不要考虑了。
#25
#26
尽可能的还原cs代码吧,比如我要改动某个页面,我先改了aspx文件,并且这个时候还要改它的cs代码,如果不能还原,那我怎么做才能在不影响程序运行的情况下,对程序进行扩展呢?
#27
要做大量工作的话,我建议你不要考虑了。如果你想改图标这类的东西,可以考虑。
如果你懂得IL码的,你可以直接用ILDASM转存,然后直接在IL文件修改它,我也经常这样做,只是我改动的地方不多,我只是达到破解的目的。
现在不知道你DLL加密的强度,不好说的。
my blog
http://ufo-crackerx.blog.163.com/
如果你懂得IL码的,你可以直接用ILDASM转存,然后直接在IL文件修改它,我也经常这样做,只是我改动的地方不多,我只是达到破解的目的。
现在不知道你DLL加密的强度,不好说的。
my blog
http://ufo-crackerx.blog.163.com/
#28
我想尽量试试,就算破解不成,也明白很多东西了,实在不行,买的这套程序就当过渡用了,先让它上线,然后组织人手来重新开发一个一样的。
crackdung,你方便的话,加一下我的QQ,我发一个dll给你,你帮我看看,看看能不能看出它是如何加密的,能不能解密,好么?QQ:229495352
crackdung,你方便的话,加一下我的QQ,我发一个dll给你,你帮我看看,看看能不能看出它是如何加密的,能不能解密,好么?QQ:229495352
#29
楼主您的这个问题解决了吗?我现在刚好在开发的时候也碰到了和您一样的问题!!!请问如何解决的???
#30
我也正在学习反编汇,进来受教了。
#31
我也是碰到同样的问题,如何解决