windbg-PE完整分析

1.PE结构常用的结构体

[plain]  view plain  copy
  1. 0:001> dt ntdll!*IMAGE*  
  2.           ntdll!_IMAGE_NT_HEADERS  
  3.           ntdll!_IMAGE_FILE_HEADER  
  4.           ntdll!_IMAGE_OPTIONAL_HEADER  
  5.           ntdll!_IMAGE_DOS_HEADER  
  6.           ntdll!_IMAGE_DATA_DIRECTORY  
仅在exe使用了winnt.h(驱动ntimage.h)才会显示其他结构体,如IID:
[plain]  view plain  copy
  1. 0:001> dt ole32!_IMAGE_IMPORT_DESCRIPTOR  
  2.    +0x000 Characteristics  : Uint4B  
  3.    +0x000 OriginalFirstThunk : Uint4B  
  4.    +0x004 TimeDateStamp    : Uint4B  
  5.    +0x008 ForwarderChain   : Uint4B  
  6.    +0x00c Name             : Uint4B  
  7.    +0x010 FirstThunk       : Uint4B  

2.DOS头

[plain]  view plain  copy
  1. 0:001> lmvm kernel32  
  2. start    end        module name  
  3. 76d00000 76e10000   kernel32   (pdb symbols)          c:\mysymbol\wkernel32.pdb\69083C6D23244DC3BF8B73A9EE01C7742\wkernel32.pdb  
  4.     Loaded symbol image file: C:\Windows\syswow64\kernel32.dll  
  5.     Image path: C:\Windows\syswow64\kernel32.dll  
  6. 0:001> dt ntdll!_IMAGE_DOS_HEADER 76d00000   
  7.    +0x000 e_magic          : 0x5a4d  
  8.    +0x002 e_cblp           : 0x90  
  9.    +0x004 e_cp             : 3  
  10.    +0x006 e_crlc           : 0  
  11.    +0x008 e_cparhdr        : 4  
  12.    +0x00a e_minalloc       : 0  
  13.    +0x00c e_maxalloc       : 0xffff  
  14.    +0x00e e_ss             : 0  
  15.    +0x010 e_sp             : 0xb8  
  16.    +0x012 e_csum           : 0  
  17.    +0x014 e_ip             : 0  
  18.    +0x016 e_cs             : 0  
  19.    +0x018 e_lfarlc         : 0x40  
  20.    +0x01a e_ovno           : 0  
  21.    +0x01c e_res            : [4] 0  
  22.    +0x024 e_oemid          : 0  
  23.    +0x026 e_oeminfo        : 0  
  24.    +0x028 e_res2           : [10] 0  
  25.    +0x03c e_lfanew         : 232   // 指向PE头  

3.PE头

[plain]  view plain  copy
  1. 0:001> dt ntdll!_IMAGE_NT_HEADERS 76d00000+0n232  
  2.    +0x000 Signature        : 0x4550  
  3.    +0x004 FileHeader       : _IMAGE_FILE_HEADER  
  4.    +0x018 OptionalHeader   : _IMAGE_OPTIONAL_HEADER  
  5. 0:001> ? 76d00000+0n232  
  6. Evaluate expression: 1993343208 = 76d000e8    // PE头地址  

4.可选头中找到EXPORT表基地址

[plain]  view plain  copy
  1. 0:001> dt ntdll!_IMAGE_OPTIONAL_HEADER -v -ny DataDirectory 76d000e8+0x018   
  2. struct _IMAGE_OPTIONAL_HEADER, 31 elements, 0xe0 bytes  
  3.    +0x060 DataDirectory : [16] struct _IMAGE_DATA_DIRECTORY, 2 elements, 0x8 bytes  
DataDirectory[0]即为导出表,地址为76d00160
[plain]  view plain  copy
  1. 0:001> ? 76d000e8+0x018+0x060   
  2. Evaluate expression: 1993343328 = 76d00160  

5.找到EXPORT实际地址

[plain]  view plain  copy
  1. 0:001> dt ole32!_IMAGE_DATA_DIRECTORY 76d00160  
  2.    +0x000 VirtualAddress   : 0xc0070  
  3.    +0x004 Size             : 0xa9b1  
  4. 0:001> ? 76d00000+0xc0070   //kernel32基地址+VA  
  5. Evaluate expression: 1994129520 = 76dc0070   
