Guest User

Untitled

a guest
Nov 6th, 2015
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 107.61 KB | None | 0 0
  1. #!/usr/bin/env python
  2. if 64 - 64: i11iIiiIii
  3. if 65 - 65: O0 / iIii1I11I1II1 % OoooooooOO - i1IIi
  4. if 73 - 73: II111iiii
  5. if 22 - 22: I1IiiI * Oo0Ooo / OoO0O00 . OoOoOO00 . o0oOOo0O0Ooo / I1ii11iIi11i
  6. if 48 - 48: oO0o / OOooOOo / I11i / Ii1I
  7. if 48 - 48: iII111i % IiII + I1Ii111 / ooOoO0o * Ii1I
  8. if 46 - 46: ooOoO0o * I11i - OoooooooOO
  9. if 30 - 30: o0oOOo0O0Ooo - O0 % o0oOOo0O0Ooo - OoooooooOO * O0 * OoooooooOO
  10. if 60 - 60: iIii1I11I1II1 / i1IIi * oO0o - I1ii11iIi11i + o0oOOo0O0Ooo
  11. if 94 - 94: i1IIi % Oo0Ooo
  12. if 68 - 68: Ii1I / O0
  13. if 46 - 46: O0 * II111iiii / IiII * Oo0Ooo * iII111i . I11i
  14. if 62 - 62: i11iIiiIii - II111iiii % I1Ii111 - iIii1I11I1II1 . I1ii11iIi11i . II111iiii
  15. if 61 - 61: oO0o / OoOoOO00 / iII111i * OoO0O00 . II111iiii
  16. if 1 - 1: II111iiii - I1ii11iIi11i % i11iIiiIii + IiII . I1Ii111
  17. if 55 - 55: iIii1I11I1II1 - I1IiiI . Ii1I * IiII * i1IIi / iIii1I11I1II1
  18. if 79 - 79: oO0o + I1Ii111 . ooOoO0o * IiII % I11i . I1IiiI
  19. if 94 - 94: iII111i * Ii1I / IiII . i1IIi * iII111i
  20. if 47 - 47: i1IIi % i11iIiiIii
  21. if 20 - 20: ooOoO0o * II111iiii
  22. if 65 - 65: o0oOOo0O0Ooo * iIii1I11I1II1 * ooOoO0o
  23. if 18 - 18: iIii1I11I1II1 / I11i + oO0o / Oo0Ooo - II111iiii - I11i
  24. if 1 - 1: I11i - OOooOOo % O0 + I1IiiI - iII111i / I11i
  25. if 31 - 31: OoO0O00 + II111iiii
  26. if 13 - 13: OOooOOo * oO0o * I1IiiI
  27. if 55 - 55: II111iiii
  28. if 43 - 43: OoOoOO00 - i1IIi + I1Ii111 + Ii1I
  29. if 17 - 17: o0oOOo0O0Ooo
  30. if 64 - 64: Ii1I % i1IIi % OoooooooOO
  31. if 3 - 3: iII111i + O0
  32. if 42 - 42: OOooOOo / i1IIi + i11iIiiIii - Ii1I
  33. if 78 - 78: OoO0O00
  34. if 18 - 18: O0 - iII111i / iII111i + ooOoO0o % ooOoO0o - IiII
  35. if 62 - 62: iII111i - IiII - OoOoOO00 % i1IIi / oO0o
  36. if 77 - 77: II111iiii - II111iiii . I1IiiI / o0oOOo0O0Ooo
  37. if 14 - 14: I11i % O0
  38. if 41 - 41: i1IIi + I1Ii111 + OOooOOo - IiII
  39. if 77 - 77: Oo0Ooo . IiII % ooOoO0o
  40. if 42 - 42: oO0o - i1IIi / i11iIiiIii + OOooOOo + OoO0O00
  41. if 17 - 17: oO0o . Oo0Ooo . I1ii11iIi11i
  42. if 3 - 3: OoOoOO00 . Oo0Ooo . I1IiiI / Ii1I
  43. if 38 - 38: II111iiii % i11iIiiIii . ooOoO0o - OOooOOo + Ii1I
  44. if 66 - 66: OoooooooOO * OoooooooOO . OOooOOo . i1IIi - OOooOOo
  45. if 77 - 77: I11i - iIii1I11I1II1
  46. if 82 - 82: i11iIiiIii . OOooOOo / Oo0Ooo * O0 % oO0o % iIii1I11I1II1
  47. if 78 - 78: iIii1I11I1II1 - Ii1I * OoO0O00 + o0oOOo0O0Ooo + iII111i + iII111i
  48. if 11 - 11: iII111i - OoO0O00 % ooOoO0o % iII111i / OoOoOO00 - OoO0O00
  49. if 74 - 74: iII111i * O0
  50. if 89 - 89: oO0o + Oo0Ooo
  51. if 3 - 3: i1IIi / I1IiiI % I11i * i11iIiiIii / O0 * I11i
  52. if 49 - 49: oO0o % Ii1I + i1IIi . I1IiiI % I1ii11iIi11i
  53. if 48 - 48: I11i + I11i / II111iiii / iIii1I11I1II1
  54. if 20 - 20: o0oOOo0O0Ooo
  55. if 77 - 77: OoOoOO00 / I11i
  56. if 98 - 98: iIii1I11I1II1 / i1IIi / i11iIiiIii / o0oOOo0O0Ooo
  57. if 28 - 28: OOooOOo - IiII . IiII + OoOoOO00 - OoooooooOO + O0
  58. if 95 - 95: OoO0O00 % oO0o . O0
  59. if 15 - 15: ooOoO0o / Ii1I . Ii1I - i1IIi
  60. if 53 - 53: IiII + I1IiiI * oO0o
  61. if 61 - 61: i1IIi * OOooOOo / OoooooooOO . i11iIiiIii . OoOoOO00
  62. if 60 - 60: I11i / I11i
  63. if 46 - 46: Ii1I * OOooOOo - OoO0O00 * oO0o - I1Ii111
  64. if 83 - 83: OoooooooOO
  65. if 31 - 31: II111iiii - OOooOOo . I1Ii111 % OoOoOO00 - O0
  66. if 4 - 4: II111iiii / ooOoO0o . iII111i
  67. if 58 - 58: OOooOOo * i11iIiiIii / OoOoOO00 % I1Ii111 - I1ii11iIi11i / oO0o
  68. if 50 - 50: I1IiiI
  69. if 34 - 34: I1IiiI * II111iiii % iII111i * OoOoOO00 - I1IiiI
  70. if 33 - 33: o0oOOo0O0Ooo + OOooOOo * OoO0O00 - Oo0Ooo / oO0o % Ii1I
  71. if 21 - 21: OoO0O00 * iIii1I11I1II1 % oO0o * i1IIi
  72. if 16 - 16: O0 - I1Ii111 * iIii1I11I1II1 + iII111i
  73. if 50 - 50: II111iiii - ooOoO0o * I1ii11iIi11i / I1Ii111 + o0oOOo0O0Ooo
  74. if 88 - 88: Ii1I / I1Ii111 + iII111i - II111iiii / ooOoO0o - OoOoOO00
  75. if 15 - 15: I1ii11iIi11i + OoOoOO00 - OoooooooOO / OOooOOo
  76. if 58 - 58: i11iIiiIii % I11i
  77. if 71 - 71: OOooOOo + ooOoO0o % i11iIiiIii + I1ii11iIi11i - IiII
  78. if 88 - 88: OoOoOO00 - OoO0O00 % OOooOOo
  79. if 16 - 16: I1IiiI * oO0o % IiII
  80. if 86 - 86: I1IiiI + Ii1I % i11iIiiIii * oO0o . ooOoO0o * I11i
  81. if 44 - 44: oO0o
  82. if 88 - 88: I1Ii111 % Ii1I . II111iiii
  83. if 38 - 38: o0oOOo0O0Ooo
  84. if 57 - 57: O0 / oO0o * I1Ii111 / OoOoOO00 . II111iiii
  85. if 26 - 26: iII111i
  86. if 91 - 91: OoO0O00 . I1ii11iIi11i + OoO0O00 - iII111i / OoooooooOO
  87. if 39 - 39: I1ii11iIi11i / ooOoO0o - II111iiii
  88. if 98 - 98: I1ii11iIi11i / I11i % oO0o . OoOoOO00
  89. if 91 - 91: oO0o % Oo0Ooo
  90. if 64 - 64: I11i % iII111i - I1Ii111 - oO0o
  91. if 31 - 31: I11i - II111iiii . I11i
  92. if 18 - 18: o0oOOo0O0Ooo
  93. if 98 - 98: iII111i * iII111i / iII111i + I11i
  94. if 34 - 34: ooOoO0o
  95. if 15 - 15: I11i * ooOoO0o * Oo0Ooo % i11iIiiIii % OoOoOO00 - OOooOOo
  96. if 68 - 68: I1Ii111 % i1IIi . IiII . I1ii11iIi11i
  97. if 92 - 92: iII111i . I1Ii111
  98. if 31 - 31: I1Ii111 . OoOoOO00 / O0
  99. if 89 - 89: OoOoOO00
  100. if 68 - 68: OoO0O00 * OoooooooOO % O0 + OoO0O00 + ooOoO0o
  101. if 4 - 4: ooOoO0o + O0 * OOooOOo
  102. if 55 - 55: Oo0Ooo + iIii1I11I1II1 / OoOoOO00 * oO0o - i11iIiiIii - Ii1I
  103. if 25 - 25: I1ii11iIi11i
  104. if 7 - 7: i1IIi / I1IiiI * I1Ii111 . IiII . iIii1I11I1II1
  105. if 13 - 13: OOooOOo / i11iIiiIii
  106. if 2 - 2: I1IiiI / O0 / o0oOOo0O0Ooo % OoOoOO00 % Ii1I
  107. if 52 - 52: o0oOOo0O0Ooo
  108. if 95 - 95: Ii1I
  109. if 87 - 87: ooOoO0o + OoOoOO00 . OOooOOo + OoOoOO00
  110. if 91 - 91: O0
  111. if 61 - 61: II111iiii
  112. if 64 - 64: ooOoO0o / OoOoOO00 - O0 - I11i
  113. if 86 - 86: I11i % OoOoOO00 / I1IiiI / OoOoOO00
  114. if 42 - 42: OoO0O00
  115. if 67 - 67: I1Ii111 . iII111i . O0
  116. if 10 - 10: I1ii11iIi11i % I1ii11iIi11i - iIii1I11I1II1 / OOooOOo + Ii1I
  117. if 87 - 87: oO0o * I1ii11iIi11i + OOooOOo / iIii1I11I1II1 / iII111i
  118. if 37 - 37: iII111i - ooOoO0o * oO0o % i11iIiiIii - I1Ii111
  119. if 83 - 83: I11i / I1IiiI
  120. if 34 - 34: IiII
  121. if 57 - 57: oO0o . I11i . i1IIi
  122. if 42 - 42: I11i + I1ii11iIi11i % O0
  123. if 6 - 6: oO0o
  124. if 68 - 68: OoOoOO00 - OoO0O00
  125. if 28 - 28: OoO0O00 . OOooOOo / OOooOOo + Oo0Ooo . I1ii11iIi11i
  126. if 1 - 1: iIii1I11I1II1 / II111iiii
  127. if 33 - 33: I11i
  128. if 18 - 18: o0oOOo0O0Ooo % iII111i * O0
  129. if 87 - 87: i11iIiiIii
  130. if 93 - 93: I1ii11iIi11i - OoO0O00 % i11iIiiIii . iII111i / iII111i - I1Ii111
  131. if 9 - 9: I1ii11iIi11i / Oo0Ooo - I1IiiI / OoooooooOO / iIii1I11I1II1 - o0oOOo0O0Ooo
  132. if 91 - 91: iII111i % i1IIi % iIii1I11I1II1
  133. if 20 - 20: OOooOOo % Ii1I / Ii1I + Ii1I
  134. if 45 - 45: oO0o - IiII - OoooooooOO - OoO0O00 . II111iiii / O0
  135. if 51 - 51: O0 + iII111i
  136. if 8 - 8: oO0o * OoOoOO00 - Ii1I - OoO0O00 * OOooOOo % I1IiiI
  137. if 48 - 48: O0
  138. if 11 - 11: I11i + OoooooooOO - OoO0O00 / o0oOOo0O0Ooo + Oo0Ooo . II111iiii
  139. if 41 - 41: Ii1I - O0 - O0
  140. if 68 - 68: OOooOOo % I1Ii111
  141. if 88 - 88: iIii1I11I1II1 - ooOoO0o + OOooOOo
  142. if 40 - 40: I1IiiI * Ii1I + OOooOOo % iII111i
  143. if 74 - 74: oO0o - Oo0Ooo + OoooooooOO + I1Ii111 / OoOoOO00
  144. if 23 - 23: O0
  145. if 85 - 85: Ii1I
  146. if 84 - 84: I1IiiI . iIii1I11I1II1 % OoooooooOO + Ii1I % OoooooooOO % OoO0O00
  147. if 42 - 42: OoO0O00 / I11i / o0oOOo0O0Ooo + iII111i / OoOoOO00
  148. if 84 - 84: ooOoO0o * II111iiii + Oo0Ooo
  149. if 53 - 53: iII111i % II111iiii . IiII - iIii1I11I1II1 - IiII * II111iiii
  150. if 77 - 77: iIii1I11I1II1 * OoO0O00
  151. if 95 - 95: I1IiiI + i11iIiiIii
  152. if 6 - 6: ooOoO0o / i11iIiiIii + iII111i * oO0o
  153. if 80 - 80: II111iiii
  154. if 83 - 83: I11i . i11iIiiIii + II111iiii . o0oOOo0O0Ooo * I11i
  155. if 53 - 53: II111iiii
  156. if 31 - 31: OoO0O00
  157. __version__ = '0.41'
  158. if 80 - 80: I1Ii111 . i11iIiiIii - o0oOOo0O0Ooo
  159. if 25 - 25: OoO0O00
  160. if 62 - 62: OOooOOo + O0
  161. if 98 - 98: o0oOOo0O0Ooo
  162. if 51 - 51: Oo0Ooo - oO0o + II111iiii * Ii1I . I11i + oO0o
  163. if 78 - 78: i11iIiiIii / iII111i - Ii1I / OOooOOo + oO0o
  164. if 82 - 82: Ii1I
  165. if 46 - 46: OoooooooOO . i11iIiiIii
  166. if 94 - 94: o0oOOo0O0Ooo * Ii1I / Oo0Ooo / Ii1I
  167. if 87 - 87: Oo0Ooo . IiII
  168. if 75 - 75: ooOoO0o + OoOoOO00 + o0oOOo0O0Ooo * I11i % oO0o . iII111i
  169. if 55 - 55: OOooOOo . I1IiiI
  170. if 61 - 61: Oo0Ooo % IiII . Oo0Ooo
  171. if 100 - 100: I1Ii111 * O0
  172. if 64 - 64: OOooOOo % iIii1I11I1II1 * oO0o
  173. if 79 - 79: O0
  174. if 78 - 78: I1ii11iIi11i + OOooOOo - I1Ii111
  175. if 38 - 38: o0oOOo0O0Ooo - oO0o + iIii1I11I1II1 / OoOoOO00 % Oo0Ooo
  176. if 57 - 57: OoO0O00 / ooOoO0o
  177. if 29 - 29: iIii1I11I1II1 + OoOoOO00 * OoO0O00 * OOooOOo . I1IiiI * I1IiiI
  178. if 7 - 7: IiII * I1Ii111 % Ii1I - o0oOOo0O0Ooo
  179. if 13 - 13: Ii1I . i11iIiiIii
  180. if 56 - 56: I1ii11iIi11i % O0 - I1IiiI
  181. if 100 - 100: Ii1I - O0 % oO0o * OOooOOo + I1IiiI
  182. if 88 - 88: OoooooooOO - OoO0O00 * O0 * OoooooooOO . OoooooooOO
  183. if 33 - 33: I1Ii111 + iII111i * oO0o / iIii1I11I1II1 - I1IiiI
  184. if 54 - 54: I1Ii111 / OOooOOo . oO0o % iII111i
  185. if 57 - 57: i11iIiiIii . I1ii11iIi11i - Ii1I - oO0o + OoOoOO00
  186. if 63 - 63: OoOoOO00 * iII111i
  187. if 69 - 69: O0 . OoO0O00
  188. if 49 - 49: I1IiiI - I11i
  189. if 74 - 74: iIii1I11I1II1 * I1ii11iIi11i + OoOoOO00 / i1IIi / II111iiii . Oo0Ooo
  190. if 62 - 62: OoooooooOO * I1IiiI
  191. if 58 - 58: OoOoOO00 % o0oOOo0O0Ooo
  192. if 50 - 50: I1Ii111 . o0oOOo0O0Ooo
  193. import sys , logging
  194. import struct
  195. import cStringIO
  196. import math
  197. import zipfile
  198. import re
  199. import optparse
  200. import os . path
  201. import binascii
  202. import base64
  203. import traceback
  204. import zlib
  205. import email
  206. import string
  207. if 97 - 97: O0 + OoOoOO00
  208. if 89 - 89: o0oOOo0O0Ooo + OoO0O00 * I11i * Ii1I
  209. try :
  210. if 37 - 37: OoooooooOO - O0 - o0oOOo0O0Ooo
  211. import lxml . etree as ET
  212. except ImportError :
  213. try :
  214. if 77 - 77: OOooOOo * iIii1I11I1II1
  215. import xml . etree . cElementTree as ET
  216. except ImportError :
  217. try :
  218. if 98 - 98: I1IiiI % Ii1I * OoooooooOO
  219. import elementtree . cElementTree as ET
  220. except ImportError :
  221. raise ImportError , "lxml or ElementTree are not installed, " + "see http://codespeak.net/lxml " + "or http://effbot.org/zone/element-index.htm"
  222. if 51 - 51: iIii1I11I1II1 . OoOoOO00 / oO0o + o0oOOo0O0Ooo
  223. if 33 - 33: ooOoO0o . II111iiii % iII111i + o0oOOo0O0Ooo
  224. if 71 - 71: Oo0Ooo % OOooOOo
  225. import thirdparty . olefile as olefile
  226. from thirdparty . prettytable import prettytable
  227. from thirdparty . xglob import xglob
  228. from thirdparty . pyparsing . pyparsing import *
  229. if 98 - 98: I11i % i11iIiiIii % ooOoO0o + Ii1I
  230. if 78 - 78: I1ii11iIi11i % oO0o / iII111i - iIii1I11I1II1
  231. if 69 - 69: I1Ii111
  232. if 11 - 11: I1IiiI
  233. if 16 - 16: Ii1I + IiII * O0 % i1IIi . I1IiiI
  234. if 67 - 67: OoooooooOO / I1IiiI * Ii1I + I11i
  235. OooOo0ooo = 'https://bitbucket.org/decalage/oletools/issues'
  236. o00oo0 = 'Please report this issue on %s' % OooOo0ooo
  237. if 38 - 38: ooOoO0o % II111iiii % I11i / OoO0O00 + OoOoOO00 / i1IIi
  238. if 54 - 54: iIii1I11I1II1 % I1ii11iIi11i - OOooOOo / oO0o - OoO0O00 . I11i
  239. II = 'OLE'
  240. o0Oo0oO0oOO00 = 'OpenXML'
  241. oo00OO0000oO = 'Word2003_XML'
  242. I1II1 = 'MHTML'
  243. if 86 - 86: iIii1I11I1II1 / OoOoOO00 . II111iiii
  244. if 19 - 19: I1ii11iIi11i % OoooooooOO % IiII * o0oOOo0O0Ooo % O0
  245. ooo = {
  246. II : 'OLE:' ,
  247. o0Oo0oO0oOO00 : 'OpX:' ,
  248. oo00OO0000oO : 'XML:' ,
  249. I1II1 : 'MHT:' ,
  250. }
  251. if 27 - 27: ooOoO0o % I1IiiI
  252. if 73 - 73: OOooOOo
  253. if 70 - 70: iIii1I11I1II1
  254. i11ii1iI = 'ActiveMime'
  255. if 22 - 22: OoooooooOO
  256. OOOOOo = "bas"
  257. IiI1iIiIIIii = "cls"
  258. oOoO = "frm"
  259. if 81 - 81: OoOoOO00 - OoOoOO00 . iII111i
  260. if 73 - 73: I11i % i11iIiiIii - I1IiiI
  261. Ii1iI111II1I1 = '{http://schemas.microsoft.com/office/word/2003/wordml}'
  262. if 91 - 91: OOooOOo % OOooOOo - I1IiiI
  263. I1iiii1I = Ii1iI111II1I1 + 'binData'
  264. OOo0 = Ii1iI111II1I1 + 'name'
  265. if 73 - 73: iII111i
  266. if 42 - 42: i11iIiiIii * iIii1I11I1II1 / I1ii11iIi11i . i11iIiiIii % I11i
  267. i1iI = {
  268.  
  269. 'Runs when the Word document is opened' :
  270. ( 'AutoExec' , 'AutoOpen' , 'Document_Open' , 'DocumentOpen' ) ,
  271. 'Runs when the Word document is closed' :
  272. ( 'AutoExit' , 'AutoClose' , 'Document_Close' , 'DocumentBeforeClose' ) ,
  273. 'Runs when the Word document is modified' :
  274. ( 'DocumentChange' , ) ,
  275. 'Runs when a new Word document is created' :
  276. ( 'AutoNew' , 'Document_New' , 'NewDocument' ) ,
  277.  
  278.  
  279. 'Runs when the Excel Workbook is opened' :
  280. ( 'Auto_Open' , 'Workbook_Open' ) ,
  281. 'Runs when the Excel Workbook is closed' :
  282. ( 'Auto_Close' , 'Workbook_Close' ) ,
  283.  
  284.  
  285. }
  286. if 29 - 29: I1IiiI % OOooOOo - I1IiiI / OOooOOo . i1IIi
  287. if 31 - 31: I1Ii111
  288. if 88 - 88: OoO0O00 - ooOoO0o + OOooOOo * I1IiiI % iIii1I11I1II1 + Oo0Ooo
  289. oo000O0OoooO = {
  290.  
  291. 'May read system environment variables' :
  292. ( 'Environ' , ) ,
  293. 'May open a file' :
  294. ( 'Open' , ) ,
  295. 'May write to a file (if combined with Open)' :
  296.  
  297. ( 'Write' , 'Put' , 'Output' , 'Print #' ) ,
  298. 'May read or write a binary file (if combined with Open)' :
  299.  
  300. ( 'Binary' , ) ,
  301. 'May copy a file' :
  302. ( 'FileCopy' , 'CopyFile' ) ,
  303.  
  304. # O0 * OoooooooOO % OOooOOo / IiII - Ii1I / I11i
  305. 'May delete a file' :
  306. ( 'Kill' , ) ,
  307. 'May create a text file' :
  308. ( 'CreateTextFile' , 'ADODB.Stream' , 'WriteText' , 'SaveToFile' ) ,
  309.  
  310. # IiII + ooOoO0o / I1Ii111 . ooOoO0o
  311. 'May run an executable file or a system command' :
  312. ( 'Shell' , 'vbNormal' , 'vbNormalFocus' , 'vbHide' , 'vbMinimizedFocus' , 'vbMaximizedFocus' , 'vbNormalNoFocus' ,
  313. 'vbMinimizedNoFocus' , 'WScript.Shell' , 'Run' ) ,
  314.  
  315. # ooOoO0o
  316. 'May run PowerShell commands' :
  317.  
  318. # oO0o / I1Ii111 / I1ii11iIi11i
  319. # o0oOOo0O0Ooo + II111iiii + OoOoOO00 - ooOoO0o . OoOoOO00
  320. ( 'PowerShell' , 'noexit' , 'ExecutionPolicy' , 'noprofile' ) ,
  321. 'May hide the application' :
  322. ( 'Application.Visible' , 'ShowWindow' , 'SW_HIDE' ) ,
  323. 'May create a directory' :
  324. ( 'MkDir' , ) ,
  325. 'May save the current workbook' :
  326. ( 'ActiveWorkbook.SaveAs' , ) ,
  327. 'May change which directory contains files to open at startup' :
  328.  
  329. ( 'Application.AltStartupPath' , ) ,
  330. 'May create an OLE object' :
  331. ( 'CreateObject' , ) ,
  332. 'May run an application (if combined with CreateObject)' :
  333. ( 'Shell.Application' , ) ,
  334. 'May enumerate application windows (if combined with Shell.Application object)' :
  335. ( 'Windows' , 'FindWindow' ) ,
  336. 'May run code from a DLL' :
  337.  
  338. ( 'Lib' , ) ,
  339. 'May inject code into another process' :
  340. ( 'CreateThread' , 'VirtualAlloc' ,
  341. ) ,
  342. 'May download files from the Internet' :
  343.  
  344. ( 'URLDownloadToFileA' , 'Msxml2.XMLHTTP' , 'Microsoft.XMLHTTP' ,
  345. 'MSXML2.ServerXMLHTTP' ,
  346. 'User-Agent' ,
  347. ) ,
  348. 'May download files from the Internet using PowerShell' :
  349.  
  350. ( 'New-Object System.Net.WebClient' , 'DownloadFile' ) ,
  351. 'May control another application by simulating user keystrokes' :
  352. ( 'SendKeys' , 'AppActivate' ) ,
  353.  
  354. 'May attempt to obfuscate malicious function calls' :
  355. ( 'CallByName' , ) ,
  356.  
  357. 'May attempt to obfuscate specific strings' :
  358.  
  359. ( 'Chr' , 'ChrB' , 'ChrW' , 'StrReverse' , 'Xor' ) ,
  360.  
  361. 'May read or write registry keys' :
  362.  
  363. ( 'RegOpenKeyExA' , 'RegOpenKeyEx' , 'RegCloseKey' ) ,
  364. 'May read registry keys' :
  365.  
  366. ( 'RegQueryValueExA' , 'RegQueryValueEx' ,
  367. 'RegRead' ,
  368. ) ,
  369. 'May detect virtualization' :
  370.  
  371. ( r'SYSTEM\ControlSet001\Services\Disk\Enum' , 'VIRTUAL' , 'VMWARE' , 'VBOX' ) ,
  372. 'May detect Anubis Sandbox' :
  373.  
  374. # Oo0Ooo * I1ii11iIi11i + iIii1I11I1II1 / I1Ii111 / OoO0O00 - OoooooooOO
  375. # iII111i + OoOoOO00
  376. ( 'GetVolumeInformationA' , 'GetVolumeInformation' ,
  377. '1824245000' , r'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId' ,
  378. '76487-337-8429955-22614' , 'andy' , 'sample' , r'C:\exec\exec.exe' , 'popupkiller'
  379. ) ,
  380. 'May detect Sandboxie' :
  381.  
  382. # II111iiii % ooOoO0o % OoOoOO00 - OoooooooOO
  383. ( 'SbieDll.dll' , 'SandboxieControlWndClass' ) ,
  384. 'May detect Sunbelt Sandbox' :
  385.  
  386. ( r'C:\file.exe' , ) ,
  387. 'May detect Norman Sandbox' :
  388.  
  389. ( 'currentuser' , ) ,
  390. 'May detect CW Sandbox' :
  391.  
  392. ( 'Schmidti' , ) ,
  393. 'May detect WinJail Sandbox' :
  394.  
  395. ( 'Afx:400000:0' , ) ,
  396. }
  397. if 80 - 80: OoOoOO00 % I1Ii111
  398. if 55 - 55: i11iIiiIii . I1Ii111 * Ii1I % OoO0O00
  399. if 85 - 85: i11iIiiIii % o0oOOo0O0Ooo
  400. if 38 - 38: oO0o % OoOoOO00 + I1ii11iIi11i . i11iIiiIii
  401. if 53 - 53: i11iIiiIii * iII111i
  402. if 68 - 68: iIii1I11I1II1 * iIii1I11I1II1 . o0oOOo0O0Ooo / II111iiii % Oo0Ooo
  403. i1i11I11 = r'\b(?:http|ftp)s?'
  404. if 10 - 10: O0 - OoooooooOO . OoOoOO00
  405. I1iIii11 = r'(?:xn--[a-zA-Z0-9]{4,20}|[a-zA-Z]{2,20})'
  406. i1 = r'(?:[a-zA-Z0-9\-\.]+\.' + I1iIii11 + ')'
  407. if 90 - 90: I1Ii111 . ooOoO0o / Ii1I - I11i
  408. if 40 - 40: OoooooooOO
  409. I1i1i1 = r'(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])'
  410. OoO0O00O0oo0O = r'(?:' + I1i1i1 + r'\.){3}' + I1i1i1
  411. if 36 - 36: OOooOOo + O0 - Ii1I - O0 % I11i . oO0o
  412. oooiiI = r'(?:' + OoO0O00O0oo0O + '|' + i1 + ')'
  413. oO = r'(?:\:[0-9]{1,5})?'
  414. IIiIi = oooiiI + oO
  415. OOoOooOoOOOoo = r'(?:/[a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~]*)?'
  416. Iiii1iI1i = i1i11I11 + r'\://' + IIiIi + OOoOooOoOOOoo
  417. I1ii1ii11i1I = re . compile ( Iiii1iI1i )
  418. if 58 - 58: iII111i + Oo0Ooo
  419. if 12 - 12: o0oOOo0O0Ooo - I1ii11iIi11i % OoOoOO00 * I11i
  420. if 44 - 44: iII111i % Ii1I
  421. if 41 - 41: i1IIi - I11i - Ii1I
  422. III11I1 = (
  423. ( 'URL' , re . compile ( Iiii1iI1i ) ) ,
  424. ( 'IPv4 address' , re . compile ( OoO0O00O0oo0O ) ) ,
  425.  
  426. ( 'E-mail address' , re . compile ( r'(?i)\b[A-Z0-9._%+-]+@' + oooiiI + '\b' ) ) ,
  427.  
  428. # o0oOOo0O0Ooo * O0 - Ii1I
  429. ( "Executable file name" , re . compile (
  430. r"(?i)\b\w+\.(EXE|PIF|GADGET|MSI|MSP|MSC|VBS|VBE|VB|JSE|JS|WSF|WSC|WSH|WS|BAT|CMD|DLL|SCR|HTA|CPL|CLASS|JAR|PS1XML|PS1|PS2XML|PS2|PSC1|PSC2|SCF|LNK|INF|REG)\b" ) ) ,
  431.  
  432. # oO0o + ooOoO0o . Oo0Ooo % Ii1I
  433. # i11iIiiIii + o0oOOo0O0Ooo / I1ii11iIi11i - OoO0O00 - Ii1I + I1ii11iIi11i
  434. # i11iIiiIii + OoO0O00 . iIii1I11I1II1 * I1Ii111
  435. )
  436. if 15 - 15: i1IIi + OoOoOO00
  437. if 48 - 48: I1IiiI % iII111i / iIii1I11I1II1
  438. Oo0oooO0oO = re . compile ( r'(?:[0-9A-Fa-f]{2}){4,}' )
  439. if 19 - 19: i11iIiiIii + OoooooooOO - Oo0Ooo - I11i
  440. if 21 - 21: O0 % IiII . I1IiiI / II111iiii + IiII
  441. if 53 - 53: oO0o - I1IiiI - oO0o * iII111i
  442. if 71 - 71: O0 - iIii1I11I1II1
  443. if 12 - 12: OOooOOo / o0oOOo0O0Ooo
  444. iiI1I1 = r'(?:[A-Za-z0-9+/]{4}){1,}(?:[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=|[A-Za-z0-9+/][AQgw]==)?'
  445. ooO = re . compile ( '"' + iiI1I1 + '"' )
  446. if 6 - 6: iIii1I11I1II1 . ooOoO0o % o0oOOo0O0Ooo
  447. I1Iii1 = set ( [ 'thisdocument' , 'thisworkbook' , 'test' , 'temp' , 'http' , 'open' , 'exit' ] )
  448. if 30 - 30: OoooooooOO - OoOoOO00
  449. if 75 - 75: iIii1I11I1II1 - Ii1I . Oo0Ooo % i11iIiiIii % I11i
  450. if 55 - 55: iII111i . II111iiii % OoO0O00 * iII111i + ooOoO0o + Ii1I
  451. II1Iiiiii = re . compile ( r'"[0-9A-Za-z]{20,}"' )
  452. if 36 - 36: I1IiiI - I11i
  453. i11i11111i1i = re . compile ( r'[G-Zg-z]' )
  454. if 72 - 72: OOooOOo % I1ii11iIi11i + OoO0O00 / oO0o + IiII
  455. if 10 - 10: I1Ii111 / ooOoO0o + i11iIiiIii / Ii1I
  456. if 74 - 74: OOooOOo + O0 + i1IIi - i1IIi + II111iiii
  457. if 83 - 83: I1ii11iIi11i - I1IiiI + OOooOOo
  458. if 5 - 5: Ii1I
  459. if 46 - 46: IiII
  460. if 45 - 45: ooOoO0o
  461. if 21 - 21: oO0o . I1Ii111 . OOooOOo / Oo0Ooo / I1Ii111
  462. if 17 - 17: OOooOOo / OOooOOo / I11i
  463. if 1 - 1: i1IIi . i11iIiiIii % OOooOOo
  464. if 82 - 82: iIii1I11I1II1 + Oo0Ooo . iIii1I11I1II1 % IiII / Ii1I . Ii1I
  465. if 14 - 14: o0oOOo0O0Ooo . OOooOOo . I11i + OoooooooOO - OOooOOo + IiII
  466. if 9 - 9: Ii1I
  467. oooooOOO000Oo = alphanums + '_'
  468. if 52 - 52: II111iiii % IiII . OoOoOO00 * iIii1I11I1II1
  469. class I111i1II ( str ) :
  470. pass
  471. if 69 - 69: Ii1I * O0 . i11iIiiIii / Ii1I . o0oOOo0O0Ooo
  472. if 63 - 63: I11i + o0oOOo0O0Ooo . II111iiii - I1IiiI
  473. if 52 - 52: o0oOOo0O0Ooo % Oo0Ooo
  474. if 64 - 64: O0 % I11i % O0 * OoO0O00 . oO0o + I1IiiI
  475. if 75 - 75: I11i . OoooooooOO % o0oOOo0O0Ooo * I11i % OoooooooOO
  476. if 13 - 13: IiII / i11iIiiIii % II111iiii % I11i . I1ii11iIi11i
  477. if 8 - 8: OoOoOO00 + Oo0Ooo - II111iiii
  478. if 11 - 11: i1IIi % i11iIiiIii - i1IIi * OoOoOO00
  479. if 39 - 39: I1Ii111
  480. if 86 - 86: I11i * I1IiiI + I11i + II111iiii
  481. if 8 - 8: I1Ii111 - iII111i / ooOoO0o
  482. if 96 - 96: OoOoOO00
  483. if 29 - 29: I1ii11iIi11i / i1IIi . I1IiiI - OoOoOO00 - OoOoOO00 - Ii1I
  484. if 20 - 20: i1IIi % OoO0O00 . I1IiiI / IiII * i11iIiiIii * OOooOOo
  485. if 85 - 85: o0oOOo0O0Ooo . OoOoOO00 / ooOoO0o . O0 % I1Ii111
  486. if 90 - 90: Oo0Ooo % O0 * iIii1I11I1II1 . iII111i
  487. if 8 - 8: ooOoO0o + II111iiii / iII111i / I11i
  488. if 74 - 74: O0 / i1IIi
  489. if 78 - 78: OoooooooOO . OoO0O00 + ooOoO0o - i1IIi
  490. if 31 - 31: OoooooooOO . OOooOOo
  491. if 83 - 83: iII111i . O0 / Oo0Ooo / OOooOOo - II111iiii
  492. if 100 - 100: OoO0O00
  493. if 46 - 46: OoOoOO00 / iIii1I11I1II1 % iII111i . iIii1I11I1II1 * iII111i
  494. if 38 - 38: I1ii11iIi11i - iII111i / O0 . I1Ii111
  495. if 45 - 45: I1Ii111
  496. if 83 - 83: OoOoOO00 . OoooooooOO
  497. if 58 - 58: i11iIiiIii + OoooooooOO % OoooooooOO / IiII / i11iIiiIii
  498. oOOoo = Combine ( WordStart ( oooooOOO000Oo ) + Word ( nums )
  499. + Suppress ( Optional ( Word ( '%&^' , exact = 1 ) ) ) )
  500. oOOoo . setParseAction ( lambda iII1111III1I : int ( iII1111III1I [ 0 ] ) )
  501. if 39 - 39: i1IIi / IiII
  502. oO000oOo00o0o = Combine ( Suppress ( Literal ( '&' ) + Optional ( ( CaselessLiteral ( 'o' ) ) ) ) + Word ( srange ( '[0-7]' ) )
  503. + Suppress ( Optional ( Word ( '%&^' , exact = 1 ) ) ) )
  504. oO000oOo00o0o . setParseAction ( lambda iII1111III1I : int ( iII1111III1I [ 0 ] , base = 8 ) )
  505. if 85 - 85: iII111i + OoooooooOO * iII111i - I1Ii111 % i11iIiiIii
  506. OOo00OoO = Combine ( Suppress ( CaselessLiteral ( '&h' ) ) + Word ( srange ( '[0-9a-fA-F]' ) )
  507. + Suppress ( Optional ( Word ( '%&^' , exact = 1 ) ) ) )
  508. OOo00OoO . setParseAction ( lambda iII1111III1I : int ( iII1111III1I [ 0 ] , base = 16 ) )
  509. if 10 - 10: o0oOOo0O0Ooo / i11iIiiIii
  510. o00 = oOOoo | oO000oOo00o0o | OOo00OoO
  511. if 85 - 85: I1ii11iIi11i . I1Ii111
  512. if 78 - 78: ooOoO0o * I1Ii111 + iIii1I11I1II1 + iIii1I11I1II1 / I1Ii111 . Ii1I
  513. if 97 - 97: ooOoO0o / I1Ii111 % i1IIi % I1ii11iIi11i
  514. if 18 - 18: iIii1I11I1II1 % I11i
  515. if 95 - 95: ooOoO0o + i11iIiiIii * I1Ii111 - i1IIi * I1Ii111 - iIii1I11I1II1
  516. if 75 - 75: OoooooooOO * IiII
  517. if 9 - 9: IiII - II111iiii + O0 / iIii1I11I1II1 / i11iIiiIii
  518. if 39 - 39: IiII * Oo0Ooo + iIii1I11I1II1 - IiII + OOooOOo
  519. if 69 - 69: O0
  520. o0ooO = QuotedString ( '"' , escQuote = '""' )
  521. o0ooO . setParseAction ( lambda iII1111III1I : str ( iII1111III1I [ 0 ] ) )
  522. if 74 - 74: O0 * oO0o - i11iIiiIii + I1Ii111
  523. if 17 - 17: iIii1I11I1II1 . OoooooooOO / I11i % II111iiii % i1IIi / i11iIiiIii
  524. if 58 - 58: Oo0Ooo . II111iiii + oO0o - i11iIiiIii / II111iiii / O0
  525. if 85 - 85: OoOoOO00 + OOooOOo
  526. if 10 - 10: IiII / OoO0O00 + OoOoOO00 / i1IIi
  527. if 27 - 27: Ii1I
  528. if 67 - 67: I1IiiI
  529. if 55 - 55: I1ii11iIi11i - iII111i * o0oOOo0O0Ooo + OoOoOO00 * OoOoOO00 * O0
  530. O000Oo0o = Forward ( )
  531. OoO0O0O0o00 = Forward ( )
  532. if 7 - 7: I1IiiI + OoOoOO00 / IiII
  533. if 79 - 79: OoO0O00 - iIii1I11I1II1 + Ii1I - I1Ii111
  534. if 93 - 93: II111iiii . I1IiiI - Oo0Ooo + OoOoOO00
  535. if 61 - 61: II111iiii
  536. Ii1ii111i1 = Suppress (
  537. Combine ( WordStart ( oooooOOO000Oo ) + CaselessLiteral ( 'Chr' )
  538. + Optional ( CaselessLiteral ( 'B' ) | CaselessLiteral ( 'W' ) ) + Optional ( '$' ) )
  539. + '(' ) + OoO0O0O0o00 + Suppress ( ')' )
  540. Ii1ii111i1 . setParseAction ( lambda iII1111III1I : I111i1II ( chr ( iII1111III1I [ 0 ] ) ) )
  541. if 31 - 31: OOooOOo + O0
  542. if 87 - 87: ooOoO0o
  543. if 45 - 45: OoO0O00 / OoooooooOO - iII111i / Ii1I % IiII
  544. if 83 - 83: I1IiiI . iIii1I11I1II1 - IiII * i11iIiiIii
  545. if 20 - 20: i1IIi * I1Ii111 + II111iiii % o0oOOo0O0Ooo % oO0o
  546. if 13 - 13: Oo0Ooo
  547. oOOo000oOoO0 = Suppress ( CaselessKeyword ( 'Asc' ) + '(' ) + O000Oo0o + Suppress ( ')' )
  548. oOOo000oOoO0 . setParseAction ( lambda iII1111III1I : ord ( iII1111III1I [ 0 ] ) )
  549. if 86 - 86: II111iiii % i11iIiiIii + Ii1I % i11iIiiIii
  550. if 92 - 92: i11iIiiIii - iII111i / ooOoO0o / oO0o
  551. if 43 - 43: II111iiii + OOooOOo + iII111i
  552. if 40 - 40: o0oOOo0O0Ooo
  553. if 67 - 67: oO0o + II111iiii - O0 . oO0o * II111iiii * I11i
  554. if 90 - 90: Ii1I . IiII
  555. OO00O0oOO = Suppress ( CaselessKeyword ( 'Val' ) + '(' ) + O000Oo0o + Suppress ( ')' )
  556. OO00O0oOO . setParseAction ( lambda iII1111III1I : int ( iII1111III1I [ 0 ] . strip ( ) ) )
  557. if 4 - 4: OoooooooOO - i1IIi % Ii1I - OOooOOo * o0oOOo0O0Ooo
  558. if 85 - 85: OoooooooOO * iIii1I11I1II1 . iII111i / OoooooooOO % I1IiiI % O0
  559. if 36 - 36: Ii1I / II111iiii / IiII / IiII + I1ii11iIi11i
  560. if 95 - 95: IiII
  561. if 51 - 51: II111iiii + IiII . i1IIi . I1ii11iIi11i + OoOoOO00 * I1IiiI
  562. OOoOoo0 = Suppress ( CaselessKeyword ( 'StrReverse' ) + '(' ) + O000Oo0o + Suppress ( ')' )
  563. OOoOoo0 . setParseAction ( lambda iII1111III1I : I111i1II ( str ( iII1111III1I [ 0 ] ) [ : : - 1 ] ) )
  564. if 17 - 17: Ii1I + oO0o . OoO0O00 - Oo0Ooo * i11iIiiIii
  565. if 20 - 20: I1IiiI . OoooooooOO % OOooOOo
  566. if 63 - 63: I1IiiI % iIii1I11I1II1
  567. if 39 - 39: iII111i / II111iiii / I1ii11iIi11i % I1IiiI
  568. if 89 - 89: I1Ii111 + OoooooooOO + I1Ii111 * i1IIi + iIii1I11I1II1 % I11i
  569. oOo0oO = Suppress ( CaselessKeyword ( 'Environ' ) + '(' ) + O000Oo0o + Suppress ( ')' )
  570. oOo0oO . setParseAction ( lambda iII1111III1I : I111i1II ( '%%%s%%' % iII1111III1I [ 0 ] ) )
  571. if 5 - 5: OOooOOo - OOooOOo . Oo0Ooo + OoOoOO00 - OOooOOo . oO0o
  572. if 31 - 31: II111iiii - iIii1I11I1II1 - iIii1I11I1II1 % I11i
  573. if 12 - 12: iIii1I11I1II1
  574. if 20 - 20: o0oOOo0O0Ooo / i1IIi
  575. if 71 - 71: OoOoOO00 . i1IIi
  576. if 94 - 94: OOooOOo . I1Ii111
  577. if 84 - 84: O0 . I11i - II111iiii . ooOoO0o / II111iiii
  578. if 47 - 47: OoooooooOO
  579. if 4 - 4: I1IiiI % I11i
  580. I1 = Word ( initChars = alphas , bodyChars = alphanums + '_' )
  581. if 67 - 67: OoO0O00 + oO0o
  582. if 88 - 88: iII111i
  583. if 19 - 19: II111iiii * IiII + Ii1I
  584. if 65 - 65: OOooOOo . I1Ii111 . OoO0O00 . iII111i - OOooOOo
  585. if 19 - 19: i11iIiiIii + iII111i % ooOoO0o
  586. if 14 - 14: OoO0O00 . II111iiii . I11i / Ii1I % I1ii11iIi11i - ooOoO0o
  587. if 67 - 67: I11i - OOooOOo . i1IIi
  588. I1I1iI = Suppress ( '"' ) + Combine ( Word ( hexnums , exact = 2 ) * ( 2 , None ) ) + Suppress ( '"' )
  589. I1I1iI . setParseAction ( lambda iII1111III1I : str ( iII1111III1I [ 0 ] ) )
  590. if 16 - 16: IiII * OoOoOO00 . ooOoO0o / i1IIi . OoO0O00 - i1IIi
  591. I1IiIIi = Suppress ( I1 ) + Suppress ( '(' ) + I1I1iI ( 'hex_string' ) + Suppress ( ')' )
  592. if 42 - 42: O0 . oO0o - o0oOOo0O0Ooo / i1IIi
  593. I1IiIIi . setParseAction ( lambda iII1111III1I : I111i1II ( binascii . a2b_hex ( iII1111III1I . hex_string ) ) )
  594. if 68 - 68: O0 + OoOoOO00 / oO0o - OOooOOo + iIii1I11I1II1 % Ii1I
  595. if 23 - 23: ooOoO0o % o0oOOo0O0Ooo / I11i
  596. if 5 - 5: iIii1I11I1II1
  597. if 72 - 72: oO0o . I1Ii111 / OoOoOO00 + I11i % iIii1I11I1II1
  598. if 42 - 42: I1ii11iIi11i * OoOoOO00 % ooOoO0o - OoOoOO00 . i11iIiiIii - I1Ii111
  599. if 84 - 84: I1Ii111 - I1ii11iIi11i / I11i
  600. if 13 - 13: IiII - Oo0Ooo - ooOoO0o
  601. if 92 - 92: ooOoO0o / OoOoOO00 * OoO0O00 . I11i % II111iiii
  602. O0OoOoO00O = Suppress ( '"' ) + Regex ( iiI1I1 ) + Suppress ( '"' )
  603. O0OoOoO00O . setParseAction ( lambda iII1111III1I : str ( iII1111III1I [ 0 ] ) )
  604. if 96 - 96: I1IiiI % Oo0Ooo . I1ii11iIi11i + OOooOOo
  605. Ii11Iii1i1ii = Suppress ( I1 ) + Suppress ( '(' ) + O0OoOoO00O ( 'base64_string' ) + Suppress ( ')' )
  606. if 26 - 26: II111iiii % i11iIiiIii % iIii1I11I1II1 % I11i * I11i * I1ii11iIi11i
  607. Ii11Iii1i1ii . setParseAction ( lambda iII1111III1I : I111i1II ( binascii . a2b_base64 ( iII1111III1I . base64_string ) ) )
  608. if 24 - 24: II111iiii % I1Ii111 - ooOoO0o + I1IiiI * I1ii11iIi11i
  609. if 2 - 2: Ii1I - IiII
  610. if 83 - 83: oO0o % o0oOOo0O0Ooo % Ii1I - II111iiii * OOooOOo / OoooooooOO
  611. if 18 - 18: OoO0O00 + iIii1I11I1II1 - II111iiii - I1IiiI
  612. def oooOOOO0oooo ( tokens ) :
  613. if 51 - 51: O0 - i1IIi / I1IiiI
  614. if 37 - 37: o0oOOo0O0Ooo % ooOoO0o
  615. O0II11i11II = tokens [ 0 ] [ : : 2 ]
  616. if 29 - 29: Oo0Ooo % OoO0O00 % IiII . o0oOOo0O0Ooo / OoooooooOO * ooOoO0o
  617. if 54 - 54: O0
  618. if 68 - 68: OoO0O00 * o0oOOo0O0Ooo . ooOoO0o % oO0o % I1Ii111
  619. return I111i1II ( '' . join ( O0II11i11II ) )
  620. if 75 - 75: OoOoOO00
  621. if 34 - 34: O0
  622. OooOOOo0 = ( Ii1ii111i1 | OOoOoo0 | oOo0oO | o0ooO | I1IiIIi | Ii11Iii1i1ii )
  623. if 54 - 54: Ii1I - I11i - I1Ii111 . iIii1I11I1II1
  624. O000Oo0o <<= infixNotation ( OooOOOo0 ,
  625. [
  626. ( "+" , 2 , opAssoc . LEFT , oooOOOO0oooo ) ,
  627. ( "&" , 2 , opAssoc . LEFT , oooOOOO0oooo ) ,
  628. ] )
  629. if 79 - 79: Ii1I . OoO0O00
  630. if 40 - 40: o0oOOo0O0Ooo + Oo0Ooo . o0oOOo0O0Ooo % ooOoO0o
  631. if 15 - 15: Ii1I * Oo0Ooo % I1ii11iIi11i * iIii1I11I1II1 - i11iIiiIii
  632. if 60 - 60: I1IiiI * I1Ii111 % OoO0O00 + oO0o
  633. def o0oo ( tokens ) :
  634. if 80 - 80: I1Ii111 * OoOoOO00 * II111iiii - O0 . OoOoOO00 % I1IiiI
  635. if 13 - 13: oO0o . I1IiiI * oO0o + I1IiiI
  636. OoOooo = tokens [ 0 ] [ : : 2 ]
  637. if 74 - 74: iIii1I11I1II1 * IiII % OoOoOO00
  638. if 36 - 36: OoooooooOO - oO0o
  639. if 85 - 85: o0oOOo0O0Ooo . IiII / O0 . o0oOOo0O0Ooo . I1ii11iIi11i . OoO0O00
  640. return sum ( OoOooo )
  641. if 60 - 60: o0oOOo0O0Ooo - OoOoOO00 * Oo0Ooo % Ii1I / II111iiii % OoOoOO00
  642. if 52 - 52: OOooOOo - iII111i * oO0o
  643. Ii1I11I = ( oOOo000oOoO0 | OO00O0oOO | o00 )
  644. if 36 - 36: O0 + Oo0Ooo
  645. OoO0O0O0o00 <<= infixNotation ( Ii1I11I ,
  646. [
  647. ( "+" , 2 , opAssoc . LEFT , o0oo ) ,
  648. ] )
  649. if 5 - 5: Oo0Ooo * OoOoOO00
  650. if 46 - 46: ooOoO0o
  651. if 33 - 33: iII111i - II111iiii * OoooooooOO - Oo0Ooo - OOooOOo
  652. if 84 - 84: I1Ii111 + Oo0Ooo - OoOoOO00 * OoOoOO00
  653. if 61 - 61: OoooooooOO . oO0o . OoooooooOO / Oo0Ooo
  654. if 72 - 72: i1IIi
  655. def OOoo0oo ( data ) :
  656. return data . startswith ( i11ii1iI )
  657. if 58 - 58: oO0o
  658. if 4 - 4: II111iiii . ooOoO0o / I1ii11iIi11i - i11iIiiIii
  659. if 72 - 72: O0 / ooOoO0o + OoooooooOO * iII111i
  660. if 61 - 61: OoooooooOO % II111iiii - I1IiiI % I1ii11iIi11i + i1IIi
  661. if 39 - 39: i1IIi
  662. if 86 - 86: iIii1I11I1II1 + OoOoOO00 . i11iIiiIii - Ii1I
  663. if 51 - 51: OoOoOO00
  664. if 14 - 14: IiII % oO0o % Oo0Ooo - i11iIiiIii
  665. if 53 - 53: Ii1I % Oo0Ooo
  666. if 59 - 59: OOooOOo % iIii1I11I1II1 . i1IIi + II111iiii * IiII
  667. if 41 - 41: Ii1I % I1ii11iIi11i
  668. i1iIiIi1I = re . compile ( r'x' )
  669. if 37 - 37: Ii1I % OoO0O00
  670. if 79 - 79: I1ii11iIi11i + I1IiiI / I1IiiI
  671. def OO0O0ooOOO00 ( data ) :
  672. if 17 - 17: O0 . I1Ii111 . O0 + O0 / Oo0Ooo . ooOoO0o
  673. assert OOoo0oo ( data )
  674. if 62 - 62: I1ii11iIi11i % iII111i * OoO0O00 - i1IIi
  675. if 66 - 66: i11iIiiIii / o0oOOo0O0Ooo - OoooooooOO / i1IIi . i11iIiiIii
  676. if 16 - 16: Oo0Ooo % I1ii11iIi11i + I11i - O0 . iII111i / I1Ii111
  677. if 35 - 35: oO0o / I1Ii111 / II111iiii - iIii1I11I1II1 + II111iiii . I1Ii111
  678. if 81 - 81: iII111i * OOooOOo - I1ii11iIi11i * Ii1I % OoOoOO00 * OoOoOO00
  679. if 59 - 59: iIii1I11I1II1
  680. if 7 - 7: OOooOOo * I1IiiI / o0oOOo0O0Ooo * i11iIiiIii
  681. if 84 - 84: OOooOOo . iII111i
  682. if 8 - 8: Oo0Ooo + II111iiii * OOooOOo * OoOoOO00 * I11i / IiII
  683. if 21 - 21: oO0o / OoooooooOO
  684. if 11 - 11: OOooOOo % Ii1I - i11iIiiIii - oO0o + ooOoO0o + IiII
  685. if 87 - 87: I1Ii111 * i1IIi / I1ii11iIi11i
  686. if 6 - 6: o0oOOo0O0Ooo + Oo0Ooo - OoooooooOO % OOooOOo * OoOoOO00
  687. try :
  688. oOoOIIII = struct . unpack_from ( '<H' , data , offset = 0x1E ) [ 0 ] + 46
  689. logging . debug ( 'Parsing MSO file: data offset = 0x%X' % oOoOIIII )
  690. except :
  691. logging . exception ( 'Unable to parse MSO/ActiveMime file header' )
  692. raise RuntimeError ( 'Unable to parse MSO/ActiveMime file header' )
  693. if 50 - 50: Oo0Ooo % IiII
  694. if 28 - 28: I1ii11iIi11i . i1IIi
  695. if 10 - 10: OoO0O00 / Oo0Ooo
  696. if 15 - 15: iII111i . OoOoOO00 / iII111i * I11i - I1IiiI % I1ii11iIi11i
  697. for oo0OOOOOO0 in ( oOoOIIII , 0x32 , 0x22A ) :
  698. try :
  699. logging . debug ( 'Attempting zlib decompression from MSO file offset 0x%X' % oo0OOOOOO0 )
  700. i11 = zlib . decompress ( data [ oo0OOOOOO0 : ] )
  701. return i11
  702. except :
  703. logging . exception ( 'zlib decompression failed' )
  704. if 20 - 20: OoooooooOO - Oo0Ooo % OoOoOO00 % I11i
  705. if 89 - 89: oO0o / OoooooooOO . iII111i
  706. logging . debug ( 'Looking for potential zlib-compressed blocks in MSO file' )
  707. for I1iiiiii in i1iIiIi1I . finditer ( data ) :
  708. oo0OOOOOO0 = I1iiiiii . start ( )
  709. try :
  710. logging . debug ( 'Attempting zlib decompression from MSO file offset 0x%X' % oo0OOOOOO0 )
  711. i11 = zlib . decompress ( data [ oo0OOOOOO0 : ] )
  712. return i11
  713. except :
  714. logging . exception ( 'zlib decompression failed' )
  715. raise RuntimeError ( 'Unable to decompress data from a MSO/ActiveMime file' )
  716. if 65 - 65: IiII + Oo0Ooo
  717. if 59 - 59: OoooooooOO + I11i . I1Ii111 - O0 % iIii1I11I1II1 / O0
  718. if 88 - 88: Oo0Ooo . O0 % OoooooooOO / OOooOOo
  719. if 89 - 89: II111iiii / oO0o
  720. if 14 - 14: OOooOOo . I1IiiI * ooOoO0o + II111iiii - ooOoO0o + OOooOOo
  721. IIIIIiII1 = set ( string . printable )
  722. if 45 - 45: I1IiiI / iII111i . iII111i
  723. def i1oO ( s ) :
  724. if 30 - 30: Oo0Ooo . OoO0O00
  725. if 57 - 57: I11i . Oo0Ooo + II111iiii
  726. return set ( s ) . issubset ( IIIIIiII1 )
  727. if 43 - 43: I1Ii111 % iII111i
  728. if 69 - 69: iII111i % OoO0O00
  729. if 86 - 86: oO0o / oO0o
  730. if 28 - 28: i11iIiiIii / o0oOOo0O0Ooo . iIii1I11I1II1 / II111iiii
  731. if 72 - 72: OoooooooOO / I1IiiI + Ii1I / OoOoOO00 * Ii1I
  732. if 34 - 34: O0 * O0 % OoooooooOO + iII111i * iIii1I11I1II1 % Ii1I
  733. if 25 - 25: I11i + OoOoOO00 . o0oOOo0O0Ooo % OoOoOO00 * OOooOOo
  734. if 32 - 32: i11iIiiIii - I1Ii111
  735. if 53 - 53: OoooooooOO - IiII
  736. def oOo ( decompressed_current , decompressed_chunk_start ) :
  737. i1i = decompressed_current - decompressed_chunk_start
  738. if 5 - 5: I1ii11iIi11i + O0 + O0 . I1Ii111 - ooOoO0o
  739. if 63 - 63: oO0o
  740. if 71 - 71: i1IIi . Ii1I * iII111i % OoooooooOO + OOooOOo
  741. if 36 - 36: IiII
  742. if 49 - 49: OOooOOo / OoooooooOO / I1IiiI
  743. if 74 - 74: I1Ii111 % I1ii11iIi11i
  744. if 7 - 7: II111iiii
  745. iI = int ( math . ceil ( math . log ( i1i , 2 ) ) )
  746. iI = max ( [ iI , 4 ] )
  747. i1oOOOOOOOoO = 0xFFFF >> iI
  748. I1IIiI = ~ i1oOOOOOOOoO
  749. O0oOOo0o = ( 0xFFFF >> iI ) + 3
  750. return i1oOOOOOOOoO , I1IIiI , iI , O0oOOo0o
  751. if 50 - 50: iII111i . I1ii11iIi11i . OoO0O00 * I11i + II111iiii % i11iIiiIii
  752. if 8 - 8: ooOoO0o * O0
  753. def OOoO ( compressed_container ) :
  754. if 18 - 18: iIii1I11I1II1 + Oo0Ooo - OOooOOo + OoooooooOO * OoooooooOO
  755. if 41 - 41: ooOoO0o . Oo0Ooo + I1IiiI
  756. if 100 - 100: Ii1I + OoO0O00
  757. if 73 - 73: i1IIi - I1Ii111 % ooOoO0o / OoO0O00
  758. if 40 - 40: I1ii11iIi11i * ooOoO0o - I1IiiI / IiII / i11iIiiIii
  759. if 83 - 83: I1ii11iIi11i / I1Ii111 - i11iIiiIii . iIii1I11I1II1 + Oo0Ooo
  760. if 59 - 59: O0 % Oo0Ooo
  761. if 92 - 92: Ii1I % iII111i / I1ii11iIi11i % I1ii11iIi11i * I1IiiI
  762. if 74 - 74: O0 . I1IiiI % OoO0O00 % IiII
  763. if 87 - 87: oO0o - i11iIiiIii
  764. if 78 - 78: i11iIiiIii / iIii1I11I1II1 - o0oOOo0O0Ooo
  765. if 23 - 23: I11i
  766. if 40 - 40: o0oOOo0O0Ooo - II111iiii / Oo0Ooo
  767. if 14 - 14: I1ii11iIi11i
  768. if 5 - 5: o0oOOo0O0Ooo . iIii1I11I1II1 % iIii1I11I1II1
  769. if 56 - 56: OoooooooOO - I11i - i1IIi
  770. if 8 - 8: I1Ii111 / OOooOOo . I1IiiI + I1ii11iIi11i / i11iIiiIii
  771. if 31 - 31: ooOoO0o - iIii1I11I1II1 + iII111i . Oo0Ooo / IiII % iIii1I11I1II1
  772. if 6 - 6: IiII * i11iIiiIii % iIii1I11I1II1 % i11iIiiIii + o0oOOo0O0Ooo / i1IIi
  773. if 53 - 53: I11i + iIii1I11I1II1
  774. if 70 - 70: I1ii11iIi11i
  775. if 67 - 67: OoooooooOO
  776. if 29 - 29: O0 - i11iIiiIii - II111iiii + OOooOOo * IiII
  777. if 2 - 2: i1IIi - ooOoO0o + I1IiiI . o0oOOo0O0Ooo * o0oOOo0O0Ooo / OoOoOO00
  778. if 93 - 93: i1IIi
  779. if 53 - 53: OoooooooOO + Oo0Ooo + oO0o
  780. I1I111iI = ''
  781. iIiI1IIiii11 = 0
  782. if 33 - 33: iIii1I11I1II1 / iII111i - I1IiiI * I11i
  783. o0o00oO0oo000 = ord ( compressed_container [ iIiI1IIiii11 ] )
  784. if o0o00oO0oo000 != 0x01 :
  785. raise ValueError ( 'invalid signature byte {0:02X}' . format ( o0o00oO0oo000 ) )
  786. if 89 - 89: OoO0O00 + IiII * I1Ii111
  787. iIiI1IIiii11 += 1
  788. if 28 - 28: OoooooooOO . oO0o % I1ii11iIi11i / i1IIi / OOooOOo
  789. if 36 - 36: o0oOOo0O0Ooo + I11i - IiII + iIii1I11I1II1 + OoooooooOO
  790. if 4 - 4: II111iiii . I11i + Ii1I * I1Ii111 . ooOoO0o
  791. while iIiI1IIiii11 < len ( compressed_container ) :
  792. if 87 - 87: OoOoOO00 / OoO0O00 / i11iIiiIii
  793. oO0OO = iIiI1IIiii11
  794. if 88 - 88: OoOoOO00 - i11iIiiIii % o0oOOo0O0Ooo * I11i + I1ii11iIi11i
  795. Oo = struct . unpack ( "<H" , compressed_container [ oO0OO : oO0OO + 2 ] ) [ 0 ]
  796. if 40 - 40: OoOoOO00 % OoO0O00
  797. if 62 - 62: o0oOOo0O0Ooo
  798. I1i111i = ( Oo & 0x0FFF ) + 3
  799. if 42 - 42: I1ii11iIi11i / i1IIi % OoOoOO00
  800. I11iiIIII1I1 = ( Oo >> 12 ) & 0x07
  801. if I11iiIIII1I1 != 0b011 :
  802. raise ValueError ( 'Invalid CompressedChunkSignature in VBA compressed stream' )
  803. if 38 - 38: I1Ii111 % OOooOOo - OoooooooOO
  804. oOo0OOoooO = ( Oo >> 15 ) & 0x01
  805. logging . debug ( "chunk size = {0}, compressed flag = {1}" . format ( I1i111i , oOo0OOoooO ) )
  806. if 26 - 26: o0oOOo0O0Ooo * IiII . i1IIi
  807. if 59 - 59: O0 + i1IIi - o0oOOo0O0Ooo
  808. if 62 - 62: i11iIiiIii % OOooOOo . IiII . OOooOOo
  809. if 84 - 84: i11iIiiIii * OoO0O00
  810. if 18 - 18: OOooOOo - Ii1I - OoOoOO00 / I1Ii111 - O0
  811. if 30 - 30: O0 + I1ii11iIi11i + II111iiii
  812. if oOo0OOoooO == 1 and I1i111i > 4098 :
  813. raise ValueError ( 'CompressedChunkSize > 4098 but CompressedChunkFlag == 1' )
  814. if oOo0OOoooO == 0 and I1i111i != 4098 :
  815. raise ValueError ( 'CompressedChunkSize != 4098 but CompressedChunkFlag == 0' )
  816. if 14 - 14: o0oOOo0O0Ooo / OOooOOo - iIii1I11I1II1 - oO0o % ooOoO0o
  817. if 49 - 49: ooOoO0o * oO0o / o0oOOo0O0Ooo / Oo0Ooo * iIii1I11I1II1
  818. if 57 - 57: OoOoOO00 - oO0o / ooOoO0o % i11iIiiIii
  819. if oO0OO + I1i111i > len ( compressed_container ) :
  820. logging . warning ( 'Chunk size is larger than remaining compressed data' )
  821. I11 = min ( [ len ( compressed_container ) , oO0OO + I1i111i ] )
  822. if 100 - 100: I1ii11iIi11i + i11iIiiIii - i1IIi
  823. iIiI1IIiii11 = oO0OO + 2
  824. if 29 - 29: o0oOOo0O0Ooo / i11iIiiIii / I1IiiI % oO0o % i11iIiiIii
  825. if oOo0OOoooO == 0 :
  826. if 18 - 18: OOooOOo + I1Ii111
  827. if 80 - 80: oO0o + o0oOOo0O0Ooo * Ii1I + OoO0O00
  828. if 75 - 75: I11i / o0oOOo0O0Ooo / OOooOOo / IiII % ooOoO0o + II111iiii
  829. I1I111iI += compressed_container [ iIiI1IIiii11 : iIiI1IIiii11 + 4096 ]
  830. iIiI1IIiii11 += 4096
  831. else :
  832. if 4 - 4: iII111i - Oo0Ooo - IiII - I11i % i11iIiiIii / OoO0O00
  833. if 50 - 50: ooOoO0o + i1IIi
  834. i11IiIIi11I = len ( I1I111iI )
  835. while iIiI1IIiii11 < I11 :
  836. if 78 - 78: IiII
  837. if 83 - 83: iIii1I11I1II1 % OoOoOO00 % o0oOOo0O0Ooo % I1Ii111 . I1ii11iIi11i % O0
  838. if 47 - 47: o0oOOo0O0Ooo
  839. if 66 - 66: I1IiiI - IiII
  840. iiIii = ord ( compressed_container [ iIiI1IIiii11 ] )
  841. iIiI1IIiii11 += 1
  842. for iIiIii1ii in xrange ( 0 , 8 ) :
  843. if 8 - 8: OoO0O00 + OoOoOO00 . iIii1I11I1II1 % O0
  844. if iIiI1IIiii11 >= I11 :
  845. break
  846. if 43 - 43: I1ii11iIi11i - iII111i
  847. if 70 - 70: iII111i / OOooOOo % ooOoO0o - Ii1I
  848. i1II11Iii1I = ( iiIii >> iIiIii1ii ) & 1
  849. if 92 - 92: OOooOOo % IiII % OoOoOO00
  850. if i1II11Iii1I == 0 :
  851. if 4 - 4: OoOoOO00 + Ii1I / oO0o
  852. I1I111iI += compressed_container [ iIiI1IIiii11 ]
  853. iIiI1IIiii11 += 1
  854. else :
  855. if 13 - 13: iII111i
  856. o0OOOOO0O = struct . unpack ( "<H" , compressed_container [ iIiI1IIiii11 : iIiI1IIiii11 + 2 ] ) [ 0 ]
  857. if 35 - 35: Ii1I - Ii1I + i1IIi - O0 - I1Ii111
  858. if 58 - 58: OoOoOO00 - iII111i - OoooooooOO
  859. i1oOOOOOOOoO , I1IIiI , iI , O0oOOo0o = oOo (
  860. len ( I1I111iI ) , i11IiIIi11I )
  861. o00ii111Iiii = ( o0OOOOO0O & i1oOOOOOOOoO ) + 3
  862. oo0oO0o0 = o0OOOOO0O & I1IIiI
  863. Iii1Ii = 16 - iI
  864. oOoOIIII = ( oo0oO0o0 >> Iii1Ii ) + 1
  865. if 30 - 30: O0 - iII111i % Oo0Ooo
  866. O0Oo = len ( I1I111iI ) - oOoOIIII
  867. for iIIiI11i in xrange ( O0Oo , O0Oo + o00ii111Iiii ) :
  868. I1I111iI += I1I111iI [ iIIiI11i ]
  869. iIiI1IIiii11 += 2
  870. return I1I111iI
  871. if 100 - 100: O0 . I11i . OoO0O00 + O0 * oO0o
  872. if 42 - 42: oO0o % OoooooooOO + o0oOOo0O0Ooo
  873. def ooOO0o ( ole , vba_root , project_path , dir_path ) :
  874. if 51 - 51: Oo0Ooo - I1ii11iIi11i * I11i
  875. ii1111Ii1i = ole . openstream ( project_path )
  876. if 48 - 48: O0 * Ii1I - O0 / Ii1I + OoOoOO00
  877. if 52 - 52: OoO0O00 % Ii1I * II111iiii
  878. if 4 - 4: I11i % O0 - OoooooooOO + ooOoO0o . oO0o % II111iiii
  879. if 9 - 9: II111iiii * II111iiii . i11iIiiIii * iIii1I11I1II1
  880. if 18 - 18: OoO0O00 . II111iiii % OoOoOO00 % Ii1I
  881. if 87 - 87: iIii1I11I1II1 . OoooooooOO * OoOoOO00
  882. if 100 - 100: OoO0O00 / i1IIi - I1IiiI % Ii1I - iIii1I11I1II1
  883. if 17 - 17: I11i / o0oOOo0O0Ooo % Oo0Ooo
  884. if 71 - 71: IiII . I1Ii111 . OoO0O00
  885. if 68 - 68: i11iIiiIii % oO0o * OoO0O00 * IiII * II111iiii + O0
  886. if 66 - 66: I11i % I1ii11iIi11i % OoooooooOO
  887. if 34 - 34: o0oOOo0O0Ooo / iII111i % O0 . OoO0O00 . i1IIi
  888. if 29 - 29: O0 . I1Ii111
  889. if 66 - 66: oO0o * iIii1I11I1II1 % iIii1I11I1II1 * IiII - ooOoO0o - IiII
  890. if 70 - 70: I1Ii111 + oO0o
  891. if 93 - 93: I1Ii111 + Ii1I
  892. if 33 - 33: O0
  893. if 78 - 78: O0 / II111iiii * OoO0O00
  894. if 50 - 50: OoooooooOO - iIii1I11I1II1 + i1IIi % I1Ii111 - iIii1I11I1II1 % O0
  895. if 58 - 58: IiII + iIii1I11I1II1
  896. if 65 - 65: II111iiii - I1Ii111 % o0oOOo0O0Ooo - OoOoOO00 * iII111i + Ii1I
  897. if 79 - 79: ooOoO0o . OoOoOO00 % I1Ii111 - Oo0Ooo
  898. if 69 - 69: ooOoO0o - o0oOOo0O0Ooo . ooOoO0o
  899. if 9 - 9: oO0o % i11iIiiIii / Oo0Ooo
  900. if 20 - 20: oO0o * O0 + I11i - OoooooooOO . I11i
  901. if 60 - 60: o0oOOo0O0Ooo . o0oOOo0O0Ooo / iII111i
  902. if 45 - 45: O0 . i11iIiiIii % iII111i . OoOoOO00 % IiII % iIii1I11I1II1
  903. if 58 - 58: iIii1I11I1II1 . OoOoOO00 - i11iIiiIii * iIii1I11I1II1 % i11iIiiIii / I1IiiI
  904. if 80 - 80: I1ii11iIi11i / iIii1I11I1II1 % OoOoOO00
  905. oO000o0Oo00 = { }
  906. if 77 - 77: iIii1I11I1II1 + OoO0O00 . I1ii11iIi11i % OoO0O00
  907. for o0O in ii1111Ii1i :
  908. o0O = o0O . strip ( )
  909. if '=' in o0O :
  910. if 78 - 78: OoOoOO00
  911. iI1 , I1iIII1IiiI = o0O . split ( '=' , 1 )
  912. if 96 - 96: I1IiiI % i1IIi . o0oOOo0O0Ooo . O0
  913. if 37 - 37: i1IIi - OOooOOo % OoooooooOO / OOooOOo % ooOoO0o
  914. if 48 - 48: i11iIiiIii % oO0o
  915. if 29 - 29: iII111i + i11iIiiIii % I11i
  916. I1iIII1IiiI = I1iIII1IiiI . lower ( )
  917. if iI1 == 'Document' :
  918. if 93 - 93: OoOoOO00 % iIii1I11I1II1
  919. I1iIII1IiiI = I1iIII1IiiI . split ( '/' , 1 ) [ 0 ]
  920. oO000o0Oo00 [ I1iIII1IiiI ] = IiI1iIiIIIii
  921. elif iI1 == 'Module' :
  922. oO000o0Oo00 [ I1iIII1IiiI ] = OOOOOo
  923. elif iI1 == 'Class' :
  924. oO000o0Oo00 [ I1iIII1IiiI ] = IiI1iIiIIIii
  925. elif iI1 == 'BaseClass' :
  926. oO000o0Oo00 [ I1iIII1IiiI ] = oOoO
  927. if 90 - 90: I1IiiI - OOooOOo / Ii1I / O0 / I11i
  928. if 87 - 87: OoOoOO00 / IiII + iIii1I11I1II1
  929. oo0O0o = ole . openstream ( dir_path ) . read ( )
  930. if 13 - 13: iIii1I11I1II1 . OoOoOO00 * I1IiiI / oO0o * Ii1I
  931. def O00o ( name , expected , value ) :
  932. if expected != value :
  933. logging . error ( "invalid value for {0} expected {1:04X} got {2:04X}" . format ( name , expected , value ) )
  934. if 86 - 86: I1ii11iIi11i * II111iiii * I11i
  935. oO0Oo = cStringIO . StringIO ( OOoO ( oo0O0o ) )
  936. if 58 - 58: ooOoO0o
  937. if 5 - 5: i11iIiiIii % OoOoOO00 - Ii1I
  938. oOo0 = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  939. O00o ( 'PROJECTSYSKIND_Id' , 0x0001 , oOo0 )
  940. oOoOo = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  941. O00o ( 'PROJECTSYSKIND_Size' , 0x0004 , oOoOo )
  942. OoO00O0OOO = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  943. if OoO00O0OOO == 0x00 :
  944. logging . debug ( "16-bit Windows" )
  945. elif OoO00O0OOO == 0x01 :
  946. logging . debug ( "32-bit Windows" )
  947. elif OoO00O0OOO == 0x02 :
  948. logging . debug ( "Macintosh" )
  949. elif OoO00O0OOO == 0x03 :
  950. logging . debug ( "64-bit Windows" )
  951. else :
  952. logging . error ( "invalid PROJECTSYSKIND_SysKind {0:04X}" . format ( OoO00O0OOO ) )
  953. if 87 - 87: IiII
  954. if 34 - 34: OoO0O00
  955. I11i11i1 = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  956. O00o ( 'PROJECTLCID_Id' , 0x0002 , I11i11i1 )
  957. OOO = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  958. O00o ( 'PROJECTLCID_Size' , 0x0004 , OOO )
  959. ii1i1iiI = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  960. O00o ( 'PROJECTLCID_Lcid' , 0x409 , ii1i1iiI )
  961. if 94 - 94: i1IIi * i1IIi % II111iiii + OOooOOo
  962. if 28 - 28: I1IiiI
  963. I11o0000o0Oo = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  964. O00o ( 'PROJECTLCIDINVOKE_Id' , 0x0014 , I11o0000o0Oo )
  965. ooo0O0OOo0OoO = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  966. O00o ( 'PROJECTLCIDINVOKE_Size' , 0x0004 , ooo0O0OOo0OoO )
  967. Ii1i1 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  968. O00o ( 'PROJECTLCIDINVOKE_LcidInvoke' , 0x409 , Ii1i1 )
  969. if 65 - 65: oO0o + I1ii11iIi11i / OOooOOo
  970. if 85 - 85: iIii1I11I1II1 / OoooooooOO % II111iiii
  971. IiIIi11i111 = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  972. O00o ( 'PROJECTCODEPAGE_Id' , 0x0003 , IiIIi11i111 )
  973. oooo = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  974. O00o ( 'PROJECTCODEPAGE_Size' , 0x0002 , oooo )
  975. iiiIIIii = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  976. if 93 - 93: iIii1I11I1II1 + I1IiiI + i11iIiiIii
  977. if 74 - 74: I11i / II111iiii + ooOoO0o * iIii1I11I1II1 - I1Ii111 - OoO0O00
  978. OoOoO0OooOOo = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  979. O00o ( 'PROJECTNAME_Id' , 0x0004 , OoOoO0OooOOo )
  980. oOIIi = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  981. if oOIIi < 1 or oOIIi > 128 :
  982. logging . error ( "PROJECTNAME_SizeOfProjectName value not in range: {0}" . format ( oOIIi ) )
  983. I1Ii1IIiI11i1 = oO0Oo . read ( oOIIi )
  984. if 45 - 45: II111iiii % ooOoO0o % IiII + I1ii11iIi11i . i1IIi . OoOoOO00
  985. if 87 - 87: ooOoO0o . O0 % I1Ii111 + I1ii11iIi11i + Ii1I % iIii1I11I1II1
  986. ii11iIIi = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  987. O00o ( 'PROJECTDOCSTRING_Id' , 0x0005 , ii11iIIi )
  988. i1II1II1iii1i = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  989. if oOIIi > 2000 :
  990. logging . error (
  991. "PROJECTDOCSTRING_SizeOfDocString value not in range: {0}" . format ( i1II1II1iii1i ) )
  992. O0OO0oOO = oO0Oo . read ( i1II1II1iii1i )
  993. oo = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  994. O00o ( 'PROJECTDOCSTRING_Reserved' , 0x0040 , oo )
  995. ooOoO0O0 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  996. if ooOoO0O0 % 2 != 0 :
  997. logging . error ( "PROJECTDOCSTRING_SizeOfDocStringUnicode is not even" )
  998. iI111i11iI1 = oO0Oo . read ( ooOoO0O0 )
  999. if 2 - 2: OoOoOO00 + I1Ii111 + OoooooooOO . i1IIi
  1000. if 19 - 19: iII111i - o0oOOo0O0Ooo - Ii1I - OoOoOO00 . iII111i . I1Ii111
  1001. i11I1I = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1002. O00o ( 'PROJECTHELPFILEPATH_Id' , 0x0006 , i11I1I )
  1003. oo0ooooo00o = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1004. if oo0ooooo00o > 260 :
  1005. logging . error (
  1006. "PROJECTHELPFILEPATH_SizeOfHelpFile1 value not in range: {0}" . format ( oo0ooooo00o ) )
  1007. OoOo = oO0Oo . read ( oo0ooooo00o )
  1008. i111i1iIi1 = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1009. O00o ( 'PROJECTHELPFILEPATH_Reserved' , 0x003D , i111i1iIi1 )
  1010. OoO0oO = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1011. if OoO0oO != oo0ooooo00o :
  1012. logging . error ( "PROJECTHELPFILEPATH_SizeOfHelpFile1 does not equal PROJECTHELPFILEPATH_SizeOfHelpFile2" )
  1013. Ii = oO0Oo . read ( OoO0oO )
  1014. if Ii != OoOo :
  1015. logging . error ( "PROJECTHELPFILEPATH_HelpFile1 does not equal PROJECTHELPFILEPATH_HelpFile2" )
  1016. if 20 - 20: o0oOOo0O0Ooo * ooOoO0o
  1017. if 10 - 10: I11i - Oo0Ooo
  1018. ooOOooo0ooo00 = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1019. O00o ( 'PROJECTHELPCONTEXT_Id' , 0x0007 , ooOOooo0ooo00 )
  1020. oooOo = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1021. O00o ( 'PROJECTHELPCONTEXT_Size' , 0x0004 , oooOo )
  1022. oo0oo0O0 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1023. if 18 - 18: iIii1I11I1II1 + OOooOOo + iIii1I11I1II1 . I1ii11iIi11i + I1Ii111 . ooOoO0o
  1024. if 7 - 7: I1ii11iIi11i + iIii1I11I1II1 * I11i * I11i / II111iiii - Ii1I
  1025. oOOOo0o = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1026. O00o ( 'PROJECTLIBFLAGS_Id' , 0x0008 , oOOOo0o )
  1027. iiiii11I1 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1028. O00o ( 'PROJECTLIBFLAGS_Size' , 0x0004 , iiiii11I1 )
  1029. Ii1 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1030. O00o ( 'PROJECTLIBFLAGS_ProjectLibFlags' , 0x0000 , Ii1 )
  1031. if 77 - 77: OOooOOo / II111iiii + IiII + ooOoO0o - i11iIiiIii
  1032. if 44 - 44: I1IiiI + OoOoOO00 + I1ii11iIi11i . I1IiiI * OoOoOO00 % iIii1I11I1II1
  1033. o0OO0OOO0O = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1034. O00o ( 'PROJECTVERSION_Id' , 0x0009 , o0OO0OOO0O )
  1035. Iii1I = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1036. O00o ( 'PROJECTVERSION_Reserved' , 0x0004 , Iii1I )
  1037. oOoOOOOoOO0o = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1038. ii = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1039. if 47 - 47: I1Ii111 - OOooOOo / ooOoO0o - Oo0Ooo + iII111i - iIii1I11I1II1
  1040. if 68 - 68: Ii1I - oO0o + Oo0Ooo
  1041. i11Iii1Ii1i1 = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1042. O00o ( 'PROJECTCONSTANTS_Id' , 0x000C , i11Iii1Ii1i1 )
  1043. i1iIi1IIiIII1 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1044. if i1iIi1IIiIII1 > 1015 :
  1045. logging . error (
  1046. "PROJECTCONSTANTS_SizeOfConstants value not in range: {0}" . format ( i1iIi1IIiIII1 ) )
  1047. i1Ii11I1II = oO0Oo . read ( i1iIi1IIiIII1 )
  1048. oOOOoo0o = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1049. O00o ( 'PROJECTCONSTANTS_Reserved' , 0x003C , oOOOoo0o )
  1050. iiiI1IiIIii = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1051. if iiiI1IiIIii % 2 != 0 :
  1052. logging . error ( "PROJECTCONSTANTS_SizeOfConstantsUnicode is not even" )
  1053. IIIIiii = oO0Oo . read ( iiiI1IiIIii )
  1054. if 26 - 26: OoooooooOO - ooOoO0o * i11iIiiIii + O0 * oO0o
  1055. if 87 - 87: Oo0Ooo + O0 - I11i * iIii1I11I1II1 . I1Ii111 % o0oOOo0O0Ooo
  1056. Oo0oo0oOO0oOo = None
  1057. while True :
  1058. Oo0oo0oOO0oOo = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1059. logging . debug ( "reference type = {0:04X}" . format ( Oo0oo0oOO0oOo ) )
  1060. if Oo0oo0oOO0oOo == 0x000F :
  1061. break
  1062. if 18 - 18: II111iiii + OoOoOO00 - I1Ii111 + OoO0O00 / ooOoO0o % IiII
  1063. if Oo0oo0oOO0oOo == 0x0016 :
  1064. if 94 - 94: iII111i % ooOoO0o . oO0o
  1065. O00oOo0O0o00O = Oo0oo0oOO0oOo
  1066. ooo0oo00O00Oo = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1067. OOO000000OOO0 = oO0Oo . read ( ooo0oo00O00Oo )
  1068. ooOoOOoooO000 = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1069. O00o ( 'REFERENCE_Reserved' , 0x003E , ooOoOOoooO000 )
  1070. OoO0o000oOo = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1071. Oo00OO00o0oO = oO0Oo . read ( OoO0o000oOo )
  1072. continue
  1073. if 43 - 43: Oo0Ooo . I1Ii111
  1074. if Oo0oo0oOO0oOo == 0x0033 :
  1075. if 12 - 12: I1Ii111 + OOooOOo + I11i . IiII / Ii1I
  1076. i1I = Oo0oo0oOO0oOo
  1077. oOOoooO0O0 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1078. ii1 = oO0Oo . read ( oOOoooO0O0 )
  1079. continue
  1080. if 69 - 69: I11i % O0 / I1IiiI . I1Ii111 / ooOoO0o
  1081. if Oo0oo0oOO0oOo == 0x002F :
  1082. if 94 - 94: I11i - II111iiii . I1IiiI - Oo0Ooo + I1ii11iIi11i * I1ii11iIi11i
  1083. I1iiIiiii1111 = Oo0oo0oOO0oOo
  1084. I1ii1i11i = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1085. Oooooo0O00o = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1086. II11ii1 = oO0Oo . read ( Oooooo0O00o )
  1087. ii1II1II = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1088. O00o ( 'REFERENCECONTROL_Reserved1' , 0x0000 , ii1II1II )
  1089. i11i11II11i = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1090. O00o ( 'REFERENCECONTROL_Reserved2' , 0x0000 , i11i11II11i )
  1091. if 9 - 9: OoOoOO00 - I1ii11iIi11i * ooOoO0o . ooOoO0o - I1IiiI
  1092. OOooOooo0OOo0 = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1093. if OOooOooo0OOo0 == 0x0016 :
  1094. oo0o0OoOO0o0 = Oo0oo0oOO0oOo
  1095. III1III11II = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1096. iIi1iI = oO0Oo . read (
  1097. III1III11II )
  1098. OO0Oo = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1099. O00o ( 'REFERENCECONTROL_NameRecordExtended_Reserved' , 0x003E ,
  1100. OO0Oo )
  1101. IIiiiiiIiIIi = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1102. iiIiiIi1 = oO0Oo . read (
  1103. IIiiiiiIiIIi )
  1104. I1Ii11i = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1105. else :
  1106. I1Ii11i = OOooOooo0OOo0
  1107. if 19 - 19: IiII - o0oOOo0O0Ooo . iIii1I11I1II1 . OoOoOO00 / OOooOOo
  1108. O00o ( 'REFERENCECONTROL_Reserved3' , 0x0030 , I1Ii11i )
  1109. OOO0O00Oo = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1110. ii1oOOO0ooOO = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1111. i11IiI1iiI11 = oO0Oo . read ( ii1oOOO0ooOO )
  1112. OOoOOOO00 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1113. IIii1III = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1114. ooooOoo0OO = oO0Oo . read ( 16 )
  1115. Oo0 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1116. continue
  1117. if 96 - 96: I11i % Ii1I % oO0o * I11i / OOooOOo
  1118. if Oo0oo0oOO0oOo == 0x000D :
  1119. if 13 - 13: iIii1I11I1II1 - OoO0O00
  1120. ooo0 = Oo0oo0oOO0oOo
  1121. i1iiIIiiiII = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1122. Ii1I1 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1123. OO0ooO0 = oO0Oo . read ( Ii1I1 )
  1124. OoOooOO0oOOo0O = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1125. O00o ( 'REFERENCEREGISTERED_Reserved1' , 0x0000 , OoOooOO0oOOo0O )
  1126. I1II = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1127. O00o ( 'REFERENCEREGISTERED_Reserved2' , 0x0000 , I1II )
  1128. continue
  1129. if 9 - 9: Oo0Ooo % OoooooooOO - Ii1I
  1130. if Oo0oo0oOO0oOo == 0x000E :
  1131. if 43 - 43: OoO0O00 % OoO0O00
  1132. IIiii11ii1i = Oo0oo0oOO0oOo
  1133. II1iI1IIi = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1134. Ii11iiI1 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1135. oO0O = oO0Oo . read ( Ii11iiI1 )
  1136. OOoooO00o0o = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1137. I1ii1Ii1 = oO0Oo . read ( OOoooO00o0o )
  1138. OoO = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1139. oOiI111I1III = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1140. continue
  1141. if 36 - 36: I11i % OOooOOo
  1142. logging . error ( 'invalid or unknown check Id {0:04X}' . format ( Oo0oo0oOO0oOo ) )
  1143. sys . exit ( 0 )
  1144. if 72 - 72: I1IiiI / iII111i - O0 + I11i
  1145. o0 = Oo0oo0oOO0oOo
  1146. O00o ( 'PROJECTMODULES_Id' , 0x000F , o0 )
  1147. iIIIIi = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1148. O00o ( 'PROJECTMODULES_Size' , 0x0002 , iIIIIi )
  1149. i1I11ii = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1150. o0ooO00O0O = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1151. O00o ( 'PROJECTMODULES_ProjectCookieRecord_Id' , 0x0013 , o0ooO00O0O )
  1152. iiiI1iI1 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1153. O00o ( 'PROJECTMODULES_ProjectCookieRecord_Size' , 0x0002 , iiiI1iI1 )
  1154. I1oOoO0OOO00O = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1155. if 73 - 73: o0oOOo0O0Ooo % OoO0O00 + IiII + I1IiiI
  1156. logging . debug ( "parsing {0} modules" . format ( i1I11ii ) )
  1157. for OoOO00 in xrange ( 0 , i1I11ii ) :
  1158. O0O00OoOoOOo = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1159. O00o ( 'MODULENAME_Id' , 0x0019 , O0O00OoOoOOo )
  1160. o0o0oo0 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1161. II1IIi1iII1i = oO0Oo . read ( o0o0oo0 )
  1162. if 26 - 26: O0
  1163. iiiIi = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1164. if iiiIi == 0x0047 :
  1165. ooiiI1ii = iiiIi
  1166. O0OooOO = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1167. i1i1 = oO0Oo . read ( O0OooOO )
  1168. iiiIi = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1169. if iiiIi == 0x001A :
  1170. o0oOoOo0 = iiiIi
  1171. III1IiI1i1i = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1172. o0OOOOOo0 = oO0Oo . read ( III1IiI1i1i )
  1173. oooOoO = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1174. O00o ( 'MODULESTREAMNAME_Reserved' , 0x0032 , oooOoO )
  1175. O0Oo0 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1176. iIIIi1IiI11I1 = oO0Oo . read ( O0Oo0 )
  1177. iiiIi = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1178. if iiiIi == 0x001C :
  1179. O0Ooo000 = iiiIi
  1180. O00o ( 'MODULEDOCSTRING_Id' , 0x001C , O0Ooo000 )
  1181. IIi11iI1Iii = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1182. IiIi1i = oO0Oo . read ( IIi11iI1Iii )
  1183. i11ii = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1184. O00o ( 'MODULEDOCSTRING_Reserved' , 0x0048 , i11ii )
  1185. oOOOOO0Ooooo = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1186. o0o000Oo = oO0Oo . read ( oOOOOO0Ooooo )
  1187. iiiIi = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1188. if iiiIi == 0x0031 :
  1189. oO0o0O0o0OO00 = iiiIi
  1190. O00o ( 'MODULEOFFSET_Id' , 0x0031 , oO0o0O0o0OO00 )
  1191. iIiiiIi = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1192. O00o ( 'MODULEOFFSET_Size' , 0x0004 , iIiiiIi )
  1193. OooooOo = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1194. iiiIi = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1195. if iiiIi == 0x001E :
  1196. IIIiiiIiI = iiiIi
  1197. O00o ( 'MODULEHELPCONTEXT_Id' , 0x001E , IIIiiiIiI )
  1198. OO0OOoooo0o = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1199. O00o ( 'MODULEHELPCONTEXT_Size' , 0x0004 , OO0OOoooo0o )
  1200. IiIi1Ii = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1201. iiiIi = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1202. if iiiIi == 0x002C :
  1203. iiIIiI11II1 = iiiIi
  1204. O00o ( 'MODULECOOKIE_Id' , 0x002C , iiIIiI11II1 )
  1205. oooOooOoO0Oo0 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1206. O00o ( 'MODULECOOKIE_Size' , 0x0002 , oooOooOoO0Oo0 )
  1207. i11i11i = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1208. iiiIi = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1209. if iiiIi == 0x0021 or iiiIi == 0x0022 :
  1210. iiI1iI = iiiIi
  1211. Ooo00O0 = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1212. iiiIi = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1213. if iiiIi == 0x0025 :
  1214. OoO0OOoO0 = iiiIi
  1215. O00o ( 'MODULEREADONLY_Id' , 0x0025 , OoO0OOoO0 )
  1216. iiI11i = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1217. O00o ( 'MODULEREADONLY_Reserved' , 0x0000 , iiI11i )
  1218. iiiIi = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1219. if iiiIi == 0x0028 :
  1220. o0Oo = iiiIi
  1221. O00o ( 'MODULEPRIVATE_Id' , 0x0028 , o0Oo )
  1222. iiI1i = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1223. O00o ( 'MODULEPRIVATE_Reserved' , 0x0000 , iiI1i )
  1224. iiiIi = struct . unpack ( "<H" , oO0Oo . read ( 2 ) ) [ 0 ]
  1225. if iiiIi == 0x002B :
  1226. i11I = struct . unpack ( "<L" , oO0Oo . read ( 4 ) ) [ 0 ]
  1227. O00o ( 'MODULE_Reserved' , 0x0000 , i11I )
  1228. iiiIi = None
  1229. if iiiIi != None :
  1230. logging . warning ( 'unknown or invalid module section id {0:04X}' . format ( iiiIi ) )
  1231. if 56 - 56: iII111i . I1Ii111
  1232. logging . debug ( 'Project CodePage = %d' % iiiIIIii )
  1233. I1i1ii = 'cp%d' % iiiIIIii
  1234. logging . debug ( "ModuleName = {0}" . format ( II1IIi1iII1i ) )
  1235. logging . debug ( "StreamName = {0}" . format ( repr ( o0OOOOOo0 ) ) )
  1236. O0000oo00oOOO = o0OOOOOo0 . decode ( I1i1ii )
  1237. logging . debug ( "StreamName.decode('%s') = %s" % ( I1i1ii , repr ( O0000oo00oOOO ) ) )
  1238. logging . debug ( "StreamNameUnicode = {0}" . format ( repr ( iIIIi1IiI11I1 ) ) )
  1239. logging . debug ( "TextOffset = {0}" . format ( OooooOo ) )
  1240. if 98 - 98: oO0o . OoooooooOO
  1241. Oo000 = vba_root + u'VBA/' + O0000oo00oOOO
  1242. if 97 - 97: O0 / OOooOOo + o0oOOo0O0Ooo . oO0o % OoOoOO00 - OoOoOO00
  1243. logging . debug ( 'opening VBA code stream %s' % repr ( Oo000 ) )
  1244. i1IiI1Iiii = ole . openstream ( Oo000 ) . read ( )
  1245. logging . debug ( "length of code_data = {0}" . format ( len ( i1IiI1Iiii ) ) )
  1246. logging . debug ( "offset of code_data = {0}" . format ( OooooOo ) )
  1247. i1IiI1Iiii = i1IiI1Iiii [ OooooOo : ]
  1248. if len ( i1IiI1Iiii ) > 0 :
  1249. i1IiI1Iiii = OOoO ( i1IiI1Iiii )
  1250. if 87 - 87: IiII / I1Ii111 - Oo0Ooo
  1251. oOO = oO000o0Oo00 . get ( II1IIi1iII1i . lower ( ) , 'bin' )
  1252. oOOO0oOoo = '{0}.{1}' . format ( II1IIi1iII1i , oOO )
  1253. if 65 - 65: iII111i . oO0o - Ii1I
  1254. yield ( Oo000 , oOOO0oOoo , i1IiI1Iiii )
  1255. if 93 - 93: O0
  1256. if 4 - 4: I1IiiI / I1IiiI
  1257. if 82 - 82: I11i / ooOoO0o * I11i % i11iIiiIii * II111iiii
  1258. if 83 - 83: OoO0O00 + OOooOOo - o0oOOo0O0Ooo + iIii1I11I1II1 % Oo0Ooo
  1259. if 23 - 23: o0oOOo0O0Ooo + Ii1I % OoOoOO00 % I1IiiI % OoooooooOO
  1260. logging . debug ( 'extracted file {0}' . format ( oOOO0oOoo ) )
  1261. else :
  1262. logging . warning ( "module stream {0} has code data length 0" . format ( o0OOOOOo0 ) )
  1263. return
  1264. if 78 - 78: OoO0O00 / Oo0Ooo - iIii1I11I1II1 - i11iIiiIii * iII111i
  1265. if 84 - 84: OOooOOo + Ii1I + o0oOOo0O0Ooo
  1266. def i1i1iIII11i ( vba_code ) :
  1267. if 40 - 40: iIii1I11I1II1 / OoOoOO00 - O0 * iIii1I11I1II1
  1268. vba_code = vba_code . replace ( ' _\r\n' , ' ' )
  1269. if 56 - 56: OOooOOo
  1270. if 49 - 49: ooOoO0o . II111iiii
  1271. if 24 - 24: O0 . OoooooooOO - OoO0O00 * OoooooooOO
  1272. if 12 - 12: O0 + IiII * i1IIi . OoO0O00
  1273. if 71 - 71: I1Ii111 - o0oOOo0O0Ooo - OOooOOo
  1274. if 28 - 28: iIii1I11I1II1
  1275. if 7 - 7: o0oOOo0O0Ooo % IiII * OoOoOO00
  1276. vba_code = vba_code . replace ( ' _\r' , ' ' )
  1277. vba_code = vba_code . replace ( ' _\n' , ' ' )
  1278. return vba_code
  1279. if 58 - 58: IiII / I11i + II111iiii % iII111i - OoooooooOO
  1280. if 25 - 25: OoOoOO00 % OoooooooOO * Oo0Ooo - i1IIi * II111iiii * oO0o
  1281. def I1iI1I1ii1 ( vba_code ) :
  1282. iIIi1 = vba_code . splitlines ( )
  1283. if 75 - 75: IiII % i11iIiiIii + iIii1I11I1II1
  1284. if 92 - 92: OoOoOO00 % O0
  1285. if 55 - 55: iIii1I11I1II1 * iII111i
  1286. if 85 - 85: iIii1I11I1II1 . II111iiii
  1287. if 54 - 54: Ii1I . OoooooooOO % Oo0Ooo
  1288. if 22 - 22: OOooOOo
  1289. if 22 - 22: iII111i * I11i - Oo0Ooo * O0 / i11iIiiIii
  1290. if 78 - 78: Oo0Ooo * O0 / ooOoO0o + OoooooooOO + OOooOOo
  1291. if 23 - 23: iII111i % OoooooooOO / iIii1I11I1II1 + I1ii11iIi11i / i1IIi / o0oOOo0O0Ooo
  1292. if 94 - 94: i1IIi
  1293. if 36 - 36: I1IiiI + Oo0Ooo
  1294. oo0OOOOOO0 = 0
  1295. for o0O in iIIi1 :
  1296. if o0O . startswith ( "Attribute VB_" ) and not ':' in o0O :
  1297. oo0OOOOOO0 += 1
  1298. else :
  1299. break
  1300. if 46 - 46: iII111i
  1301. ooIiI11i1I11111 = '\n' . join ( iIIi1 [ oo0OOOOOO0 : ] )
  1302. return ooIiI11i1I11111
  1303. if 34 - 34: I1IiiI * OoOoOO00 * oO0o + I1ii11iIi11i
  1304. if 39 - 39: I1ii11iIi11i / i1IIi * IiII - I1IiiI
  1305. def OoOoooo0O ( vba_code , obfuscation = None ) :
  1306. if 95 - 95: II111iiii / Ii1I - ooOoO0o - II111iiii - i11iIiiIii
  1307. if 85 - 85: o0oOOo0O0Ooo / I1Ii111
  1308. if 67 - 67: I11i % oO0o
  1309. ii1iiIi = [ ]
  1310. if 21 - 21: I1ii11iIi11i
  1311. if 84 - 84: O0 / I1IiiI % i1IIi % i1IIi / OoO0O00 / oO0o
  1312. if 28 - 28: ooOoO0o . OoooooooOO + o0oOOo0O0Ooo + Ii1I % iII111i
  1313. if 80 - 80: Oo0Ooo
  1314. if 86 - 86: I1ii11iIi11i * I11i . OoOoOO00 / Oo0Ooo + oO0o
  1315. if 8 - 8: OoOoOO00
  1316. if 16 - 16: o0oOOo0O0Ooo . I11i
  1317. if 50 - 50: ooOoO0o * OoOoOO00 + I1ii11iIi11i - i11iIiiIii + Oo0Ooo * I1ii11iIi11i
  1318. if 20 - 20: I1Ii111 / o0oOOo0O0Ooo % OoOoOO00
  1319. O00oo0O00 = ''
  1320. if obfuscation :
  1321. O00oo0O00 = ' (obfuscation: %s)' % obfuscation
  1322. for o0oO00o , OOO0OoO0oo0OO in i1iI . items ( ) :
  1323. for i1iI1Ii11Ii1 in OOO0OoO0oo0OO :
  1324. if 82 - 82: O0
  1325. if 70 - 70: I11i - Oo0Ooo / OoooooooOO % OoooooooOO
  1326. if re . search ( r'(?i)\b' + i1iI1Ii11Ii1 + r'\b' , vba_code ) :
  1327. if 95 - 95: OoooooooOO % OoooooooOO . Ii1I
  1328. ii1iiIi . append ( ( i1iI1Ii11Ii1 , o0oO00o + O00oo0O00 ) )
  1329. return ii1iiIi
  1330. if 26 - 26: oO0o + IiII - II111iiii . II111iiii + I1ii11iIi11i + OoOoOO00
  1331. if 68 - 68: O0
  1332. def o0oOoO00 ( vba_code , obfuscation = None ) :
  1333. if 94 - 94: OoO0O00 + IiII + ooOoO0o
  1334. if 82 - 82: Oo0Ooo - Oo0Ooo . iIii1I11I1II1 / OOooOOo + IiII % iIii1I11I1II1
  1335. ii1iiIi = [ ]
  1336. if 61 - 61: OOooOOo / Oo0Ooo % OOooOOo - OoO0O00 + ooOoO0o / ooOoO0o
  1337. if 82 - 82: Oo0Ooo
  1338. if 5 - 5: OoO0O00 / OoO0O00 - O0 - I1Ii111 + I1Ii111
  1339. if 99 - 99: I11i * OoooooooOO / o0oOOo0O0Ooo . IiII - iIii1I11I1II1 - Ii1I
  1340. if 31 - 31: IiII - OoO0O00 / OOooOOo . i1IIi / Ii1I
  1341. if 66 - 66: OoO0O00
  1342. if 72 - 72: I1Ii111
  1343. if 91 - 91: II111iiii / IiII + iIii1I11I1II1 . I11i - O0
  1344. O00oo0O00 = ''
  1345. if obfuscation :
  1346. O00oo0O00 = ' (obfuscation: %s)' % obfuscation
  1347. for o0oO00o , OOO0OoO0oo0OO in oo000O0OoooO . items ( ) :
  1348. for i1iI1Ii11Ii1 in OOO0OoO0oo0OO :
  1349. if 70 - 70: Ii1I * oO0o - I11i + Oo0Ooo % I1ii11iIi11i - IiII
  1350. if re . search ( r'(?i)\b' + i1iI1Ii11Ii1 + r'\b' , vba_code ) :
  1351. if 81 - 81: O0 . O0
  1352. ii1iiIi . append ( ( i1iI1Ii11Ii1 , o0oO00o + O00oo0O00 ) )
  1353. return ii1iiIi
  1354. if 75 - 75: iIii1I11I1II1 % IiII + I1ii11iIi11i * O0 . iII111i - ooOoO0o
  1355. if 32 - 32: Ii1I % oO0o - i1IIi
  1356. def Ii11III ( vba_code , obfuscation = None ) :
  1357. ii1iiIi = [ ]
  1358. if 15 - 15: I11i % I1IiiI - iIii1I11I1II1 * ooOoO0o
  1359. if 71 - 71: OoOoOO00 % Oo0Ooo % ooOoO0o
  1360. if 34 - 34: I11i / I11i % IiII . OoOoOO00 / Oo0Ooo
  1361. if 99 - 99: ooOoO0o * I1IiiI - ooOoO0o % Ii1I
  1362. if 40 - 40: OOooOOo / IiII / iIii1I11I1II1 + Ii1I
  1363. if 59 - 59: I11i * OoooooooOO + OOooOOo . iIii1I11I1II1 / i1IIi
  1364. if 75 - 75: I11i . OOooOOo - iIii1I11I1II1 * OoO0O00 * iII111i
  1365. ooo0OO0OOooO0 = set ( )
  1366. O00oo0O00 = ''
  1367. if obfuscation :
  1368. O00oo0O00 = ' (obfuscation: %s)' % obfuscation
  1369. for O00O00 , oOooO0OoO in III11I1 :
  1370. for I1iiiiii in oOooO0OoO . finditer ( vba_code ) :
  1371. I1iIII1IiiI = I1iiiiii . group ( )
  1372. if I1iIII1IiiI not in ooo0OO0OOooO0 :
  1373. ii1iiIi . append ( ( O00O00 + O00oo0O00 , I1iIII1IiiI ) )
  1374. ooo0OO0OOooO0 . add ( I1iIII1IiiI )
  1375. return ii1iiIi
  1376. if 58 - 58: Ii1I % OoooooooOO
  1377. if 49 - 49: I1ii11iIi11i + O0 . Ii1I * OoooooooOO
  1378. def oO0OOO00 ( vba_code ) :
  1379. ii1iiIi = [ ]
  1380. if 13 - 13: IiII * I1ii11iIi11i / I1ii11iIi11i / iIii1I11I1II1 % iIii1I11I1II1
  1381. if 21 - 21: I1ii11iIi11i
  1382. if 86 - 86: ooOoO0o
  1383. if 51 - 51: OoO0O00 - i11iIiiIii * I1IiiI
  1384. if 95 - 95: OOooOOo % I1ii11iIi11i + o0oOOo0O0Ooo % ooOoO0o
  1385. if 36 - 36: O0 / i1IIi % II111iiii / iII111i
  1386. ooo0OO0OOooO0 = set ( )
  1387. for I1iiiiii in Oo0oooO0oO . finditer ( vba_code ) :
  1388. I1iIII1IiiI = I1iiiiii . group ( )
  1389. if I1iIII1IiiI not in ooo0OO0OOooO0 :
  1390. OOoOi1IiiI = binascii . unhexlify ( I1iIII1IiiI )
  1391. ii1iiIi . append ( ( I1iIII1IiiI , OOoOi1IiiI ) )
  1392. ooo0OO0OOooO0 . add ( I1iIII1IiiI )
  1393. return ii1iiIi
  1394. if 70 - 70: I11i . OOooOOo * Oo0Ooo / OOooOOo
  1395. if 83 - 83: OoooooooOO + OoO0O00 * oO0o . O0
  1396. def iiIIIi1i ( vba_code ) :
  1397. if 1 - 1: Oo0Ooo * I1Ii111 . OoooooooOO
  1398. ii1iiIi = [ ]
  1399. if 73 - 73: OoOoOO00 % o0oOOo0O0Ooo
  1400. if 71 - 71: oO0o - OoooooooOO * Oo0Ooo * I11i + o0oOOo0O0Ooo * I1ii11iIi11i
  1401. if 85 - 85: i11iIiiIii . OoooooooOO - iIii1I11I1II1
  1402. if 38 - 38: I11i . I11i * oO0o / OoooooooOO % ooOoO0o
  1403. if 80 - 80: OoO0O00 / IiII * I1IiiI % IiII
  1404. if 95 - 95: O0 / I11i . I1Ii111
  1405. ooo0OO0OOooO0 = set ( )
  1406. for I1iiiiii in ooO . finditer ( vba_code ) :
  1407. if 17 - 17: I11i
  1408. I1iIII1IiiI = I1iiiiii . group ( ) . strip ( '"' )
  1409. if 56 - 56: ooOoO0o * o0oOOo0O0Ooo + I11i
  1410. if not i11i11111i1i . search ( I1iIII1IiiI ) :
  1411. continue
  1412. if 48 - 48: IiII * OoO0O00 % I1Ii111 - I11i
  1413. if I1iIII1IiiI not in ooo0OO0OOooO0 and I1iIII1IiiI . lower ( ) not in I1Iii1 :
  1414. try :
  1415. OOoOi1IiiI = base64 . b64decode ( I1iIII1IiiI )
  1416. ii1iiIi . append ( ( I1iIII1IiiI , OOoOi1IiiI ) )
  1417. ooo0OO0OOooO0 . add ( I1iIII1IiiI )
  1418. except :
  1419. if 72 - 72: i1IIi % ooOoO0o % IiII % oO0o - oO0o
  1420. pass
  1421. return ii1iiIi
  1422. if 97 - 97: o0oOOo0O0Ooo * O0 / o0oOOo0O0Ooo * OoO0O00 * Oo0Ooo
  1423. if 38 - 38: I1Ii111
  1424. def Iiiii1Iii1I ( vba_code ) :
  1425. from thirdparty . DridexUrlDecoder . DridexUrlDecoder import DridexUrlDecode
  1426. if 83 - 83: OoOoOO00
  1427. if 62 - 62: oO0o + Oo0Ooo / i11iIiiIii
  1428. if 90 - 90: iIii1I11I1II1 + OoOoOO00
  1429. if 9 - 9: iIii1I11I1II1 . OoooooooOO + i1IIi - Oo0Ooo
  1430. if 30 - 30: iII111i / OoO0O00 . iII111i
  1431. if 17 - 17: Oo0Ooo + OoooooooOO * OoooooooOO
  1432. if 5 - 5: I1Ii111 % OoooooooOO . OoOoOO00
  1433. ii1iiIi = [ ]
  1434. ooo0OO0OOooO0 = set ( )
  1435. for I1iiiiii in II1Iiiiii . finditer ( vba_code ) :
  1436. I1iIII1IiiI = I1iiiiii . group ( ) [ 1 : - 1 ]
  1437. if 67 - 67: I1ii11iIi11i + Ii1I
  1438. if not i11i11111i1i . search ( I1iIII1IiiI ) :
  1439. continue
  1440. if I1iIII1IiiI not in ooo0OO0OOooO0 :
  1441. try :
  1442. OOoOi1IiiI = DridexUrlDecode ( I1iIII1IiiI )
  1443. ii1iiIi . append ( ( I1iIII1IiiI , OOoOi1IiiI ) )
  1444. ooo0OO0OOooO0 . add ( I1iIII1IiiI )
  1445. except :
  1446. if 72 - 72: IiII % o0oOOo0O0Ooo
  1447. pass
  1448. return ii1iiIi
  1449. if 93 - 93: iIii1I11I1II1 + i11iIiiIii . o0oOOo0O0Ooo . i1IIi % I1IiiI % ooOoO0o
  1450. if 74 - 74: OoOoOO00 / i1IIi % OoooooooOO
  1451. def o00o0o000Oo ( vba_code ) :
  1452. if 100 - 100: i1IIi - i11iIiiIii . I1Ii111 * OoO0O00
  1453. ii1iiIi = [ ]
  1454. if 62 - 62: O0
  1455. if 41 - 41: i1IIi - I1IiiI
  1456. if 48 - 48: I1IiiI - II111iiii / OoO0O00 + I1IiiI
  1457. if 5 - 5: O0
  1458. if 75 - 75: I1Ii111 + iIii1I11I1II1
  1459. if 19 - 19: I1IiiI + i11iIiiIii . IiII - I11i / Ii1I + o0oOOo0O0Ooo
  1460. if 38 - 38: Oo0Ooo / iIii1I11I1II1 * iIii1I11I1II1 % I1ii11iIi11i
  1461. ooo0OO0OOooO0 = set ( )
  1462. if 92 - 92: I11i / O0 * I1IiiI - I11i
  1463. if 99 - 99: i11iIiiIii % OoooooooOO
  1464. if 56 - 56: IiII * I1Ii111
  1465. vba_code = vba_code . expandtabs ( )
  1466. for O00oO0O , oo0OOOOOO0 , IiiI111I11 in O000Oo0o . scanString ( vba_code ) :
  1467. oO0Ooooo000 = vba_code [ oo0OOOOOO0 : IiiI111I11 ]
  1468. OOoOi1IiiI = O00oO0O [ 0 ]
  1469. if isinstance ( OOoOi1IiiI , I111i1II ) :
  1470. if 46 - 46: I1IiiI - I11i / OoooooooOO - i1IIi . i11iIiiIii
  1471. if 15 - 15: II111iiii * oO0o % iII111i / i11iIiiIii - oO0o + Oo0Ooo
  1472. if 9 - 9: I11i - oO0o + O0 / iII111i % i1IIi
  1473. if 97 - 97: o0oOOo0O0Ooo * ooOoO0o
  1474. if 78 - 78: I11i . OOooOOo + oO0o * iII111i - i1IIi
  1475. if 27 - 27: Ii1I % i1IIi . Oo0Ooo % I1Ii111
  1476. if 10 - 10: IiII / OoooooooOO
  1477. if 50 - 50: i11iIiiIii - OoooooooOO . oO0o + O0 . i1IIi
  1478. if oO0Ooooo000 not in ooo0OO0OOooO0 and OOoOi1IiiI != oO0Ooooo000 :
  1479. ii1iiIi . append ( ( oO0Ooooo000 , OOoOi1IiiI ) )
  1480. ooo0OO0OOooO0 . add ( oO0Ooooo000 )
  1481. if 91 - 91: o0oOOo0O0Ooo . iII111i % Oo0Ooo - iII111i . oO0o % i11iIiiIii
  1482. if 25 - 25: iIii1I11I1II1
  1483. return ii1iiIi
  1484. if 63 - 63: ooOoO0o
  1485. if 96 - 96: I11i
  1486. class IIII ( object ) :
  1487. if 17 - 17: O0 . OOooOOo
  1488. if 63 - 63: iII111i
  1489. if 11 - 11: iII111i - iIii1I11I1II1
  1490. if 92 - 92: OoO0O00
  1491. if 15 - 15: IiII / IiII + iIii1I11I1II1 % OoooooooOO
  1492. def __init__ ( self , vba_code ) :
  1493. if 12 - 12: ooOoO0o
  1494. self . code = i1i1iIII11i ( vba_code )
  1495. if 36 - 36: I1Ii111 . IiII * OoooooooOO - o0oOOo0O0Ooo
  1496. if 60 - 60: OOooOOo . iII111i / iIii1I11I1II1 + OOooOOo * I1Ii111
  1497. if 82 - 82: i11iIiiIii . iIii1I11I1II1 * I1IiiI - I11i + Ii1I
  1498. if 48 - 48: I1ii11iIi11i
  1499. if 96 - 96: ooOoO0o . OoooooooOO
  1500. self . code_hex = ''
  1501. self . code_hex_rev = ''
  1502. self . code_rev_hex = ''
  1503. self . code_base64 = ''
  1504. self . code_dridex = ''
  1505. self . code_vba = ''
  1506. self . strReverse = None
  1507. if 39 - 39: OOooOOo + OoO0O00
  1508. self . results = None
  1509. self . autoexec_keywords = None
  1510. self . suspicious_keywords = None
  1511. self . iocs = None
  1512. self . hex_strings = None
  1513. self . base64_strings = None
  1514. self . dridex_strings = None
  1515. self . vba_strings = None
  1516. if 80 - 80: OOooOOo % OoO0O00 / OoOoOO00
  1517. if 54 - 54: Oo0Ooo % OoO0O00 - OOooOOo - I11i
  1518. def scan ( self , include_decoded_strings = False ) :
  1519. if 71 - 71: ooOoO0o . i11iIiiIii
  1520. self . hex_strings = oO0OOO00 ( self . code )
  1521. if 56 - 56: O0 * iII111i + iII111i * iIii1I11I1II1 / ooOoO0o * I1Ii111
  1522. if 25 - 25: iIii1I11I1II1 . I11i * i11iIiiIii + Oo0Ooo * I11i
  1523. if 67 - 67: iII111i
  1524. if 88 - 88: Oo0Ooo
  1525. if 8 - 8: I1ii11iIi11i
  1526. if 82 - 82: OoooooooOO
  1527. if 75 - 75: II111iiii % I1IiiI + OOooOOo % OoooooooOO / IiII
  1528. if 4 - 4: i11iIiiIii - OOooOOo % I1ii11iIi11i * I1Ii111 % o0oOOo0O0Ooo
  1529. if 71 - 71: ooOoO0o . ooOoO0o - iIii1I11I1II1
  1530. if 22 - 22: OoooooooOO / I1ii11iIi11i % iII111i * OoOoOO00
  1531. self . strReverse = False
  1532. if 'strreverse' in self . code . lower ( ) : self . strReverse = True
  1533. if 32 - 32: OoooooooOO % oO0o % iIii1I11I1II1 / O0
  1534. for oO0Ooooo000 , OOoOi1IiiI in self . hex_strings :
  1535. self . code_hex += '\n' + OOoOi1IiiI
  1536. if 61 - 61: II111iiii . O0 - Ii1I - I1ii11iIi11i / i11iIiiIii - II111iiii
  1537. if self . strReverse :
  1538. if 98 - 98: Ii1I - I1IiiI . i11iIiiIii * Oo0Ooo
  1539. self . code_hex_rev += '\n' + OOoOi1IiiI [ : : - 1 ]
  1540. if 29 - 29: Ii1I / ooOoO0o % I11i
  1541. self . code_rev_hex += '\n' + binascii . unhexlify ( oO0Ooooo000 [ : : - 1 ] )
  1542. if 10 - 10: iIii1I11I1II1 % OoooooooOO % I1ii11iIi11i
  1543. if 39 - 39: II111iiii * OoOoOO00 . O0 * I11i
  1544. if 89 - 89: Ii1I - ooOoO0o . I11i - I1Ii111 - I1IiiI
  1545. self . base64_strings = iiIIIi1i ( self . code )
  1546. for oO0Ooooo000 , OOoOi1IiiI in self . base64_strings :
  1547. self . code_base64 += '\n' + OOoOi1IiiI
  1548. if 79 - 79: IiII + IiII + Ii1I
  1549. self . dridex_strings = Iiiii1Iii1I ( self . code )
  1550. for oO0Ooooo000 , OOoOi1IiiI in self . dridex_strings :
  1551. self . code_dridex += '\n' + OOoOi1IiiI
  1552. if 39 - 39: O0 - OoooooooOO
  1553. self . vba_strings = o00o0o000Oo ( self . code )
  1554. for oO0Ooooo000 , OOoOi1IiiI in self . vba_strings :
  1555. self . code_vba += '\n' + OOoOi1IiiI
  1556. ii1iiIi = [ ]
  1557. self . autoexec_keywords = [ ]
  1558. self . suspicious_keywords = [ ]
  1559. self . iocs = [ ]
  1560. if 63 - 63: iIii1I11I1II1 % o0oOOo0O0Ooo * ooOoO0o
  1561. for oo0 , iii1iI in (
  1562. ( self . code , None ) ,
  1563. ( self . code_hex , 'Hex' ) ,
  1564. ( self . code_hex_rev , 'Hex+StrReverse' ) ,
  1565. ( self . code_rev_hex , 'StrReverse+Hex' ) ,
  1566. ( self . code_base64 , 'Base64' ) ,
  1567. ( self . code_dridex , 'Dridex' ) ,
  1568. ( self . code_vba , 'VBA expression' ) ,
  1569. ) :
  1570. self . autoexec_keywords += OoOoooo0O ( oo0 , iii1iI )
  1571. self . suspicious_keywords += o0oOoO00 ( oo0 , iii1iI )
  1572. self . iocs += Ii11III ( oo0 , iii1iI )
  1573. if 26 - 26: iIii1I11I1II1 - I1ii11iIi11i . IiII . IiII + iIii1I11I1II1 * Oo0Ooo
  1574. if 85 - 85: OOooOOo + II111iiii - OOooOOo * oO0o - i1IIi % iII111i
  1575. if self . hex_strings :
  1576. self . suspicious_keywords . append ( ( 'Hex Strings' ,
  1577. 'Hex-encoded strings were detected, may be used to obfuscate strings (option --decode to see all)' ) )
  1578. if self . base64_strings :
  1579. self . suspicious_keywords . append ( ( 'Base64 Strings' ,
  1580. 'Base64-encoded strings were detected, may be used to obfuscate strings (option --decode to see all)' ) )
  1581. if self . dridex_strings :
  1582. self . suspicious_keywords . append ( ( 'Dridex Strings' ,
  1583. 'Dridex-encoded strings were detected, may be used to obfuscate strings (option --decode to see all)' ) )
  1584. if self . vba_strings :
  1585. self . suspicious_keywords . append ( ( 'VBA obfuscated Strings' ,
  1586. 'VBA string expressions were detected, may be used to obfuscate strings (option --decode to see all)' ) )
  1587. if 1 - 1: OoooooooOO / O0 + OoOoOO00 + OoOoOO00 . I1Ii111 - OoOoOO00
  1588. I11iii1I1Iiii = set ( )
  1589. for i1iI1Ii11Ii1 , o0oO00o in self . autoexec_keywords :
  1590. if i1iI1Ii11Ii1 not in I11iii1I1Iiii :
  1591. ii1iiIi . append ( ( 'AutoExec' , i1iI1Ii11Ii1 , o0oO00o ) )
  1592. I11iii1I1Iiii . add ( i1iI1Ii11Ii1 )
  1593. I11iii1I1Iiii = set ( )
  1594. for i1iI1Ii11Ii1 , o0oO00o in self . suspicious_keywords :
  1595. if i1iI1Ii11Ii1 not in I11iii1I1Iiii :
  1596. ii1iiIi . append ( ( 'Suspicious' , i1iI1Ii11Ii1 , o0oO00o ) )
  1597. I11iii1I1Iiii . add ( i1iI1Ii11Ii1 )
  1598. I11iii1I1Iiii = set ( )
  1599. for O00O00 , I1iIII1IiiI in self . iocs :
  1600. if I1iIII1IiiI not in I11iii1I1Iiii :
  1601. ii1iiIi . append ( ( 'IOC' , I1iIII1IiiI , O00O00 ) )
  1602. I11iii1I1Iiii . add ( I1iIII1IiiI )
  1603. if 47 - 47: i11iIiiIii / Oo0Ooo - Oo0Ooo * OoO0O00
  1604. if 48 - 48: IiII
  1605. for oO0Ooooo000 , OOoOi1IiiI in self . hex_strings :
  1606. if include_decoded_strings or i1oO ( OOoOi1IiiI ) :
  1607. ii1iiIi . append ( ( 'Hex String' , OOoOi1IiiI , oO0Ooooo000 ) )
  1608. for oO0Ooooo000 , OOoOi1IiiI in self . base64_strings :
  1609. if include_decoded_strings or i1oO ( OOoOi1IiiI ) :
  1610. ii1iiIi . append ( ( 'Base64 String' , OOoOi1IiiI , oO0Ooooo000 ) )
  1611. for oO0Ooooo000 , OOoOi1IiiI in self . dridex_strings :
  1612. if include_decoded_strings or i1oO ( OOoOi1IiiI ) :
  1613. ii1iiIi . append ( ( 'Dridex string' , OOoOi1IiiI , oO0Ooooo000 ) )
  1614. for oO0Ooooo000 , OOoOi1IiiI in self . vba_strings :
  1615. if include_decoded_strings or i1oO ( OOoOi1IiiI ) :
  1616. ii1iiIi . append ( ( 'VBA string' , OOoOi1IiiI , oO0Ooooo000 ) )
  1617. self . results = ii1iiIi
  1618. return ii1iiIi
  1619. if 96 - 96: oO0o / O0 . II111iiii + IiII % o0oOOo0O0Ooo
  1620. def scan_summary ( self ) :
  1621. if 67 - 67: O0 % I1Ii111
  1622. if self . results is None :
  1623. if 35 - 35: I1IiiI . OoOoOO00 + OoooooooOO % Oo0Ooo % OOooOOo
  1624. if 39 - 39: Ii1I
  1625. if 60 - 60: OOooOOo
  1626. if 62 - 62: I1Ii111 * I11i
  1627. if 74 - 74: OoOoOO00 . iIii1I11I1II1
  1628. if 87 - 87: ooOoO0o
  1629. if 41 - 41: OoOoOO00 . iIii1I11I1II1 % ooOoO0o + O0
  1630. if 22 - 22: o0oOOo0O0Ooo + Oo0Ooo . ooOoO0o + I1ii11iIi11i * iII111i . i11iIiiIii
  1631. self . scan ( )
  1632. return ( len ( self . autoexec_keywords ) , len ( self . suspicious_keywords ) ,
  1633. len ( self . iocs ) , len ( self . hex_strings ) , len ( self . base64_strings ) ,
  1634. len ( self . dridex_strings ) , len ( self . vba_strings ) )
  1635. if 90 - 90: OOooOOo * OoOoOO00 - Oo0Ooo + o0oOOo0O0Ooo
  1636. if 53 - 53: OoooooooOO . OoooooooOO + o0oOOo0O0Ooo - iII111i + OOooOOo
  1637. def i1111iIII ( vba_code , include_decoded_strings ) :
  1638. return IIII ( vba_code ) . scan ( include_decoded_strings )
  1639. if 50 - 50: O0 * I1ii11iIi11i + II111iiii . i1IIi + OoOoOO00
  1640. if 39 - 39: iIii1I11I1II1 + ooOoO0o
  1641. if 92 - 92: I11i % i11iIiiIii % Oo0Ooo
  1642. if 23 - 23: II111iiii * iII111i
  1643. if 80 - 80: I1Ii111 / i11iIiiIii + OoooooooOO
  1644. if 38 - 38: I1ii11iIi11i % ooOoO0o + i1IIi * OoooooooOO * oO0o
  1645. if 83 - 83: iIii1I11I1II1 - ooOoO0o - I1Ii111 / OoO0O00 - O0
  1646. if 81 - 81: Ii1I - oO0o * I1ii11iIi11i / I1Ii111
  1647. if 21 - 21: OoO0O00
  1648. if 63 - 63: I11i . O0 * I11i + iIii1I11I1II1
  1649. if 46 - 46: i1IIi + II111iiii * i1IIi - Ii1I
  1650. if 79 - 79: II111iiii - oO0o * I1ii11iIi11i - OoOoOO00 . I1ii11iIi11i
  1651. if 11 - 11: O0 * OoOoOO00
  1652. if 37 - 37: OoOoOO00 + O0 . O0 * Oo0Ooo % I1Ii111 / iII111i
  1653. if 18 - 18: OoooooooOO
  1654. class O0oOo00oooO ( object ) :
  1655. if 16 - 16: i1IIi . i1IIi / I1Ii111 % OoOoOO00 / I1IiiI * I1ii11iIi11i
  1656. if 30 - 30: o0oOOo0O0Ooo + OoooooooOO + OOooOOo / II111iiii * Oo0Ooo
  1657. if 59 - 59: Ii1I / OoOoOO00 * OoO0O00 * iII111i % oO0o
  1658. if 61 - 61: Oo0Ooo - O0 - OoooooooOO
  1659. if 4 - 4: II111iiii - oO0o % Oo0Ooo * i11iIiiIii
  1660. if 18 - 18: Oo0Ooo % O0
  1661. if 66 - 66: iIii1I11I1II1 % i11iIiiIii / I1IiiI
  1662. if 47 - 47: I1ii11iIi11i * oO0o + iIii1I11I1II1 - oO0o / IiII
  1663. if 86 - 86: IiII
  1664. if 43 - 43: I1IiiI / iII111i / ooOoO0o + iIii1I11I1II1 + OoooooooOO
  1665. if 33 - 33: II111iiii - IiII - ooOoO0o
  1666. if 92 - 92: OoO0O00 * IiII
  1667. def __init__ ( self , filename , data = None , container = None ) :
  1668. if 92 - 92: oO0o
  1669. if 7 - 7: iII111i
  1670. if 73 - 73: OoO0O00 % I1ii11iIi11i
  1671. if data is None :
  1672. if 32 - 32: OOooOOo + iII111i + iIii1I11I1II1 * Oo0Ooo
  1673. if 62 - 62: i11iIiiIii
  1674. if 2 - 2: I1IiiI
  1675. if 69 - 69: OoooooooOO / Oo0Ooo * I1Ii111
  1676. if 99 - 99: II111iiii * iIii1I11I1II1 % O0 * oO0o / II111iiii % OoooooooOO
  1677. if 14 - 14: IiII . IiII % ooOoO0o
  1678. if 42 - 42: o0oOOo0O0Ooo . OOooOOo - ooOoO0o
  1679. if 33 - 33: II111iiii / O0 / IiII - I11i - i1IIi
  1680. if 8 - 8: i11iIiiIii . iII111i / iIii1I11I1II1 / I1ii11iIi11i / IiII - Ii1I
  1681. if 32 - 32: o0oOOo0O0Ooo . i1IIi * Oo0Ooo
  1682. if 98 - 98: Ii1I - II111iiii / I1IiiI . oO0o * IiII . I11i
  1683. if 25 - 25: i11iIiiIii / OoOoOO00 - I1Ii111 / OoO0O00 . o0oOOo0O0Ooo . o0oOOo0O0Ooo
  1684. if 6 - 6: oO0o . I11i
  1685. iIIII1 = filename
  1686. else :
  1687. if 65 - 65: O0 / II111iiii . iIii1I11I1II1 . oO0o / Oo0Ooo % iIii1I11I1II1
  1688. iIIII1 = cStringIO . StringIO ( data )
  1689. if 74 - 74: i1IIi / I1IiiI % I1ii11iIi11i / O0 % I11i - OoOoOO00
  1690. self . ole_file = None
  1691. self . ole_subfiles = [ ]
  1692. self . filename = filename
  1693. self . container = container
  1694. self . type = None
  1695. self . vba_projects = None
  1696. self . contains_macros = None
  1697. self . vba_code_all_modules = None
  1698. if 31 - 31: I1IiiI / OoooooooOO . iIii1I11I1II1 * OoOoOO00 . OoooooooOO + II111iiii
  1699. self . modules = None
  1700. if 8 - 8: I1ii11iIi11i * I1ii11iIi11i * i1IIi + iII111i . I1ii11iIi11i
  1701. self . analysis_results = None
  1702. if 100 - 100: OoooooooOO - O0 . I11i / I11i + II111iiii * OoOoOO00
  1703. self . nb_macros = 0
  1704. self . nb_autoexec = 0
  1705. self . nb_suspicious = 0
  1706. self . nb_iocs = 0
  1707. self . nb_hexstrings = 0
  1708. self . nb_base64strings = 0
  1709. self . nb_dridexstrings = 0
  1710. self . nb_vbastrings = 0
  1711. if 37 - 37: Oo0Ooo
  1712. if 72 - 72: IiII % I1ii11iIi11i * OOooOOo . i11iIiiIii % IiII * OOooOOo
  1713. if 15 - 15: I11i / Oo0Ooo * I11i
  1714. if 20 - 20: ooOoO0o - OOooOOo * OoO0O00 * o0oOOo0O0Ooo * OOooOOo / IiII
  1715. if 40 - 40: I1IiiI * o0oOOo0O0Ooo . I1IiiI
  1716. if 62 - 62: ooOoO0o + II111iiii % ooOoO0o
  1717. if 50 - 50: OoooooooOO + oO0o * I1IiiI - Ii1I / i11iIiiIii
  1718. if 5 - 5: O0 - I1IiiI
  1719. if 44 - 44: II111iiii . II111iiii + OOooOOo * Ii1I
  1720. if olefile . isOleFile ( iIIII1 ) :
  1721. if 16 - 16: II111iiii
  1722. logging . info ( 'Opening OLE file %s' % self . filename )
  1723. if 100 - 100: O0 - i1IIi
  1724. self . type = II
  1725. if 48 - 48: oO0o % ooOoO0o + O0
  1726. self . ole_file = olefile . OleFileIO ( iIIII1 , path_encoding = None )
  1727. if 27 - 27: I1ii11iIi11i / OOooOOo
  1728. elif zipfile . is_zipfile ( iIIII1 ) :
  1729. if 33 - 33: OoooooooOO % I1ii11iIi11i . O0 / I1ii11iIi11i
  1730. if 63 - 63: IiII + iIii1I11I1II1 + I1IiiI + I1Ii111
  1731. if 72 - 72: OoO0O00 + i11iIiiIii + I1ii11iIi11i
  1732. if 96 - 96: oO0o % i1IIi / o0oOOo0O0Ooo
  1733. logging . info ( 'Opening ZIP/OpenXML file %s' % self . filename )
  1734. self . type = o0Oo0oO0oOO00
  1735. Ii1IIi11 = zipfile . ZipFile ( iIIII1 )
  1736. if 47 - 47: O0
  1737. if 83 - 83: O0 + OoOoOO00 / O0 / I11i
  1738. if 68 - 68: i1IIi . I11i . i1IIi + IiII % I1IiiI
  1739. for IIoO in Ii1IIi11 . namelist ( ) :
  1740. iI1I = Ii1IIi11 . open ( IIoO ) . read ( len ( olefile . MAGIC ) )
  1741. if iI1I == olefile . MAGIC :
  1742. logging . debug ( 'Opening OLE file %s within zip' % IIoO )
  1743. i111I1 = Ii1IIi11 . open ( IIoO ) . read ( )
  1744. try :
  1745. self . ole_subfiles . append ( O0oOo00oooO ( filename = IIoO , data = i111I1 ) )
  1746. except :
  1747. logging . debug ( '%s is not a valid OLE file' % IIoO )
  1748. continue
  1749. Ii1IIi11 . close ( )
  1750. else :
  1751. if 69 - 69: OoO0O00 - OoooooooOO - OOooOOo % I11i / OoOoOO00 - II111iiii
  1752. if 67 - 67: OOooOOo + OOooOOo + OoO0O00 . i11iIiiIii + I1ii11iIi11i + i11iIiiIii
  1753. if data is None :
  1754. data = open ( filename , 'rb' ) . read ( )
  1755. if 31 - 31: oO0o * I1Ii111 . OoOoOO00 * I11i
  1756. I1II1I = data . lower ( )
  1757. if 7 - 7: I11i + I11i + II111iiii % Ii1I
  1758. if 31 - 31: oO0o * OoOoOO00 + OOooOOo
  1759. if 'http://schemas.microsoft.com/office/word/2003/wordml' in data :
  1760. logging . info ( 'Opening Word 2003 XML file %s' % self . filename )
  1761. try :
  1762. if 58 - 58: o0oOOo0O0Ooo % I1IiiI . I1IiiI * OoO0O00 - IiII . OoooooooOO
  1763. if 10 - 10: I1Ii111
  1764. I11i1i11IiIi1 = ET . fromstring ( data )
  1765. if 8 - 8: iII111i - I1IiiI * Oo0Ooo % I1ii11iIi11i * OoooooooOO
  1766. self . type = oo00OO0000oO
  1767. if 26 - 26: i1IIi / iII111i . iII111i
  1768. for I1i11IIIi in I11i1i11IiIi1 . getiterator ( I1iiii1I ) :
  1769. if 19 - 19: oO0o * iII111i + OoOoOO00 - oO0o + I1ii11iIi11i
  1770. if 14 - 14: OoO0O00
  1771. if 38 - 38: O0
  1772. ooOi1i1i11iI11II = I1i11IIIi . get ( OOo0 , 'noname.mso' )
  1773. if 6 - 6: OoOoOO00 . II111iiii * I1IiiI . I1IiiI / Ii1I
  1774. I1I1ii1111 = binascii . a2b_base64 ( I1i11IIIi . text )
  1775. if OOoo0oo ( I1I1ii1111 ) :
  1776. if 4 - 4: I1ii11iIi11i * O0 - I1Ii111 - i11iIiiIii / o0oOOo0O0Ooo . OOooOOo
  1777. if 44 - 44: ooOoO0o * i11iIiiIii
  1778. i111I1 = OO0O0ooOOO00 ( I1I1ii1111 )
  1779. try :
  1780. self . ole_subfiles . append ( O0oOo00oooO ( filename = ooOi1i1i11iI11II , data = i111I1 ) )
  1781. except :
  1782. logging . error ( '%s does not contain a valid OLE file' % ooOi1i1i11iI11II )
  1783. else :
  1784. logging . error ( '%s is not a valid MSO file' % ooOi1i1i11iI11II )
  1785. except :
  1786. if 6 - 6: o0oOOo0O0Ooo % OOooOOo * I1ii11iIi11i % Ii1I . OOooOOo
  1787. logging . exception ( 'Failed XML parsing for file %r' % self . filename )
  1788. pass
  1789. if 43 - 43: OoO0O00 . ooOoO0o * Oo0Ooo
  1790. if 20 - 20: i1IIi . i1IIi - I11i
  1791. if 89 - 89: ooOoO0o - I11i . O0 % OoooooooOO . i11iIiiIii
  1792. if 35 - 35: II111iiii / OoOoOO00 - O0 . II111iiii
  1793. if 55 - 55: Oo0Ooo % i1IIi * I11i
  1794. if 95 - 95: OOooOOo / II111iiii - o0oOOo0O0Ooo % I1Ii111 . I11i
  1795. if self . type is None and 'mime' in I1II1I and 'version' in I1II1I and 'multipart' in I1II1I :
  1796. logging . info ( 'Opening MHTML file %s' % self . filename )
  1797. try :
  1798. if 63 - 63: iIii1I11I1II1 / ooOoO0o
  1799. if 24 - 24: Oo0Ooo / iIii1I11I1II1 % OOooOOo * OoOoOO00 - iIii1I11I1II1
  1800. iI1ii = data . lstrip ( '\r\n\t ' )
  1801. oOoooOooOOoO = email . message_from_string ( iI1ii )
  1802. self . type = I1II1
  1803. if 90 - 90: iII111i * Ii1I - iII111i + OoO0O00 + I11i % O0
  1804. for i111IIIIiI in oOoooOooOOoO . walk ( ) :
  1805. Oo0oOOO = i111IIIIiI . get_content_type ( )
  1806. ooOi1i1i11iI11II = i111IIIIiI . get_filename ( None )
  1807. if 62 - 62: Ii1I - oO0o % iIii1I11I1II1
  1808. logging . debug ( 'MHTML part: filename=%r, content-type=%r' % ( ooOi1i1i11iI11II , Oo0oOOO ) )
  1809. ooOOO = i111IIIIiI . get_payload ( decode = True )
  1810. if 97 - 97: i1IIi * I1Ii111 . II111iiii
  1811. if 62 - 62: OoooooooOO . Ii1I
  1812. if 28 - 28: oO0o . oO0o . iIii1I11I1II1 . OOooOOo . I1ii11iIi11i * i11iIiiIii
  1813. if 72 - 72: I11i
  1814. if 26 - 26: IiII % Oo0Ooo
  1815. if isinstance ( ooOOO , str ) and OOoo0oo ( ooOOO ) :
  1816. logging . debug ( 'Found ActiveMime header, decompressing MSO container' )
  1817. try :
  1818. i111I1 = OO0O0ooOOO00 ( ooOOO )
  1819. try :
  1820. if 72 - 72: O0 + o0oOOo0O0Ooo + I1IiiI / Oo0Ooo
  1821. if 83 - 83: IiII - I1IiiI . Ii1I
  1822. self . ole_subfiles . append ( O0oOo00oooO ( filename = ooOi1i1i11iI11II , data = i111I1 ) )
  1823. except :
  1824. logging . debug ( '%s does not contain a valid OLE file' % ooOi1i1i11iI11II )
  1825. except :
  1826. logging . exception ( 'Failed decompressing an MSO container in %r - %s'
  1827. % ( ooOi1i1i11iI11II , o00oo0 ) )
  1828. if 34 - 34: OoOoOO00 - oO0o * OoooooooOO
  1829. except :
  1830. logging . exception ( 'Failed MIME parsing for file %r - %s'
  1831. % ( self . filename , o00oo0 ) )
  1832. pass
  1833. if 5 - 5: i11iIiiIii * iII111i - Ii1I - I1ii11iIi11i - i1IIi + iII111i
  1834. if 4 - 4: ooOoO0o + O0 . i1IIi * I1ii11iIi11i - o0oOOo0O0Ooo
  1835. if 42 - 42: o0oOOo0O0Ooo * OoOoOO00 . OoO0O00 - iII111i / II111iiii
  1836. if 25 - 25: Oo0Ooo % OoOoOO00
  1837. if self . type is None :
  1838. o00O = '%s is not a supported file type, cannot extract VBA Macros.' % self . filename
  1839. logging . error ( o00O )
  1840. raise TypeError ( o00O )
  1841. if 36 - 36: OOooOOo * OoO0O00 - I1ii11iIi11i + iII111i
  1842. def find_vba_projects ( self ) :
  1843. if 13 - 13: OoO0O00 % iIii1I11I1II1 - II111iiii / I1IiiI
  1844. if self . ole_file is None :
  1845. if 9 - 9: I1ii11iIi11i * Ii1I - IiII
  1846. if 88 - 88: iIii1I11I1II1
  1847. if 27 - 27: I11i * i11iIiiIii . OOooOOo + ooOoO0o
  1848. if 14 - 14: I1Ii111 * OoO0O00 + I11i - IiII . I1ii11iIi11i * oO0o
  1849. if 100 - 100: I11i
  1850. if 36 - 36: OoO0O00 + II111iiii * OoOoOO00
  1851. if 14 - 14: I1Ii111 % I1Ii111
  1852. if 9 - 9: Oo0Ooo - Oo0Ooo - o0oOOo0O0Ooo + I1Ii111 - II111iiii . I1IiiI
  1853. if 57 - 57: iII111i - I1IiiI + OoooooooOO / iII111i . ooOoO0o % i1IIi
  1854. if 52 - 52: O0 - iIii1I11I1II1 / OoO0O00 / IiII
  1855. if 29 - 29: Ii1I * OOooOOo * i1IIi . Ii1I * I1Ii111 . ooOoO0o
  1856. if 54 - 54: iII111i . i1IIi . I1ii11iIi11i * o0oOOo0O0Ooo % iII111i
  1857. if 30 - 30: I11i
  1858. if 85 - 85: II111iiii + ooOoO0o * I11i
  1859. if 12 - 12: Ii1I . I1IiiI % o0oOOo0O0Ooo
  1860. if 28 - 28: Ii1I - I1IiiI % OoO0O00 * I1Ii111
  1861. if 80 - 80: OOooOOo * IiII
  1862. return None
  1863. if 4 - 4: iIii1I11I1II1 . I1Ii111 + II111iiii % OoooooooOO
  1864. if 82 - 82: OoooooooOO / ooOoO0o * I11i * O0 . I1ii11iIi11i
  1865. if self . vba_projects is not None :
  1866. return self . vba_projects
  1867. if 21 - 21: II111iiii + Oo0Ooo
  1868. if 59 - 59: OOooOOo + I1IiiI / II111iiii / OoOoOO00
  1869. if 80 - 80: OoOoOO00 + iIii1I11I1II1 . IiII
  1870. if 76 - 76: I1IiiI * OOooOOo
  1871. if 12 - 12: iIii1I11I1II1 / I11i % Ii1I
  1872. if 49 - 49: OoO0O00 + II111iiii / IiII - O0 % Ii1I
  1873. if 27 - 27: OoO0O00 + Oo0Ooo
  1874. if 92 - 92: I1IiiI % iII111i
  1875. if 31 - 31: OoooooooOO - oO0o / I1Ii111
  1876. if 62 - 62: i11iIiiIii - I11i
  1877. if 81 - 81: I11i
  1878. if 92 - 92: OOooOOo - Oo0Ooo - OoooooooOO / IiII - i1IIi
  1879. if 81 - 81: i1IIi / I1Ii111 % i11iIiiIii . iIii1I11I1II1 * OoOoOO00 + OoooooooOO
  1880. if 31 - 31: i1IIi % II111iiii
  1881. if 13 - 13: iIii1I11I1II1 - II111iiii % O0 . Ii1I % OoO0O00
  1882. if 2 - 2: OoooooooOO - Ii1I % oO0o / I1IiiI / o0oOOo0O0Ooo
  1883. self . vba_projects = [ ]
  1884. if 3 - 3: II111iiii / OOooOOo
  1885. i1IIiiIIIIi = self . ole_file
  1886. for IiIIIi in i1IIiiIIIIi . listdir ( streams = False , storages = True ) :
  1887. if 81 - 81: OoooooooOO . OoOoOO00 * iIii1I11I1II1 / OoOoOO00 - I1ii11iIi11i % i1IIi
  1888. if IiIIIi [ - 1 ] . upper ( ) == 'VBA' :
  1889. logging . debug ( 'Found VBA storage: %s' % ( '/' . join ( IiIIIi ) ) )
  1890. oOooO = '/' . join ( IiIIIi [ : - 1 ] )
  1891. if 41 - 41: OOooOOo
  1892. if 76 - 76: I1IiiI - I1IiiI - o0oOOo0O0Ooo % ooOoO0o * O0
  1893. if oOooO != '' :
  1894. oOooO += '/'
  1895. logging . debug ( 'Checking vba_root="%s"' % oOooO )
  1896. if 11 - 11: Ii1I + I11i . OoO0O00 . i11iIiiIii * OoO0O00
  1897. def I1IIiIi ( ole , vba_root , stream_path ) :
  1898. OOOOoOoO = vba_root + stream_path
  1899. if ole . exists ( OOOOoOoO ) and ole . get_type ( OOOOoOoO ) == olefile . STGTY_STREAM :
  1900. logging . debug ( 'Found %s stream: %s' % ( stream_path , OOOOoOoO ) )
  1901. return OOOOoOoO
  1902. else :
  1903. logging . debug ( 'Missing %s stream, this is not a valid VBA project structure' % stream_path )
  1904. return False
  1905. if 72 - 72: OoOoOO00 / I1Ii111 * IiII % iIii1I11I1II1
  1906. if 53 - 53: OoO0O00 . O0 . I1IiiI * OOooOOo / o0oOOo0O0Ooo
  1907. iiIIiI1 = I1IIiIi ( i1IIiiIIIIi , oOooO , 'PROJECT' )
  1908. if not iiIIiI1 : continue
  1909. if 28 - 28: I1ii11iIi11i * oO0o / II111iiii + OOooOOo - O0
  1910. Iii1IoOo000Oo00o = I1IIiIi ( i1IIiiIIIIi , oOooO , 'VBA/_VBA_PROJECT' )
  1911. if not Iii1IoOo000Oo00o : continue
  1912. if 81 - 81: OoooooooOO
  1913. ooOOOoOoOOOO = I1IIiIi ( i1IIiiIIIIi , oOooO , 'VBA/dir' )
  1914. if not ooOOOoOoOOOO : continue
  1915. if 32 - 32: IiII - ooOoO0o * iII111i * I11i
  1916. logging . debug ( 'VBA root storage: "%s"' % oOooO )
  1917. if 84 - 84: Ii1I + I1ii11iIi11i % I1IiiI + i11iIiiIii
  1918. self . vba_projects . append ( ( oOooO , iiIIiI1 , ooOOOoOoOOOO ) )
  1919. return self . vba_projects
  1920. if 37 - 37: I11i % I1ii11iIi11i / ooOoO0o
  1921. def detect_vba_macros ( self ) :
  1922. if 94 - 94: I11i / OoO0O00 . o0oOOo0O0Ooo
  1923. if 1 - 1: Oo0Ooo . II111iiii
  1924. if 93 - 93: II111iiii . i11iIiiIii + II111iiii % oO0o
  1925. if self . contains_macros is not None :
  1926. if 98 - 98: I1Ii111 * oO0o * OoOoOO00 + Ii1I * iII111i
  1927. if 4 - 4: IiII
  1928. if 16 - 16: iIii1I11I1II1 * iII111i + oO0o . O0 . o0oOOo0O0Ooo
  1929. if 99 - 99: i11iIiiIii - iII111i
  1930. if 85 - 85: I1Ii111 % I1ii11iIi11i
  1931. if 95 - 95: OoO0O00 * OOooOOo * iII111i . o0oOOo0O0Ooo
  1932. if 73 - 73: OoO0O00
  1933. if 28 - 28: OoooooooOO - I11i
  1934. if 84 - 84: II111iiii
  1935. if 36 - 36: OOooOOo - OoOoOO00 - iIii1I11I1II1
  1936. if 10 - 10: I1ii11iIi11i / Ii1I * i1IIi % O0 + I11i
  1937. if 25 - 25: I1Ii111 - Ii1I / O0 . OoooooooOO % I1IiiI . i1IIi
  1938. if 19 - 19: II111iiii / II111iiii % I1ii11iIi11i + oO0o + oO0o + iII111i
  1939. if 4 - 4: o0oOOo0O0Ooo + I11i / iII111i + i1IIi % o0oOOo0O0Ooo % iII111i
  1940. if 80 - 80: Ii1I
  1941. return self . contains_macros
  1942. if 26 - 26: iIii1I11I1II1 . OoooooooOO - iIii1I11I1II1
  1943. if self . ole_file is None :
  1944. for oOo0O0 in self . ole_subfiles :
  1945. if oOo0O0 . detect_vba_macros ( ) :
  1946. self . contains_macros = True
  1947. return True
  1948. if 1 - 1: oO0o + I1Ii111 . I1IiiI
  1949. self . contains_macros = False
  1950. return False
  1951. if 47 - 47: iII111i . OoOoOO00
  1952. o0oOO0 = self . find_vba_projects ( )
  1953. if len ( o0oOO0 ) == 0 :
  1954. self . contains_macros = False
  1955. else :
  1956. self . contains_macros = True
  1957. return self . contains_macros
  1958. if 31 - 31: Ii1I * o0oOOo0O0Ooo * Ii1I + OoO0O00 * o0oOOo0O0Ooo . I1Ii111
  1959. def extract_macros ( self ) :
  1960. if self . ole_file is None :
  1961. if 89 - 89: OoooooooOO * Ii1I * I1IiiI . ooOoO0o * Ii1I / iII111i
  1962. if 46 - 46: i11iIiiIii
  1963. if 15 - 15: O0 / i1IIi / i1IIi . iII111i % OoOoOO00 + I1IiiI
  1964. if 48 - 48: I1Ii111 % iII111i % Ii1I % iIii1I11I1II1 . Ii1I
  1965. if 14 - 14: iII111i * OoO0O00 % O0 + I11i + I1ii11iIi11i
  1966. if 23 - 23: Oo0Ooo % iII111i + Ii1I - I1Ii111
  1967. if 65 - 65: OoooooooOO
  1968. if 22 - 22: OOooOOo + II111iiii + Oo0Ooo
  1969. for oOo0O0 in self . ole_subfiles :
  1970. for ii1iiIi in oOo0O0 . extract_macros ( ) :
  1971. yield ii1iiIi
  1972. else :
  1973. self . find_vba_projects ( )
  1974. for oOooO , iiIIiI1 , ooOOOoOoOOOO in self . vba_projects :
  1975. if 83 - 83: ooOoO0o
  1976. for i1Ii1i11ii , oO0O0oo , OOOOOOO00OO in ooOO0o ( self . ole_file , oOooO , iiIIiI1 ,
  1977. ooOOOoOoOOOO ) :
  1978. yield ( self . filename , i1Ii1i11ii , oO0O0oo , OOOOOOO00OO )
  1979. if 68 - 68: I1IiiI
  1980. if 94 - 94: iII111i / OoOoOO00 % II111iiii . iIii1I11I1II1
  1981. def extract_all_macros ( self ) :
  1982. if self . modules is None :
  1983. if 49 - 49: OOooOOo * I1IiiI / II111iiii
  1984. if 82 - 82: Oo0Ooo / I1IiiI . I1ii11iIi11i - Oo0Ooo
  1985. if 4 - 4: O0 / I11i . OoO0O00 - ooOoO0o / OOooOOo
  1986. if 25 - 25: I11i * OoOoOO00 - Oo0Ooo . ooOoO0o . oO0o
  1987. if 89 - 89: O0 * I11i * OoO0O00
  1988. if 3 - 3: OOooOOo / iII111i * iIii1I11I1II1 + II111iiii / o0oOOo0O0Ooo / IiII
  1989. self . modules = [ ]
  1990. for ( II1I11 , i1Ii1i11ii , oO0O0oo , OOOOOOO00OO ) in self . extract_macros ( ) :
  1991. self . modules . append ( ( II1I11 , i1Ii1i11ii , oO0O0oo , OOOOOOO00OO ) )
  1992. self . nb_macros = len ( self . modules )
  1993. return self . modules
  1994. if 28 - 28: I1Ii111 - II111iiii % i11iIiiIii + iIii1I11I1II1 + II111iiii
  1995. if 60 - 60: i1IIi / I1IiiI . II111iiii . iII111i % oO0o - I1IiiI
  1996. if 39 - 39: I1IiiI . OoO0O00 + I11i + OOooOOo / II111iiii % i11iIiiIii
  1997. def analyze_macros ( self , show_decoded_strings = False ) :
  1998. if self . detect_vba_macros ( ) :
  1999. if 86 - 86: I1ii11iIi11i - i1IIi + Oo0Ooo * I1IiiI / i11iIiiIii % oO0o
  2000. if 17 - 17: ooOoO0o + ooOoO0o . I1ii11iIi11i
  2001. if 50 - 50: iIii1I11I1II1 * oO0o
  2002. if 85 - 85: i1IIi
  2003. if 100 - 100: OoooooooOO / I11i % OoO0O00 + Ii1I
  2004. if self . analysis_results is not None :
  2005. return self . analysis_results
  2006. if 42 - 42: Oo0Ooo / IiII . Ii1I * I1IiiI
  2007. if self . vba_code_all_modules is None :
  2008. self . vba_code_all_modules = ''
  2009. for ( II1I11 , i1Ii1i11ii , oO0O0oo , OOOOOOO00OO ) in self . extract_all_macros ( ) :
  2010. if 54 - 54: OoOoOO00 * iII111i + OoO0O00
  2011. self . vba_code_all_modules += OOOOOOO00OO + '\n'
  2012. if 93 - 93: o0oOOo0O0Ooo / I1IiiI
  2013. iII1IIIiI1I1 = IIII ( self . vba_code_all_modules )
  2014. self . analysis_results = iII1IIIiI1I1 . scan ( show_decoded_strings )
  2015. oOOo , III11iI1i11i , IIiI , OOoOo0oO0oo00 , OO , I1I , o0oO00O = iII1IIIiI1I1 . scan_summary ( )
  2016. self . nb_autoexec += oOOo
  2017. self . nb_suspicious += III11iI1i11i
  2018. self . nb_iocs += IIiI
  2019. self . nb_hexstrings += OOoOo0oO0oo00
  2020. self . nb_base64strings += OO
  2021. self . nb_dridexstrings += I1I
  2022. self . nb_vbastrings += o0oO00O
  2023. if 72 - 72: OoO0O00 - iIii1I11I1II1 . iII111i / Ii1I
  2024. return self . analysis_results
  2025. if 12 - 12: I1IiiI + I1Ii111
  2026. if 80 - 80: oO0o . O0
  2027. if 90 - 90: II111iiii / OoO0O00 / Ii1I
  2028. if 70 - 70: Ii1I - II111iiii . Oo0Ooo / Oo0Ooo
  2029. if 30 - 30: oO0o . OoO0O00 + I11i / iIii1I11I1II1 % Oo0Ooo / oO0o
  2030. def close ( self ) :
  2031. if self . ole_file is None :
  2032. if 3 - 3: I1ii11iIi11i / II111iiii
  2033. if 73 - 73: OoO0O00 * OoooooooOO - OoooooooOO + I1IiiI * Oo0Ooo
  2034. if 87 - 87: o0oOOo0O0Ooo / IiII / i11iIiiIii
  2035. if 95 - 95: i1IIi / Ii1I / Ii1I
  2036. for oOo0O0 in self . ole_subfiles :
  2037. oOo0O0 . close ( )
  2038. else :
  2039. self . ole_file . close ( )
  2040. if 65 - 65: I1Ii111 + iII111i * iII111i
  2041. if 79 - 79: i1IIi / Oo0Ooo - I1IiiI . O0
  2042. if 56 - 56: IiII % O0 * i1IIi - II111iiii
  2043. class Oo0OoOOoo ( O0oOo00oooO ) :
  2044. if 84 - 84: I1Ii111
  2045. if 53 - 53: i1IIi
  2046. if 59 - 59: o0oOOo0O0Ooo + I1IiiI % OoooooooOO - iIii1I11I1II1
  2047. if 9 - 9: i1IIi - OoOoOO00
  2048. if 57 - 57: iIii1I11I1II1 * Ii1I * iII111i / oO0o
  2049. def __init__ ( self , filename , data = None , container = None ) :
  2050. try :
  2051. if 46 - 46: Ii1I
  2052. if 61 - 61: o0oOOo0O0Ooo / ooOoO0o - II111iiii
  2053. if 87 - 87: I1ii11iIi11i / I1IiiI
  2054. if 45 - 45: OoOoOO00 * ooOoO0o / OoooooooOO + OoO0O00 . I1Ii111 / OoO0O00
  2055. if 64 - 64: Ii1I / i1IIi % I1IiiI - o0oOOo0O0Ooo
  2056. if 11 - 11: I1ii11iIi11i - OoooooooOO
  2057. if 16 - 16: IiII % OoooooooOO - ooOoO0o * Ii1I - Ii1I
  2058. if 27 - 27: IiII + iIii1I11I1II1 / Oo0Ooo + OoO0O00 % Oo0Ooo + OoO0O00
  2059. if 77 - 77: Oo0Ooo * ooOoO0o % Ii1I
  2060. if 2 - 2: I11i / Oo0Ooo / Ii1I / I1ii11iIi11i / OoooooooOO
  2061. if 22 - 22: iIii1I11I1II1 * I1IiiI / I11i + OoOoOO00
  2062. if 98 - 98: OOooOOo
  2063. if 69 - 69: II111iiii + Oo0Ooo - oO0o . Oo0Ooo / iIii1I11I1II1 * iIii1I11I1II1
  2064. if 75 - 75: OoO0O00 % OoooooooOO
  2065. O0oOo00oooO . __init__ ( self , filename , data = data , container = container )
  2066. except TypeError :
  2067. if 16 - 16: O0 / i1IIi
  2068. pass
  2069. if 58 - 58: o0oOOo0O0Ooo / i11iIiiIii / O0 % I11i % I1IiiI
  2070. if 86 - 86: IiII + OoOoOO00 / I1IiiI + I11i % I11i / i11iIiiIii
  2071. def print_analysis ( self , show_decoded_strings = False ) :
  2072. if 12 - 12: OoOoOO00 + o0oOOo0O0Ooo . I1Ii111
  2073. if sys . stdout . isatty ( ) :
  2074. if 52 - 52: OoO0O00
  2075. if 4 - 4: Ii1I % I1ii11iIi11i + I11i - I1ii11iIi11i
  2076. if 98 - 98: Ii1I - O0 * oO0o * Ii1I * Ii1I
  2077. if 44 - 44: IiII + I11i
  2078. if 66 - 66: oO0o
  2079. if 34 - 34: iII111i % i11iIiiIii + i11iIiiIii - iII111i
  2080. if 2 - 2: II111iiii + i1IIi
  2081. print 'Analysis...\r' ,
  2082. sys . stdout . flush ( )
  2083. ii1iiIi = self . analyze_macros ( show_decoded_strings )
  2084. if ii1iiIi :
  2085. iII1111III1I = prettytable . PrettyTable ( ( 'Type' , 'Keyword' , 'Description' ) )
  2086. iII1111III1I . align = 'l'
  2087. iII1111III1I . max_width [ 'Type' ] = 10
  2088. iII1111III1I . max_width [ 'Keyword' ] = 20
  2089. iII1111III1I . max_width [ 'Description' ] = 39
  2090. for oO0OO00 , i1iI1Ii11Ii1 , o0oO00o in ii1iiIi :
  2091. if 16 - 16: OoooooooOO / oO0o . Ii1I * ooOoO0o - I1IiiI
  2092. if not i1oO ( i1iI1Ii11Ii1 ) :
  2093. i1iI1Ii11Ii1 = repr ( i1iI1Ii11Ii1 )
  2094. if not i1oO ( o0oO00o ) :
  2095. o0oO00o = repr ( o0oO00o )
  2096. iII1111III1I . add_row ( ( oO0OO00 , i1iI1Ii11Ii1 , o0oO00o ) )
  2097. print iII1111III1I
  2098. else :
  2099. print 'No suspicious keyword or IOC found.'
  2100. if 32 - 32: I1IiiI / OoO0O00
  2101. if 28 - 28: Oo0Ooo / IiII . iII111i + OoO0O00 + I11i % Oo0Ooo
  2102. def reveal ( self ) :
  2103. if 45 - 45: Oo0Ooo / O0 % OoooooooOO
  2104. print 'MACRO SOURCE CODE WITH DEOBFUSCATED VBA STRINGS (EXPERIMENTAL):\n'
  2105. if 92 - 92: Ii1I . OoOoOO00 . I11i - OoooooooOO / ooOoO0o
  2106. ooOo0 = self . analyze_macros ( show_decoded_strings = False )
  2107. if 41 - 41: I1Ii111 + OoO0O00 * I1IiiI * O0 * Oo0Ooo - OoOoOO00
  2108. if 96 - 96: I1IiiI - iIii1I11I1II1
  2109. ooOo0 = sorted ( ooOo0 , key = lambda Ii1o0OOOoo0000 : len ( Ii1o0OOOoo0000 [ 2 ] ) , reverse = True )
  2110. if 19 - 19: OoooooooOO . I1IiiI + I1Ii111 - I1IiiI / I1IiiI % IiII
  2111. IiIIIii1i1iI = self . vba_code_all_modules
  2112. for oO0OO00 , OOoOi1IiiI , oO0Ooooo000 in ooOo0 :
  2113. if oO0OO00 == 'VBA string' :
  2114. if 99 - 99: iIii1I11I1II1 - oO0o - OoOoOO00 / iIii1I11I1II1 * Oo0Ooo - oO0o
  2115. if 72 - 72: IiII % i1IIi / iIii1I11I1II1
  2116. if 95 - 95: O0 . OoO0O00
  2117. OOoOi1IiiI = OOoOi1IiiI . replace ( '"' , '""' )
  2118. IiIIIii1i1iI = IiIIIii1i1iI . replace ( oO0Ooooo000 , '"%s"' % OOoOi1IiiI )
  2119. print ''
  2120. print IiIIIii1i1iI
  2121. if 89 - 89: i1IIi
  2122. if 19 - 19: ooOoO0o / o0oOOo0O0Ooo % IiII - Ii1I
  2123. if 14 - 14: I1ii11iIi11i - i11iIiiIii * I1Ii111
  2124. def process_file ( self , show_decoded_strings = False ,
  2125. display_code = True , global_analysis = True , hide_attributes = True ,
  2126. vba_code_only = False , show_deobfuscated_code = False ) :
  2127. if 39 - 39: OoooooooOO
  2128. if 19 - 19: i11iIiiIii
  2129. if vba_code_only and not display_code :
  2130. if 80 - 80: I1IiiI
  2131. if 58 - 58: oO0o + I1ii11iIi11i % OoOoOO00
  2132. if 22 - 22: iIii1I11I1II1 - Ii1I / I1IiiI * IiII
  2133. if 26 - 26: o0oOOo0O0Ooo + OOooOOo - o0oOOo0O0Ooo + Oo0Ooo . oO0o
  2134. if 97 - 97: i1IIi
  2135. if 46 - 46: I1ii11iIi11i
  2136. if 30 - 30: OoO0O00 / O0 * o0oOOo0O0Ooo * I1Ii111 + OoooooooOO * iII111i
  2137. if 23 - 23: I11i
  2138. if 36 - 36: IiII . iII111i - i1IIi + I1Ii111
  2139. if 54 - 54: OoooooooOO . oO0o - iII111i
  2140. if 76 - 76: I1Ii111
  2141. display_code = True
  2142. if self . container :
  2143. O00o0 = '%s in %s' % ( self . filename , self . container )
  2144. else :
  2145. O00o0 = self . filename
  2146. print '=' * 79
  2147. print 'FILE:' , O00o0
  2148. try :
  2149. if 98 - 98: iIii1I11I1II1 + i11iIiiIii * I1ii11iIi11i / I1Ii111 / ooOoO0o - O0
  2150. print 'Type:' , self . type
  2151. if self . detect_vba_macros ( ) :
  2152. if 42 - 42: iII111i
  2153. for ( II1I11 , i1Ii1i11ii , oO0O0oo , OOOOOOO00OO ) in self . extract_all_macros ( ) :
  2154. if hide_attributes :
  2155. if 77 - 77: i1IIi * oO0o % OoooooooOO + O0 * ooOoO0o
  2156. I11i1iiiiIIIi = I1iI1I1ii1 ( OOOOOOO00OO )
  2157. else :
  2158. I11i1iiiiIIIi = OOOOOOO00OO
  2159. print '-' * 79
  2160. print 'VBA MACRO %s ' % oO0O0oo
  2161. print 'in file: %s - OLE stream: %s' % ( II1I11 , repr ( i1Ii1i11ii ) )
  2162. if display_code :
  2163. print '- ' * 39
  2164. if 13 - 13: O0 + I1Ii111 * II111iiii + Oo0Ooo * IiII
  2165. if I11i1iiiiIIIi . strip ( ) == '' :
  2166. print '(empty macro)'
  2167. else :
  2168. print I11i1iiiiIIIi
  2169. if not global_analysis and not vba_code_only :
  2170. if 12 - 12: IiII - Ii1I % Ii1I
  2171. raise NotImplementedError
  2172. print '- ' * 39
  2173. print 'ANALYSIS:'
  2174. if 23 - 23: ooOoO0o
  2175. self . print_analysis ( show_decoded_strings )
  2176. if global_analysis and not vba_code_only :
  2177. if 61 - 61: IiII + iII111i - OoO0O00 * oO0o
  2178. self . print_analysis ( show_decoded_strings )
  2179. if show_deobfuscated_code :
  2180. self . reveal ( )
  2181. else :
  2182. print 'No VBA macros found.'
  2183. except :
  2184. if 87 - 87: II111iiii % II111iiii
  2185. if 51 - 51: ooOoO0o * iIii1I11I1II1 . iII111i
  2186. if 25 - 25: OOooOOo - Ii1I . I11i
  2187. if 57 - 57: o0oOOo0O0Ooo + Oo0Ooo * I1ii11iIi11i - ooOoO0o % iIii1I11I1II1 - Ii1I
  2188. traceback . print_exc ( )
  2189. print ''
  2190. if 37 - 37: OoO0O00 * I11i + Ii1I + I1ii11iIi11i * o0oOOo0O0Ooo
  2191. if 95 - 95: Ii1I - i11iIiiIii % i11iIiiIii - O0 * I1Ii111
  2192. def process_file_triage ( self ) :
  2193. if 81 - 81: II111iiii * I1IiiI % i1IIi * i11iIiiIii + OoOoOO00
  2194. oo0OoOO000O = ''
  2195. if 62 - 62: i1IIi * iIii1I11I1II1 % oO0o % OoOoOO00 / OoooooooOO
  2196. if 39 - 39: Oo0Ooo % iII111i
  2197. if 90 - 90: I1IiiI * I1ii11iIi11i . I11i * Ii1I - o0oOOo0O0Ooo
  2198. try :
  2199. if self . type is not None :
  2200. if 40 - 40: O0 / IiII - II111iiii + o0oOOo0O0Ooo % Oo0Ooo
  2201. if self . detect_vba_macros ( ) :
  2202. if 93 - 93: ooOoO0o
  2203. if sys . stdout . isatty ( ) :
  2204. print 'Analysis...\r' ,
  2205. sys . stdout . flush ( )
  2206. self . analyze_macros ( )
  2207. OOo0O = ooo [ self . type ]
  2208. IiI11iiIii = oOOo = III11iI1i11i = IIiI = OOoOo0oO0oo00 = i1IIII1II = I1I = O000oO00oO = '-'
  2209. if self . nb_macros : IiI11iiIii = 'M'
  2210. if self . nb_autoexec : oOOo = 'A'
  2211. if self . nb_suspicious : III11iI1i11i = 'S'
  2212. if self . nb_iocs : IIiI = 'I'
  2213. if self . nb_hexstrings : OOoOo0oO0oo00 = 'H'
  2214. if self . nb_base64strings : i1IIII1II = 'B'
  2215. if self . nb_dridexstrings : I1I = 'D'
  2216. if self . nb_vbastrings : O000oO00oO = 'V'
  2217. OOo0O += '%s%s%s%s%s%s%s%s' % ( IiI11iiIii , oOOo , III11iI1i11i , IIiI , OOoOo0oO0oo00 ,
  2218. i1IIII1II , I1I , O000oO00oO )
  2219. if 96 - 96: IiII
  2220. if 99 - 99: iIii1I11I1II1 - ooOoO0o
  2221. if 79 - 79: I1IiiI + oO0o % I11i % oO0o
  2222. if 56 - 56: I1ii11iIi11i + oO0o . OoO0O00 + OoooooooOO * I1ii11iIi11i - O0
  2223. if 35 - 35: OOooOOo . I11i . I1Ii111 - I11i % I11i + I1Ii111
  2224. if 99 - 99: o0oOOo0O0Ooo + OOooOOo
  2225. if 34 - 34: I1Ii111 * o0oOOo0O0Ooo . I1IiiI % i11iIiiIii
  2226. if 61 - 61: iIii1I11I1II1 + oO0o * I11i - i1IIi % oO0o
  2227. if 76 - 76: oO0o / OoOoOO00
  2228. else :
  2229. if 12 - 12: I1Ii111
  2230. if 58 - 58: OoO0O00 + iIii1I11I1II1 % O0 + I11i + OoOoOO00 * OoooooooOO
  2231. OOo0O = '?'
  2232. oo0OoOO000O = 'File format not supported'
  2233. except :
  2234. if 41 - 41: oO0o * I1IiiI
  2235. if 76 - 76: oO0o . O0 * OoooooooOO + ooOoO0o
  2236. if 53 - 53: Oo0Ooo
  2237. if 3 - 3: IiII - OoooooooOO * OoooooooOO - I1IiiI / I1Ii111 * I1ii11iIi11i
  2238. OOo0O = '!ERROR'
  2239. oo0OoOO000O = sys . exc_value
  2240. o0O = '%-12s %s' % ( OOo0O , self . filename )
  2241. if oo0OoOO000O :
  2242. o0O += ' - %s' % oo0OoOO000O
  2243. print o0O
  2244. if 58 - 58: IiII % iIii1I11I1II1 / i11iIiiIii % o0oOOo0O0Ooo . I1Ii111 * iII111i
  2245. if 32 - 32: OoooooooOO + o0oOOo0O0Ooo
  2246. if 91 - 91: ooOoO0o - I1Ii111 * I1Ii111
  2247. if 55 - 55: iIii1I11I1II1 + I1IiiI - Oo0Ooo
  2248. if 24 - 24: OoO0O00 / I1Ii111 + iII111i * I11i * iII111i
  2249. if 10 - 10: I1IiiI - I1ii11iIi11i - Oo0Ooo - o0oOOo0O0Ooo
  2250. if 21 - 21: OoooooooOO + I1Ii111
  2251. if 43 - 43: i11iIiiIii . I1ii11iIi11i . oO0o
  2252. if 31 - 31: Ii1I % o0oOOo0O0Ooo % I1Ii111 . I1ii11iIi11i / o0oOOo0O0Ooo * oO0o
  2253. if 74 - 74: I1IiiI . ooOoO0o / iII111i . IiII
  2254. if 74 - 74: Oo0Ooo / I1Ii111 % I1Ii111 . IiII
  2255. if 72 - 72: i1IIi
  2256. if 21 - 21: I1Ii111 . OOooOOo / i11iIiiIii * i1IIi
  2257. if 82 - 82: ooOoO0o * Oo0Ooo % i11iIiiIii * i1IIi . OOooOOo
  2258. if 89 - 89: IiII - i1IIi - IiII
  2259. if 74 - 74: OoO0O00 % OoO0O00
  2260. if 28 - 28: OoOoOO00 % oO0o - OOooOOo + OOooOOo + oO0o / iIii1I11I1II1
  2261. def oo0o ( ) :
  2262. OOoOoo = 'usage: %prog [options] <filename> [filename2 ...]'
  2263. if 83 - 83: I1ii11iIi11i * iIii1I11I1II1 + OoOoOO00 * i1IIi . OoooooooOO % Ii1I
  2264. if 81 - 81: OoO0O00 - iIii1I11I1II1
  2265. if 60 - 60: I1Ii111
  2266. ooO0 = optparse . OptionParser ( usage = OOoOoo )
  2267. if 35 - 35: Oo0Ooo * oO0o / OoooooooOO + O0 / OoooooooOO / OOooOOo
  2268. if 44 - 44: i1IIi . I1ii11iIi11i - ooOoO0o . OOooOOo . o0oOOo0O0Ooo + oO0o
  2269. if 17 - 17: iIii1I11I1II1 + i1IIi . I1ii11iIi11i + Ii1I % i1IIi . oO0o
  2270. if 57 - 57: oO0o
  2271. ooO0 . add_option ( "-r" , action = "store_true" , dest = "recursive" ,
  2272. help = 'find files recursively in subdirectories.' )
  2273. ooO0 . add_option ( "-z" , "--zip" , dest = 'zip_password' , type = 'str' , default = None ,
  2274. help = 'if the file is a zip archive, open all files from it, using the provided password (requires Python 2.6+)' )
  2275. ooO0 . add_option ( "-f" , "--zipfname" , dest = 'zip_fname' , type = 'str' , default = '*' ,
  2276. help = 'if the file is a zip archive, file(s) to be opened within the zip. Wildcards * and ? are supported. (default:*)' )
  2277. ooO0 . add_option ( "-t" , '--triage' , action = "store_true" , dest = "triage_mode" ,
  2278. help = 'triage mode, display results as a summary table (default for multiple files)' )
  2279. ooO0 . add_option ( "-d" , '--detailed' , action = "store_true" , dest = "detailed_mode" ,
  2280. help = 'detailed mode, display full results (default for single file)' )
  2281. ooO0 . add_option ( "-a" , '--analysis' , action = "store_false" , dest = "display_code" , default = True ,
  2282. help = 'display only analysis results, not the macro source code' )
  2283. ooO0 . add_option ( "-c" , '--code' , action = "store_true" , dest = "vba_code_only" , default = False ,
  2284. help = 'display only VBA source code, do not analyze it' )
  2285. ooO0 . add_option ( "-i" , "--input" , dest = 'input' , type = 'str' , default = None ,
  2286. help = 'input file containing VBA source code to be analyzed (no parsing)' )
  2287. ooO0 . add_option ( "--decode" , action = "store_true" , dest = "show_decoded_strings" ,
  2288. help = 'display all the obfuscated strings with their decoded content (Hex, Base64, StrReverse, Dridex, VBA).' )
  2289. ooO0 . add_option ( "--attr" , action = "store_false" , dest = "hide_attributes" , default = True ,
  2290. help = 'display the attribute lines at the beginning of VBA source code' )
  2291. ooO0 . add_option ( "--reveal" , action = "store_true" , dest = "show_deobfuscated_code" ,
  2292. help = 'display the macro source code after replacing all the obfuscated strings by their decoded content.' )
  2293. if 92 - 92: II111iiii - OoO0O00 - OOooOOo % I1IiiI - OoOoOO00 * I1Ii111
  2294. if 16 - 16: iIii1I11I1II1 + OoooooooOO - ooOoO0o * IiII
  2295. if 37 - 37: iII111i
  2296. if 15 - 15: o0oOOo0O0Ooo % OoO0O00 / iII111i
  2297. if 36 - 36: OoO0O00 + OoO0O00 % Oo0Ooo + Oo0Ooo / i1IIi % i1IIi
  2298. if 20 - 20: OOooOOo * oO0o
  2299. if 91 - 91: OoO0O00 % i1IIi - iIii1I11I1II1 . OOooOOo
  2300. ( IIiiIiIIiI1 , I1IiI ) = ooO0 . parse_args ( )
  2301. if 79 - 79: OoOoOO00 + IiII
  2302. if 14 - 14: I1Ii111 / I11i - OOooOOo * O0 % IiII . O0
  2303. if len ( I1IiI ) == 0 and not IIiiIiIIiI1 . input :
  2304. print __doc__
  2305. ooO0 . print_help ( )
  2306. sys . exit ( )
  2307. if 86 - 86: i1IIi * OoooooooOO
  2308. if 22 - 22: I1Ii111 + iII111i - I11i + iIii1I11I1II1 / I1Ii111 - OoooooooOO
  2309. print 'olevba %s - http://decalage.info/python/oletools' % __version__
  2310. if 42 - 42: OoooooooOO - OoOoOO00 - OOooOOo * I1Ii111
  2311. if 98 - 98: OoO0O00 . iIii1I11I1II1 % Oo0Ooo + OoooooooOO
  2312. logging . basicConfig ( format = '%(levelname)s: %(message)s' , level = logging . WARNING )
  2313. if 2 - 2: I1Ii111 % OoooooooOO - ooOoO0o * I1ii11iIi11i * IiII
  2314. logging . disable ( logging . CRITICAL )
  2315. if 99 - 99: iIii1I11I1II1 . Oo0Ooo / ooOoO0o . OOooOOo % I1IiiI * I11i
  2316. if IIiiIiIIiI1 . input :
  2317. if 95 - 95: oO0o
  2318. raise NotImplementedError
  2319. if 80 - 80: IiII
  2320. print 'Analysis of VBA source code from %s:' % IIiiIiIIiI1 . input
  2321. OOOOOOO00OO = open ( IIiiIiIIiI1 . input ) . read ( )
  2322. print_analysis ( OOOOOOO00OO , show_decoded_strings = IIiiIiIIiI1 . show_decoded_strings )
  2323. sys . exit ( )
  2324. if 42 - 42: OoooooooOO * II111iiii
  2325. if 53 - 53: I1Ii111 + i1IIi . OoO0O00 / i11iIiiIii + Ii1I % OoOoOO00
  2326. if 9 - 9: ooOoO0o . I11i - Oo0Ooo . I1Ii111
  2327. if 39 - 39: OOooOOo
  2328. if 70 - 70: IiII % OoO0O00 % I1IiiI
  2329. if 95 - 95: OoOoOO00 - I1Ii111 / O0 * I1IiiI - o0oOOo0O0Ooo
  2330. if not IIiiIiIIiI1 . detailed_mode or IIiiIiIIiI1 . triage_mode :
  2331. print '%-12s %-65s' % ( 'Flags' , 'Filename' )
  2332. print '%-12s %-65s' % ( '-' * 11 , '-' * 65 )
  2333. if 12 - 12: iIii1I11I1II1 % Oo0Ooo . iII111i . IiII % i11iIiiIii
  2334. IIiI1I11ii1i = None
  2335. o0o = 0
  2336. ooIi1Iii1 = oOOO0oOoo = ooooI11iii1iIIIIi = None
  2337. III1i1iiI1 = None
  2338. for ooIi1Iii1 , oOOO0oOoo , ooooI11iii1iIIIIi in xglob . iter_files ( I1IiI , recursive = IIiiIiIIiI1 . recursive ,
  2339. zip_password = IIiiIiIIiI1 . zip_password , zip_fname = IIiiIiIIiI1 . zip_fname ) :
  2340. if 62 - 62: Ii1I . i11iIiiIii % O0 % I1Ii111 - Oo0Ooo
  2341. if ooIi1Iii1 and oOOO0oOoo . endswith ( '/' ) :
  2342. continue
  2343. if 69 - 69: II111iiii . OoOoOO00 * OoOoOO00 % Ii1I + I1IiiI
  2344. III1i1iiI1 = Oo0OoOOoo ( oOOO0oOoo , data = ooooI11iii1iIIIIi , container = ooIi1Iii1 )
  2345. if IIiiIiIIiI1 . detailed_mode and not IIiiIiIIiI1 . triage_mode :
  2346. if 100 - 100: i11iIiiIii - Oo0Ooo
  2347. III1i1iiI1 . process_file ( show_decoded_strings = IIiiIiIIiI1 . show_decoded_strings ,
  2348. display_code = IIiiIiIIiI1 . display_code , global_analysis = True ,
  2349. hide_attributes = IIiiIiIIiI1 . hide_attributes , vba_code_only = IIiiIiIIiI1 . vba_code_only ,
  2350. show_deobfuscated_code = IIiiIiIIiI1 . show_deobfuscated_code )
  2351. else :
  2352. if 47 - 47: iII111i * OoOoOO00 * IiII
  2353. if ooIi1Iii1 != IIiI1I11ii1i :
  2354. if ooIi1Iii1 is not None :
  2355. print '\nFiles in %s:' % ooIi1Iii1
  2356. IIiI1I11ii1i = ooIi1Iii1
  2357. if 46 - 46: Ii1I
  2358. III1i1iiI1 . process_file_triage ( )
  2359. o0o += 1
  2360. if not IIiiIiIIiI1 . detailed_mode or IIiiIiIIiI1 . triage_mode :
  2361. print '\n(Flags: OpX=OpenXML, XML=Word2003XML, MHT=MHTML, M=Macros, ' 'A=Auto-executable, S=Suspicious keywords, I=IOCs, H=Hex strings, ' 'B=Base64 strings, D=Dridex strings, V=VBA strings, ?=Unknown)\n'
  2362. if 42 - 42: iIii1I11I1II1
  2363. if 32 - 32: Oo0Ooo - Ii1I . OoooooooOO - OoooooooOO - Oo0Ooo . iIii1I11I1II1
  2364. if 34 - 34: Oo0Ooo
  2365. if o0o == 1 and not IIiiIiIIiI1 . triage_mode and not IIiiIiIIiI1 . detailed_mode :
  2366. if 31 - 31: i1IIi - I11i + I1Ii111 + ooOoO0o . ooOoO0o . O0
  2367. III1i1iiI1 . process_file ( show_decoded_strings = IIiiIiIIiI1 . show_decoded_strings ,
  2368. display_code = IIiiIiIIiI1 . display_code , global_analysis = True ,
  2369. hide_attributes = IIiiIiIIiI1 . hide_attributes , vba_code_only = IIiiIiIIiI1 . vba_code_only ,
  2370. show_deobfuscated_code = IIiiIiIIiI1 . show_deobfuscated_code )
  2371. if 33 - 33: i1IIi / iII111i * OoO0O00
  2372. if 2 - 2: oO0o . OOooOOo
  2373. if __name__ == '__main__' :
  2374. oo0o ( )
  2375. if 43 - 43: iIii1I11I1II1
  2376. if 29 - 29: IiII % ooOoO0o + OoO0O00 . i1IIi + I1IiiI
  2377. # dd678faae9ac167bc83abf78e5cb2f3f0688d3a3
Add Comment
Please, Sign In to add comment