| shuai 的个人资料娱乐精神照片日志 | 帮助 |
|
2007/11/1 强暴.Net程序集 之七 (强命名的移除)警告:本系列文章为本人原创,只作技术研究之用,您可以引用链接传播,禁止其它的转载方式,禁止用于商业或非法目的, 对于造成的一切后果本人概不负责
先让我们重新看一下IMAGE_COR20_HEADER头的格式:
typedef struct IMAGE_COR20_HEADER { // Header versioning DWORD cb; WORD MajorRuntimeVersion; WORD MinorRuntimeVersion; // Symbol table and startup information IMAGE_DATA_DIRECTORY MetaData; DWORD Flags; DWORD EntryPointToken; // Binding information IMAGE_DATA_DIRECTORY Resources; IMAGE_DATA_DIRECTORY StrongNameSignature; // Regular fixup and binding information
IMAGE_DATA_DIRECTORY CodeManagerTable; IMAGE_DATA_DIRECTORY VTableFixups; IMAGE_DATA_DIRECTORY ExportAddressTableJumps; // Precompiled image info (internal use only - set to zero)
IMAGE_DATA_DIRECTORY ManagedNativeHeader; } IMAGE_COR20_HEADER, *PIMAGE_COR20_HEADER; 移除强名需要修改其中的这两个字段
Flags StrongNameSignature 其中Flags是一个按位或值,我们只需要移去COMIMAGE_FLAGS_STRONGNAMESIGNED
在winnt.h中有其定义: typedef enum ReplacesCorHdrNumericDefines { // COM+ Header entry point flags. COMIMAGE_FLAGS_ILONLY =0x00000001, COMIMAGE_FLAGS_32BITREQUIRED =0x00000002, COMIMAGE_FLAGS_IL_LIBRARY =0x00000004, COMIMAGE_FLAGS_STRONGNAMESIGNED =0x00000008, COMIMAGE_FLAGS_TRACKDEBUGDATA =0x00010000, //略 } 然后将StrongNameSignature和VirtualAddress和Size都置为0 第二步是修改Assembly表
将Flags字段的PublicKey位移去 在Partition II Metadata中有描述: PublicKey 0x0001 SideBySideCompatible 0x0000 <reserved> 0x0030 Retargetable 0x0100 EnableJITcompileTracking 0x8000 DisableJITcompileOptimizer 0x4000 另外修改PublicKey字段,将其置为0
代码为:
pCorHeader->Flags &= ~COMIMAGE_FLAGS_STRONGNAMESIGNED; pCorHeader->StrongNameSignature.VirtualAddress = 0; pCorHeader->StrongNameSignature.Size = 0; PMETA_ASSEMBLY_TABLE assemblyTable = (PMETA_ASSEMBLY_TABLE)(tables[TableType::Assembly].Address);
assemblyTable->Flags &= 0x1110; //PublicKey = 0x0001 assemblyTable->PublicKey = 0; 这样我们就将到了一个没有强名的程序集
在.net的非托管 API中提供了一系列和强名相关的函数: StrongNameCompareAssemblies 仅通过二进制签名确定两个指定的程序集是否不同。 StrongNameErrorInfo 获取由强名称方法引发的上一个错误代码。 StrongNameFreeBuffer 释放上一次调用强名称方法时分配的内存。 StrongNameGetBlob 通过位于指定内存地址的可执行文件的二进制表示形式填充指定的缓冲区。 StrongNameGetBlobFromImage 获取位于指定内存地址的程序集映像的二进制表示形式。 StrongNameGetPublicKey 从私钥/公钥对中检索公钥。 StrongNameHashSize 使用指定的哈希算法获取哈希值所需要的缓冲区大小。 StrongNameKeyDelete 删除具有指定容器名称的公钥-私钥对。 StrongNameKeyGen 创建一个用于强名称的公/私钥对。 StrongNameKeyGenEx 创建具有指定密钥大小的公钥/私钥对,以供强名称使用。 StrongNameKeyInstall 向容器中导入公钥-私钥对。 StrongNameSignatureGeneration 生成指定程序集的强名称签名。 StrongNameSignatureGenerationEx 使用指定的密钥容器名称获取指定程序集的强名称签名。 StrongNameSignatureSize 返回强名称签名的大小。 StrongNameSignatureVerification 获取一个指示所提供的可移植的可执行(.dll 或 .exe)文件的程序集清单是否包含强名称签名的值。 StrongNameSignatureVerificationEx 获取一个指示所提供的可移植的可执行(.dll 或 .exe)文件的程序集清单是否包含强名称签名的值。 StrongNameSignatureVerificationFromImage 验证已映射到内存的程序集对关联的公钥是否有效。 StrongNameTokenFromAssembly 从指定的程序集文件中创建强名称标记。 StrongNameTokenFromAssemblyEx 从指定的程序集文件创建强名称标记,并返回公钥。 StrongNameTokenFromPublicKey 返回表示公钥的标记。 评论 (3)
引用通告此日志的引用通告 URL 是: http://iauhsgnay.spaces.live.com/blog/cns!C7C5DB6D46321CDD!424.trak 引用此项的网络日志
|
|
|