[plain]  view plain  copy
  1. 0:001> dt ole32!IMAGE_EXPORT_DIRECTORY  76dc0070  
  2.    +0x000 Characteristics  : 0  
  3.    +0x004 TimeDateStamp    : 0x5609edc5  
  4.    +0x008 MajorVersion     : 0  
  5.    +0x00a MinorVersion     : 0  
  6.    +0x00c Name             : 0xc35e0  // 模块的真实名称  
  7.    +0x010 Base             : 1        // 基数,加上序数就是函数地址数组的索引  
  8.    +0x014 NumberOfFunctions : 0x554   // 指向的数组元素个数  
  9.    +0x018 NumberOfNames    : 0x554    // 指向的数组元素个数  
  10.    +0x01c AddressOfFunctions : 0xc0098// 指向函数地址数组  
  11.    +0x020 AddressOfNames   : 0xc15e8  // 指向函数名字数组  
  12.    +0x024 AddressOfNameOrdinals : 0xc2b38// 指向输出序号数组  

6.遍历EXPORT

模块名:
[plain]  view plain  copy
  1. 0:001> da 76d00000+0xc35e0  
  2. 76dc35e0  "KERNEL32.dll"  

原理:AddressOfNames和AddressOfNameOrdinals一样多,一个名字肯定只有一个地址(function),但一个地址可能有多个名字(name)

先用loadpe看下kernel32:


函数遍历
[plain]  view plain  copy
  1. 0:001> .foreach(place {dd 76dc0098 L10}){ln ${place}+76d00000}   
  2. (76d13368)   kernel32!BaseThreadInitThunk   |  (76d13386)   kernel32!ConDllInitialize  
  3. Exact matches:  
  4.     kernel32!BaseThreadInitThunk = <no type information>  
  5. (76dc0070)   kernel32!$$VProc_ImageExportDirectory+0xa434   |  (76de0000)   kernel32!BasepAllowResourceConversion  
  6. (76dc0070)   kernel32!$$VProc_ImageExportDirectory+0x9eb5   |  (76de0000)   kernel32!BasepAllowResourceConversion  
  7. (76dc0070)   kernel32!$$VProc_ImageExportDirectory+0x9ed6   |  (76de0000)   kernel32!BasepAllowResourceConversion  
  8. (76d15448)   kernel32!ActivateActCtx   |  (76d15479)   kernel32!ReleaseActCtx  
  9. Exact matches:  
  10.     kernel32!ActivateActCtx = <no type information>  
  11. (76d2ed3e)   kernel32!AddAtomA   |  (76d2edb4)   kernel32!FindAtomA  
  12. Exact matches:  
  13.     kernel32!AddAtomA = <no type information>  
  14. (76d2cdd4)   kernel32!AddAtomW   |  (76d2cdee)   kernel32!DeleteAtom  
  15. Exact matches:  
  16.     kernel32!AddAtomW = <no type information>  
  17. (76db6b86)   kernel32!AddConsoleAliasA   |  (76db6be3)   kernel32!GetConsoleAliasW  
  18. Exact matches:  
  19.     kernel32!AddConsoleAliasA = <no type information>  
  20. (76db6b1c)   kernel32!AddConsoleAliasW   |  (76db6b86)   kernel32!AddConsoleAliasA  
  21. Exact matches:  
  22.     kernel32!AddConsoleAliasW = <no type information>  
  23. (76dc0070)   kernel32!$$VProc_ImageExportDirectory+0x9ef4   |  (76de0000)   kernel32!BasepAllowResourceConversion  
  24. (76d94f72)   kernel32!AddIntegrityLabelToBoundaryDescriptor   |  (76d94f9d)   kernel32!CreatePrivateNamespaceA  
  25. Exact matches:  
  26.     kernel32!AddIntegrityLabelToBoundaryDescriptor = <no type information>  
  27. (76d87538)   kernel32!AddLocalAlternateComputerNameA   |  (76d87581)   kernel32!RemoveLocalAlternateComputerNameW  
  28. Exact matches:  
  29.     kernel32!AddLocalAlternateComputerNameA = <no type information>  
  30. (76d8744d)   kernel32!AddLocalAlternateComputerNameW   |  (76d87538)   kernel32!AddLocalAlternateComputerNameA  
  31. Exact matches:  
  32.     kernel32!AddLocalAlternateComputerNameW = <no type information>  
  33. (76d2d510)   kernel32!AddRefActCtx   |  (76d2d521)   kernel32!GetCurrentActCtx  
  34. Exact matches:  
  35.     kernel32!AddRefActCtx = <no type information>  
  36. (76d3915f)   kernel32!AddSIDToBoundaryDescriptor   |  (76d39257)   kernel32!LocalOpenPerformanceData  
  37. Exact matches:  
  38.     kernel32!AddSIDToBoundaryDescriptor = <no type information>  
  39. (76d8f4c2)   kernel32!AddSecureMemoryCacheCallback   |  (76d8f4ea)   kernel32!RemoveSecureMemoryCacheCallback  
  40. Exact matches:  
  41.     kernel32!AddSecureMemoryCacheCallback = <no type information>  

