宝峰科技

 找回密码
 注册

QQ登录

只需一步,快速开始

智能终端设备维修查询系统注册会员邮箱认证须知!
查看: 2660|回复: 0

NsPack 3.7 浅析

  [复制链接]

该用户从未签到

mythhack 发表于 2010-10-13 20:03:05 | 显示全部楼层 |阅读模式

欢迎您注册加入!这里有您将更精采!

您需要 登录 才可以下载或查看,没有账号?注册

x
1. 申请空间并用Aplib将LAZM模块解码至此
2. 用LAZM解码代码段
3. 处理 E9 指令的偏移值
4. 恢复输入表
5. 恢复各区段的属性
6. JMP 到OEP

写脱壳机的时遇到的一些小东东: 北斗壳有一些小手法 一个是关键数据的偏移值是变量 需要通过OEP偏移来求取 一个是处理输入表的时候API addr 中间有 thunk值的特殊处理

更详细的分析 有时间送大家个视频好了 权当PE结构浅析的视频 o(∩_∩)o...



壳代码太多的通过EBP来求偏移的数据,直接用OD分析了,更方便些。

有两点疑惑:
一个是Nspack直接舍去了原程序的.reloc段,当然壳自己实现了LoadPE也无须该节了,还没想明白为啥他就理直气壮的给我拿掉了。
第二个是原程序的资源段的数据,NsPack首先填充了解码IAT的关键数据,故此原程序的资源势必造成相对偏移值增加,这里不清楚壳是如何处理好对资源的调用OK的。
刚接触壳,挑个简单的捏吧,有分析不当之处还望老大们多多指正。
  1. 0043298A >  9C              PUSHFD
  2. 0043298B    60              PUSHAD
  3. 0043298C    E8 00000000     CALL 复件_Sdk.00432991
  4. 00432991    5D              POP EBP
  5. 00432992    83ED 07         SUB EBP,7                                ; 求得程序入口地址,将壳段入口作为偏移 保存到EBP中
  6. 00432995    8D8D 96FEFFFF   LEA ECX,DWORD PTR SS:[EBP-16A]           ; 类似标志位
  7. 0043299B    8039 01         CMP BYTE PTR DS:[ECX],1
  8. 0043299E    0F84 42020000   JE 复件_Sdk.00432BE6
  9. 004329A4    C601 01         MOV BYTE PTR DS:[ECX],1
  10. 004329A7    8BC5            MOV EAX,EBP
  11. 004329A9    2B85 2AFEFFFF   SUB EAX,DWORD PTR SS:[EBP-1D6]           ; AddressOfEntryPoint
  12. 004329AF    8985 2AFEFFFF   MOV DWORD PTR SS:[EBP-1D6],EAX           ; BaseAddr
  13. 004329B5    0185 5AFEFFFF   ADD DWORD PTR SS:[EBP-1A6],EAX           ; SizeOfHeaders+ BaseAddr = CodeSection Addr
  14. 004329BB    8DB5 9EFEFFFF   LEA ESI,DWORD PTR SS:[EBP-162]           ; SectionAlignment
  15. 004329C1    0106            ADD DWORD PTR DS:[ESI],EAX               ; SizeOfHeaders + BaseAddr = CodeSection Addr
  16. 004329C3    55              PUSH EBP                                 ; 程序入口点
  17. 004329C4    56              PUSH ESI
  18. 004329C5    6A 40           PUSH 40
  19. 004329C7    68 00100000     PUSH 1000
  20. 004329CC    68 00100000     PUSH 1000                                ; Size
  21. 004329D1    6A 00           PUSH 0
  22. 004329D3    FF95 D2FEFFFF   CALL DWORD PTR SS:[EBP-12E]              ; VirtualAlloc  return = 3F0000
  23. 004329D9    85C0            TEST EAX,EAX
  24. 004329DB    0F84 69030000   JE 复件_Sdk.00432D4A
  25. 004329E1    8985 52FEFFFF   MOV DWORD PTR SS:[EBP-1AE],EAX           ; NewAddr size = 1000
  26. 004329E7    E8 00000000     CALL 复件_Sdk.004329EC
  27. 004329EC    5B              POP EBX                                  ; 求出该代码的EIP  004329EC
  28. 004329ED    B9 67030000     MOV ECX,367                              ; 固定数值
  29. 004329F2    03D9            ADD EBX,ECX                              ; 求出偏移地址    00432D53
  30. 004329F4    50              PUSH EAX                                 ; NewAddr
  31. 004329F5    53              PUSH EBX                                 ; 程序待解码的数据地址
  32. 004329F6    E8 B0020000     CALL 复件_Sdk.00432CAB                     ; 疑似APLIB解码出LZMA的代码
  33. 004329FB    5E              POP ESI
  34. 004329FC    5D              POP EBP                                  ; 这两句平衡堆栈
  35. 004329FD    8B36            MOV ESI,DWORD PTR DS:[ESI]
  36. 004329FF    8BFD            MOV EDI,EBP                              ; 入口点
  37. 00432A01    03BD 1AFEFFFF   ADD EDI,DWORD PTR SS:[EBP-1E6]           ; 第二个偏移值 : 0x906
  38. 00432A07    8BDF            MOV EBX,EDI                              ; EBX = EDI = 00433290
  39. 00432A09    833F 00         CMP DWORD PTR DS:[EDI],0
  40. 00432A0C    75 0A           JNZ SHORT 复件_Sdk.00432A18
  41. 00432A0E    83C7 04         ADD EDI,4
  42. 00432A11    B9 00000000     MOV ECX,0
  43. 00432A16    EB 16           JMP SHORT 复件_Sdk.00432A2E
  44. 00432A18    B9 01000000     MOV ECX,1
  45. 00432A1D    033B            ADD EDI,DWORD PTR DS:[EBX]
  46. 00432A1F    83C3 04         ADD EBX,4
  47. 00432A22    833B 00         CMP DWORD PTR DS:[EBX],0
  48. 00432A25    74 34           JE SHORT 复件_Sdk.00432A5B
  49. 00432A27    0113            ADD DWORD PTR DS:[EBX],EDX
  50. 00432A29    8B33            MOV ESI,DWORD PTR DS:[EBX]
  51. 00432A2B    037B 04         ADD EDI,DWORD PTR DS:[EBX+4]
  52. 00432A2E    57              PUSH EDI
  53. 00432A2F    51              PUSH ECX
  54. 00432A30    53              PUSH EBX
  55. 00432A31    FFB5 D6FEFFFF   PUSH DWORD PTR SS:[EBP-12A]              ; 参数一:VirtualFree
  56. 00432A37    FFB5 D2FEFFFF   PUSH DWORD PTR SS:[EBP-12E]              ; 参数二:VitrualAlloc
  57. 00432A3D    8BD6            MOV EDX,ESI                              ; 参数三:EDX 401000
  58. 00432A3F    8BCF            MOV ECX,EDI                              ; 参数四:ECX 433294
  59. 00432A41    8B85 52FEFFFF   MOV EAX,DWORD PTR SS:[EBP-1AE]           ; NewAddr
  60. 00432A47    05 AA050000     ADD EAX,5AA                              ; 求得新空间某API的地址
  61. 00432A4C    FFD0            CALL EAX                                 ; 解码了Code段
  62. 00432A4E    5B              POP EBX
  63. 00432A4F    59              POP ECX
  64. 00432A50    5F              POP EDI
  65. 00432A51    83F9 00         CMP ECX,0
  66. 00432A54    74 05           JE SHORT 复件_Sdk.00432A5B
  67. 00432A56    83C3 08         ADD EBX,8
  68. 00432A59  ^ EB C7           JMP SHORT 复件_Sdk.00432A22
  69. 00432A5B    68 00800000     PUSH 8000
  70. 00432A60    6A 00           PUSH 0
  71. 00432A62    FFB5 52FEFFFF   PUSH DWORD PTR SS:[EBP-1AE]
  72. 00432A68    FF95 D6FEFFFF   CALL DWORD PTR SS:[EBP-12A]              ; VirtualFree  释放LZMA的代码
  73. 00432A6E    8DB5 5AFEFFFF   LEA ESI,DWORD PTR SS:[EBP-1A6]           ; EBP 43298A
  74. 00432A74    8B4E 08         MOV ECX,DWORD PTR DS:[ESI+8]             ; ECX = 391
  75. 00432A77    8D56 10         LEA EDX,DWORD PTR DS:[ESI+10]            ; 这行代码有啥用呢  下边做比较判断用
  76. 00432A7A    8B36            MOV ESI,DWORD PTR DS:[ESI]               ; 一下一个循环要处理 CALL 的重定位表
  77. 00432A7C    8BFE            MOV EDI,ESI
  78. 00432A7E    83F9 00         CMP ECX,0
  79. 00432A81    74 3F           JE SHORT 复件_Sdk.00432AC2
  80. 00432A83    8A07            MOV AL,BYTE PTR DS:[EDI]
  81. 00432A85    47              INC EDI
  82. 00432A86    2C E8           SUB AL,0E8
  83. 00432A88    3C 01           CMP AL,1                                 ; 处理 Call 的重定位表
  84. 00432A8A  ^ 77 F7           JA SHORT 复件_Sdk.00432A83                 ; 处理E9   找到E9
  85. 00432A8C    8B07            MOV EAX,DWORD PTR DS:[EDI]               ; COPY 出 CALL的偏移值
  86. 00432A8E    807A 01 00      CMP BYTE PTR DS:[EDX+1],0
  87. 00432A92    74 14           JE SHORT 复件_Sdk.00432AA8
  88. 00432A94    8A1A            MOV BL,BYTE PTR DS:[EDX]                 ; EDX 这里做判断用
  89. 00432A96    381F            CMP BYTE PTR DS:[EDI],BL
  90. 00432A98  ^ 75 E9           JNZ SHORT 复件_Sdk.00432A83
  91. 00432A9A    8A5F 04         MOV BL,BYTE PTR DS:[EDI+4]
  92. 00432A9D    66:C1E8 08      SHR AX,8                                 ; 算法  解密偏移
  93. 00432AA1    C1C0 10         ROL EAX,10
  94. 00432AA4    86C4            XCHG AH,AL
  95. 00432AA6    EB 0A           JMP SHORT 复件_Sdk.00432AB2
  96. 00432AA8    8A5F 04         MOV BL,BYTE PTR DS:[EDI+4]               ; 第二种解法
  97. 00432AAB    86C4            XCHG AH,AL
  98. 00432AAD    C1C0 10         ROL EAX,10
  99. 00432AB0    86C4            XCHG AH,AL
  100. 00432AB2    2BC7            SUB EAX,EDI                              ; 计算的结果 - 自身的偏移
  101. 00432AB4    03C6            ADD EAX,ESI                              ; + Code 的起始地址
  102. 00432AB6    8907            MOV DWORD PTR DS:[EDI],EAX
  103. 00432AB8    83C7 05         ADD EDI,5
  104. 00432ABB    80EB E8         SUB BL,0E8
  105. 00432ABE    8BC3            MOV EAX,EBX
  106. 00432AC0  ^ E2 C6           LOOPD SHORT 复件_Sdk.00432A88
  107. 00432AC2    E8 3A010000     CALL 复件_Sdk.00432C01                     ; Fix IAT
  108. 00432AC7    8D8D 6EFEFFFF   LEA ECX,DWORD PTR SS:[EBP-192]
  109. 00432ACD    8B41 08         MOV EAX,DWORD PTR DS:[ECX+8]
  110. 00432AD0    83F8 00         CMP EAX,0
  111. 00432AD3    0F84 81000000   JE 复件_Sdk.00432B5A                       ; JMP 没看懂这里比较的是什么
  112. 00432AD9    8BF2            MOV ESI,EDX
  113. 00432ADB    2B71 10         SUB ESI,DWORD PTR DS:[ECX+10]
  114. 00432ADE    74 7A           JE SHORT 复件_Sdk.00432B5A
  115. 00432AE0    8971 10         MOV DWORD PTR DS:[ECX+10],ESI
  116. 00432AE3    8DB5 9EFEFFFF   LEA ESI,DWORD PTR SS:[EBP-162]
  117. 00432AE9    8B36            MOV ESI,DWORD PTR DS:[ESI]
  118. 00432AEB    8D5E FC         LEA EBX,DWORD PTR DS:[ESI-4]
  119. 00432AEE    8B01            MOV EAX,DWORD PTR DS:[ECX]
  120. 00432AF0    83F8 01         CMP EAX,1
  121. 00432AF3    74 0A           JE SHORT 复件_Sdk.00432AFF
  122. 00432AF5    8BFA            MOV EDI,EDX
  123. 00432AF7    0379 08         ADD EDI,DWORD PTR DS:[ECX+8]
  124. 00432AFA    8B49 10         MOV ECX,DWORD PTR DS:[ECX+10]
  125. 00432AFD    EB 08           JMP SHORT 复件_Sdk.00432B07
  126. 00432AFF    8BFE            MOV EDI,ESI
  127. 00432B01    0379 08         ADD EDI,DWORD PTR DS:[ECX+8]
  128. 00432B04    8B49 10         MOV ECX,DWORD PTR DS:[ECX+10]
  129. 00432B07    33C0            XOR EAX,EAX
  130. 00432B09    8A07            MOV AL,BYTE PTR DS:[EDI]
  131. 00432B0B    47              INC EDI
  132. 00432B0C    0BC0            OR EAX,EAX
  133. 00432B0E    74 20           JE SHORT 复件_Sdk.00432B30
  134. 00432B10    3C EF           CMP AL,0EF
  135. 00432B12    77 06           JA SHORT 复件_Sdk.00432B1A
  136. 00432B14    03D8            ADD EBX,EAX
  137. 00432B16    010B            ADD DWORD PTR DS:[EBX],ECX
  138. 00432B18  ^ EB ED           JMP SHORT 复件_Sdk.00432B07
  139. 00432B1A    24 0F           AND AL,0F
  140. 00432B1C    C1E0 10         SHL EAX,10
  141. 00432B1F    66:8B07         MOV AX,WORD PTR DS:[EDI]
  142. 00432B22    83C7 02         ADD EDI,2
  143. 00432B25    0BC0            OR EAX,EAX
  144. 00432B27  ^ 75 EB           JNZ SHORT 复件_Sdk.00432B14
  145. 00432B29    8B07            MOV EAX,DWORD PTR DS:[EDI]
  146. 00432B2B    83C7 04         ADD EDI,4
  147. 00432B2E  ^ EB E4           JMP SHORT 复件_Sdk.00432B14
  148. 00432B30    33DB            XOR EBX,EBX
  149. 00432B32    87FE            XCHG ESI,EDI
  150. 00432B34    8B06            MOV EAX,DWORD PTR DS:[ESI]
  151. 00432B36    83F8 00         CMP EAX,0
  152. 00432B39    74 1F           JE SHORT 复件_Sdk.00432B5A
  153. 00432B3B    AD              LODS DWORD PTR DS:[ESI]
  154. 00432B3C    0BC0            OR EAX,EAX
  155. 00432B3E    74 08           JE SHORT 复件_Sdk.00432B48
  156. 00432B40    03D8            ADD EBX,EAX
  157. 00432B42    66:010C1F       ADD WORD PTR DS:[EDI+EBX],CX
  158. 00432B46  ^ EB F3           JMP SHORT 复件_Sdk.00432B3B
  159. 00432B48    33DB            XOR EBX,EBX
  160. 00432B4A    C1E9 10         SHR ECX,10
  161. 00432B4D    AD              LODS DWORD PTR DS:[ESI]
  162. 00432B4E    0BC0            OR EAX,EAX
  163. 00432B50    74 08           JE SHORT 复件_Sdk.00432B5A
  164. 00432B52    03D8            ADD EBX,EAX
  165. 00432B54    66:010C1F       ADD WORD PTR DS:[EDI+EBX],CX
  166. 00432B58  ^ EB F3           JMP SHORT 复件_Sdk.00432B4D
  167. 00432B5A    8DB5 2AFEFFFF   LEA ESI,DWORD PTR SS:[EBP-1D6]               ;  jmp 到这里
  168. 00432B60    8B16            MOV EDX,DWORD PTR DS:[ESI]               ; BaseAddr
  169. 00432B62    8DB5 86FEFFFF   LEA ESI,DWORD PTR SS:[EBP-17A]
  170. 00432B68    8A06            MOV AL,BYTE PTR DS:[ESI]
  171. 00432B6A    3C 01           CMP AL,1                                 ; 这里有一个分支
  172. 00432B6C    75 3F           JNZ SHORT 复件_Sdk.00432BAD                ; 跳走
  173. 00432B6E    0356 04         ADD EDX,DWORD PTR DS:[ESI+4]
  174. 00432B71    56              PUSH ESI
  175. 00432B72    52              PUSH EDX
  176. 00432B73    56              PUSH ESI
  177. 00432B74    6A 04           PUSH 4
  178. 00432B76    68 00010000     PUSH 100
  179. 00432B7B    52              PUSH EDX
  180. 00432B7C    FF95 CEFEFFFF   CALL DWORD PTR SS:[EBP-132]
  181. 00432B82    5F              POP EDI
  182. 00432B83    5E              POP ESI
  183. 00432B84    83F8 01         CMP EAX,1
  184. 00432B87    0F85 BD010000   JNZ 复件_Sdk.00432D4A
  185. 00432B8D    83C6 08         ADD ESI,8
  186. 00432B90    B9 08000000     MOV ECX,8
  187. 00432B95    F3:A4           REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
  188. 00432B97    83EE 0C         SUB ESI,0C
  189. 00432B9A    83EF 08         SUB EDI,8
  190. 00432B9D    56              PUSH ESI
  191. 00432B9E    FF76 FC         PUSH DWORD PTR DS:[ESI-4]
  192. 00432BA1    68 00010000     PUSH 100
  193. 00432BA6    57              PUSH EDI
  194. 00432BA7    FF95 CEFEFFFF   CALL DWORD PTR SS:[EBP-132]
  195. 00432BAD    55              PUSH EBP
  196. 00432BAE    5B              POP EBX
  197. 00432BAF    81EB 21000000   SUB EBX,21
  198. 00432BB5    33C9            XOR ECX,ECX
  199. 00432BB7    8A0B            MOV CL,BYTE PTR DS:[EBX]                 ; 当前程序的区段数
  200. 00432BB9    80F9 00         CMP CL,0
  201. 00432BBC    74 28           JE SHORT 复件_Sdk.00432BE6
  202. 00432BBE    43              INC EBX
  203. 00432BBF    8DB5 2AFEFFFF   LEA ESI,DWORD PTR SS:[EBP-1D6]
  204. 00432BC5    8B16            MOV EDX,DWORD PTR DS:[ESI]
  205. 00432BC7    56              PUSH ESI
  206. 00432BC8    51              PUSH ECX
  207. 00432BC9    53              PUSH EBX
  208. 00432BCA    52              PUSH EDX
  209. 00432BCB    56              PUSH ESI
  210. 00432BCC    FF33            PUSH DWORD PTR DS:[EBX]
  211. 00432BCE    FF73 04         PUSH DWORD PTR DS:[EBX+4]
  212. 00432BD1    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
  213. 00432BD4    03C2            ADD EAX,EDX
  214. 00432BD6    50              PUSH EAX
  215. 00432BD7    FF95 CEFEFFFF   CALL DWORD PTR SS:[EBP-132]              ; VirtualProtect 恢复各区段属性
  216. 00432BDD    5A              POP EDX
  217. 00432BDE    5B              POP EBX
  218. 00432BDF    59              POP ECX
  219. 00432BE0    5E              POP ESI
  220. 00432BE1    83C3 0C         ADD EBX,0C
  221. 00432BE4  ^ E2 E1           LOOPD SHORT 复件_Sdk.00432BC7
  222. 00432BE6    B8 00000000     MOV EAX,0
  223. 00432BEB    83F8 00         CMP EAX,0
  224. 00432BEE    74 0A           JE SHORT 复件_Sdk.00432BFA
  225. 00432BF0    61              POPAD
  226. 00432BF1    9D              POPFD
  227. 00432BF2    B8 01000000     MOV EAX,1
  228. 00432BF7    C2 0C00         RETN 0C
  229. 00432BFA    61              POPAD
  230. 00432BFB    9D              POPFD
  231. 00432BFC  - E9 DF07FDFF     JMP 复件_Sdk.004033E0                      ; JMP 到 OEP