函数名遍历
[plain]  view plain  copy
  1. 0:001> .foreach(place {dd 76dc15e8}){r @$t0=${place}+76d00000; .if(@$t0<86d00000){da @$t0}}   
  2. 76dc35ed  "AcquireSRWLockExclusive"  
  3. 76dc3605  "AcquireSRWLockShared"  
  4. 76dc361a  "ActivateActCtx"  
  5. 76dc3629  "AddAtomA"  
  6. 76dc3632  "AddAtomW"  
  7. 76dc363b  "AddConsoleAliasA"  
  8. 76dc364c  "AddConsoleAliasW"  
  9. 76dc365d  "AddDllDirectory"  
  10. 76dc366d  "AddIntegrityLabelToBoundaryDescr"  
  11. 76dc368d  "iptor"  
  12. 76dc3693  "AddLocalAlternateComputerNameA"  
  13. 76dc36b2  "AddLocalAlternateComputerNameW"  
  14. 76dc36d1  "AddRefActCtx"  
  15. 76dc36de  "AddSIDToBoundaryDescriptor"  
  16. 76dc36f9  "AddSecureMemoryCacheCallback"  
  17. 76dc3716  "AddVectoredContinueHandler"  
  18. 76dc3731  "AddVectoredExceptionHandler"  
  19. 76dc374d  "AdjustCalendarDate"  
  20. 76dc3760  "AllocConsole"  
  21. 76dc376d  "AllocateUserPhysicalPages"  
  22. 76dc3787  "AllocateUserPhysicalPagesNuma"  
  23. 76dc37a5  "ApplicationRecoveryFinished"  
  24. 76dc37c1  "ApplicationRecoveryInProgress"  
  25. 76dc37df  "AreFileApisANSI"  
  26. 76dc37ef  "AssignProcessToJobObject"  
  27. 76dc3808  "AttachConsole"  
  28. 76dc3816  "BackupRead"  
  29. 76dc3821  "BackupSeek"  
  30. 76dc382c  "BackupWrite"  
  31. 76dc3838  "BaseCheckAppcompatCache"  
  32. 76dc3850  "BaseCheckAppcompatCacheEx"  
  33. 76dc386a  "BaseCheckRunApp"  
  34. 76dc387a  "BaseCleanupAppcompatCacheSupport"  
  35. 76dc389a  ""  
因为传参会把地址也传进去,所以加了个限制范围,过滤地址,只要内容

7.遍历IMPORT

[plain]  view plain  copy
  1. 0:001> dt ole32!_IMAGE_DATA_DIRECTORY 76d00160+8  
  2.    +0x000 VirtualAddress   : 0xcaa24  
  3.    +0x004 Size             : 0x1f4  
  4. 0:001> ? 76d00000+0xcaa24  
  5. Evaluate expression: 1994172964 = 76dcaa24  
DataDirectory[1]即为导入表,地址为76dcaa24
[plain]  view plain  copy
  1. 0:001> dt ole32!_IMAGE_IMPORT_DESCRIPTOR 76dcaa24  
  2.    +0x000 Characteristics  : 0xcaf6c  
  3.    +0x000 OriginalFirstThunk : 0xcaf6c // 输入表名(INT)  
  4.    +0x004 TimeDateStamp    : 0  
  5.    +0x008 ForwarderChain   : 0  
  6.    +0x00c Name             : 0xcaf44  
  7.    +0x010 FirstThunk       : 0x10000  // 输入地址表(IAT)  