复制代码
Fix IAT 函数的处理:
  1. 00432C01    8BB5 22FEFFFF   MOV ESI,DWORD PTR SS:[EBP-1DE]           ; 修复IAT表      EBP 永远是基地址
  2. 00432C07    0BF6            OR ESI,ESI
  3. 00432C09    0F84 97000000   JE 复件_Sdk.00432CA6
  4. 00432C0F    8B95 2AFEFFFF   MOV EDX,DWORD PTR SS:[EBP-1D6]           ; 400000
  5. 00432C15    03F2            ADD ESI,EDX                              ; 430000
  6. 00432C17    833E 00         CMP DWORD PTR DS:[ESI],0
  7. 00432C1A    75 0E           JNZ SHORT 复件_Sdk.00432C2A
  8. 00432C1C    837E 04 00      CMP DWORD PTR DS:[ESI+4],0
  9. 00432C20    75 08           JNZ SHORT 复件_Sdk.00432C2A
  10. 00432C22    837E 08 00      CMP DWORD PTR DS:[ESI+8],0
  11. 00432C26    75 02           JNZ SHORT 复件_Sdk.00432C2A
  12. 00432C28    EB 7A           JMP SHORT 复件_Sdk.00432CA4
  13. 00432C2A    8B5E 08         MOV EBX,DWORD PTR DS:[ESI+8]             ; IAT TABLE ADDR
  14. 00432C2D    03DA            ADD EBX,EDX
  15. 00432C2F    53              PUSH EBX                                 ; 保存表
  16. 00432C30    52              PUSH EDX
  17. 00432C31    56              PUSH ESI                                 ; 保存ESI
  18. 00432C32    8DBD 42FFFFFF   LEA EDI,DWORD PTR SS:[EBP-BE]            ; KERNEL32.DLL
  19. 00432C38    037E 04         ADD EDI,DWORD PTR DS:[ESI+4]
  20. 00432C3B    83C6 0C         ADD ESI,0C                               ; ADD
  21. 00432C3E    57              PUSH EDI
  22. 00432C3F    FF95 C6FEFFFF   CALL DWORD PTR SS:[EBP-13A]              ; LoadLibraryA
  23. 00432C45    5F              POP EDI                                  ; 恢复ESI到EDI
  24. 00432C46    5A              POP EDX
  25. 00432C47    5B              POP EBX
  26. 00432C48    83F8 00         CMP EAX,0                                ; hHandle
  27. 00432C4B    74 59           JE SHORT 复件_Sdk.00432CA6
  28. 00432C4D    8985 32FEFFFF   MOV DWORD PTR SS:[EBP-1CE],EAX           ; EBX 是IAT ADDR 的表
  29. 00432C53    033E            ADD EDI,DWORD PTR DS:[ESI]               ; EDI + IAT STRING 的相对偏移
  30. 00432C55    83C6 04         ADD ESI,4
  31. 00432C58    33C9            XOR ECX,ECX                              ; DO
  32. 00432C5A    8A0E            MOV CL,BYTE PTR DS:[ESI]                 ; 这里又是一张表 对应每个API的长度
  33. 00432C5C    83F9 00         CMP ECX,0
  34. 00432C5F    75 03           JNZ SHORT 复件_Sdk.00432C64
  35. 00432C61    46              INC ESI
  36. 00432C62  ^ EB B3           JMP SHORT 复件_Sdk.00432C17
  37. 00432C64    8BC7            MOV EAX,EDI                              ; 保存字符串地址
  38. 00432C66    03F9            ADD EDI,ECX                              ; EDI = NEXT API String
  39. 00432C68    52              PUSH EDX
  40. 00432C69    53              PUSH EBX
  41. 00432C6A    50              PUSH EAX
  42. 00432C6B    8038 FF         CMP BYTE PTR DS:[EAX],0FF                ; 比较 API first Char if OFF
  43. 00432C6E    75 08           JNZ SHORT 复件_Sdk.00432C78
  44. 00432C70    40              INC EAX
  45. 00432C71    8B00            MOV EAX,DWORD PTR DS:[EAX]
  46. 00432C73    25 FFFFFF7F     AND EAX,7FFFFFFF
  47. 00432C78    8A0F            MOV CL,BYTE PTR DS:[EDI]                 ; 先保存
  48. 00432C7A    C607 00         MOV BYTE PTR DS:[EDI],0                  ; 在至零
  49. 00432C7D    51              PUSH ECX                                 ; 保存临时值  CL
  50. 00432C7E    50              PUSH EAX                                 ; API String
  51. 00432C7F    FFB5 32FEFFFF   PUSH DWORD PTR SS:[EBP-1CE]              ; DLL Handle
  52. 00432C85    FF95 CAFEFFFF   CALL DWORD PTR SS:[EBP-136]              ; GetProcAddress
  53. 00432C8B    59              POP ECX
  54. 00432C8C    5A              POP EDX                                  ; mov edx,eax  // 不影响 API addr
  55. 00432C8D    5B              POP EBX
  56. 00432C8E    5A              POP EDX
  57. 00432C8F    83F8 00         CMP EAX,0
  58. 00432C92    74 12           JE SHORT 复件_Sdk.00432CA6
  59. 00432C94    880F            MOV BYTE PTR DS:[EDI],CL                 ; 还原API STRING
  60. 00432C96    8946 FC         MOV DWORD PTR DS:[ESI-4],EAX             ; 临时空间
  61. 00432C99    FF76 FC         PUSH DWORD PTR DS:[ESI-4]
  62. 00432C9C    8F03            POP DWORD PTR DS:[EBX]                   ; EBX 存放Import Table
  63. 00432C9E    83C3 04         ADD EBX,4
  64. 00432CA1    46              INC ESI                                  ; API STRING LENTABLE ++
  65. 00432CA2  ^ EB B4           JMP SHORT 复件_Sdk.00432C58
  66. 00432CA4    F8              CLC
  67. 00432CA5    C3              RETN