_IMAGE_IMPORT_DESCRIPTOR的大小为
[plain]  view plain  copy
  1. 0:001> ?? sizeof(_IMAGE_IMPORT_DESCRIPTOR)  
  2. unsigned int 0x14  

遍历IID得到所有输入表试试
[plain]  view plain  copy
  1. 0:001> da 76d00000 + 0xcaf44  
  2. 76dcaf44  "API-MS-Win-Core-RtlSupport-L1-1-"  
  3. 76dcaf64  "0.dll"  
  4. 0:001> dt ole32!_IMAGE_IMPORT_DESCRIPTOR 76dcaa24+0x14  
  5.    +0x000 Characteristics  : 0xcaf7c  
  6.    +0x000 OriginalFirstThunk : 0xcaf7c  
  7.    +0x004 TimeDateStamp    : 0  
  8.    +0x008 ForwarderChain   : 0  
  9.    +0x00c Name             : 0xcaf38  
  10.    +0x010 FirstThunk       : 0x10010  
  11. 0:001> da 76d00000 + 0xcaf38  
  12. 76dcaf38  "ntdll.dll"  
分析第一个IID的IAT和INT吧:
先看INT:
IMAGE_THUNK_DATA其实就是一个DWORD,如IID一样,也是一个接一个,最后一个为NULL
第一个:
[plain]  view plain  copy
  1. 0:001> dd 0xcaf7c+76d00000 L1  
  2. 76dcaf7c  000cbd98  
最高位不为1(为1表示为序号输入)
指向_IMAGE_IMPORT_BY_NAME结构
[plain]  view plain  copy
  1. 0:001> .foreach(place {dd 76dcaf7c}) {r @$t0 = ${place}+76d00000+2; .if (@$t0<86d00000){da @$t0;}}  
  2. 76dcbd9a  "NtCreateEvent"  
  3. 76dcbdaa  "NtDuplicateObject"  
  4. 76dcbdbe  "RtlConvertSidToUnicodeString"  
  5. 76dcbdde  "NtNotifyChangeKey"  
  6. 76dcbdf2  "RtlRunOnceInitialize"  
  7. 76dcbe0a  "NtResetEvent"  
  8. 76dcbe1a  "RtlValidSecurityDescriptor"  
  9. 76dcbe38  "RtlOpenCurrentUser"  
  10. 76dcbe4e  "strncat"  
  11. 76dcbe58  "_strlwr"  
  12. 76dcbe62  "NtQueryInstallUILanguage"  
  13. 76dcbe7e  "RtlpConvertCultureNamesToLCIDs"  
  14. 76dcbea0  "RtlpConvertLCIDsToCultureNames"  
  15. 76dcbec2  "EtwEventEnabled"  
  16. 76dcbed4  "RtlSetProcessPreferredUILanguage"  
  17. 76dcbef4  "s"  
  18. 76dcbef8  "RtlExpandEnvironmentStrings_U"  
  19. 76dcbf18  "RtlUnicodeStringToInteger"  
  20. 76dcbf34  "RtlLCIDToCultureName"  
  21. 76dcbf4c  "RtlIdnToUnicode"  
  22. 76dcbf5e  "RtlIdnToNameprepUnicode"  
  23. 76dcbf78  "RtlIdnToAscii"  
  24. 76dcbf88  "RtlIsNormalizedString"  
  25. 76dcbfa0  "RtlNormalizeString"  
  26. 76dcbfb6  "RtlIntegerToUnicodeString"  
  27. 76dcbfd2  "_ui64tow"  
  28. 76dcbfde  "_wtol"  
  29. 76dcbfe6  "_wcslwr"  
  30. 76dcbff0  "RtlUnhandledExceptionFilter"  
  31. 76dcc00e  "NtTerminateProcess"  
  32. 76dcc024  "wcsncpy"  
  33. 76dcc02e  "wcsncmp"  
  34. 76dcc038  "RtlReadThreadProfilingData"  
对比loadpe

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值