复制代码
对Fix Iat 函数中的一些笔记注释:


原程序输入表部分的信息:
  1. 00400158    00F00200    DD 0002F000          ;  Import Table address = 2F000   // 5 DWORD Tables
  2. 0040015C    50000000    DD 00000050          ;  Import Table size = 50 (80.)
  3. 004001B0    78F20200    DD 0002F278          ;  Import Address Table address = 2F278  // IATs
  4. 004001B4    28020000    DD 00000228          ;  Import Address Table size = 228 (552.)
  5. [ebp-0be] 是DLL名称表,其对应了一个SIZE表[ESI+4]
  6. 004328CC  4B 45 52 4E 45 4C 33 32 2E 44 4C 4C 00 55 53 45  KERNEL32.DLL.USE
  7. 004328DC  52 33 32 2E 44 4C 4C 00 47 44 49 33 32 2E 44 4C  R32.DLL.GDI32.DL
  8. 004328EC  4C 00 00 00
复制代码
全局数据:
  1. MOV ESI,DWORD PTR SS:[EBP-1DE]     // 30000    这个应该是VirtualAddress  数据在资源段中
  2. 00400270    2E 72 73 72>ASCII ".rsrc"        ; SECTION
  3. 00400278    8C190000    DD 0000198C          ;  VirtualSize = 198C (6540.)
  4. 0040027C    00000300    DD 00030000          ;  VirtualAddress = 30000
  5. 00400280    00200000    DD 00002000          ;  SizeOfRawData = 2000 (8192.)
  6. 00400284    00E00200    DD 0002E000          ;  PointerToRawData = 2E000
  7. MOV EDX,DWORD PTR SS:[EBP-1D6]   400000      // BaseAddr
复制代码
求出VirtualAddr的内容数据:

                      处理DLL名称表的偏移
  1. OffSet       IAT Addr   API STRINGS
  2. 00430000  4A 00 00 00 00 00 00 00 B4 F2 02 00 9C 00 00 00  J.......打.?..
  3. 00430010  0E 0C 0E 0C 0C 0E 0E 13 08 06 09 0E 0C 0C 0B 09  .......
  4. 00430020  09 0B 08 0A 0B 0D 17 0B 17 10 0B 15 0C 16 0D 0C  ......
  5. 00430030  10 0F 0F 0A 0B 0D 0C 0C 0A 09 14 12 0E 0C 14 12  .......
  6. 00430040  10 11 18 17 17 13 15 16 0E 00 2D 00 00 00 0D 00  .-.....
  7. 00430050  00 00 F0 F3 02 00 88 03 00 00 09 0F 0D 0E 0A 08  ..痼.?.....
  8. 00430060  08 0F 0F 0A 0C 0B 10 0B 11 0B 15 10 10 09 09 0B  ....
  9. 00430070  0D 0E 08 08 05 09 00 15 00 00 00 18 00 00 00 78  .........x
  10. 00430080  F2 02 00 A9 04 00 00 0E 10 08 0A 00 00 00 00 00  ?.?........
  11. 00430090  00 00 00 00 00 00 00 00 00 00 00 00 43 6F 6D 70  ............Comp
复制代码
简单说下00430000处的数据:
4A 00 00 00   
00 00 00 00    计算中的相对偏移
B4 F2 02 00    IAT Table Addr
9C 00 00 00    API字符串的偏移 // 这里使用一次后做临时变量空间用
00430010:0E 0C 0E 0C  字符串中对应API Name的长度

填补输入表,只要拥有结构体中的 IAT TABLE Addr 和 API NAME、DLL NAME就OK了


IAT TABLE STRUCT:
1. OFFSET TABLE ADDR   XX // 通过偏移找到对应的IAT名称
2. XXX
3. XXX
4. DLL STRING ADDR     OK // 数据中已给出
5. IAT ADDR                  OK // 数据中已给出
接触壳不多,之前了解过PE格式,现学先用好了,这里分享一份IAT的复习笔记:

学习Import Address Table  和 Import Table 格式的时候不需要看什么资料,先拿最简单的MsgBox程序,OD载入后直接猜其输入表就OK了。大致能猜个差不多,然后再找一个复杂些的输入表验证一下猜测结果,基本上就八九不离十了。

如图,详细的资料见附件:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

免责声明

本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。本站所发布的任何软件编程开发或软件的逆向分析文章、逆向分析视频、补丁、注册机和注册信息,仅限用于学习和研究软件安全的目的。全体用户必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。学习编程开发技术或逆向分析技术是为了更好的完善软件可能存在的不安全因素,提升软件安全意识。所以您如果喜欢某程序,请购买注册正版软件,获得正版优质服务!不得将上述内容私自传播、销售或者用于商业用途!否则,一切后果请用户自负!

QQ|Archiver|手机版|小黑屋|联系我们|宝峰科技 ( 滇公网安备 53050202000040号 | 滇ICP备09007156号-2 )

Copyright © 2001-2023 Discuz! Team. GMT+8, 2024-12-22 21:32 , File On Powered by Discuz! X3.49

快速回复 返回顶部 返回列表