librex 0.0.68 → 0.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +18 -16
  4. data/lib/rex.rb +14 -10
  5. data/lib/rex/LICENSE +2 -2
  6. data/lib/rex/arch.rb +76 -76
  7. data/lib/rex/arch/sparc.rb +57 -58
  8. data/lib/rex/arch/x86.rb +506 -496
  9. data/lib/rex/assembly/nasm.rb +83 -84
  10. data/lib/rex/compat.rb +228 -173
  11. data/lib/rex/constants.rb +47 -37
  12. data/lib/rex/elfparsey.rb +0 -3
  13. data/lib/rex/elfparsey/elf.rb +107 -110
  14. data/lib/rex/elfparsey/elfbase.rb +244 -247
  15. data/lib/rex/elfparsey/exceptions.rb +0 -3
  16. data/lib/rex/elfscan.rb +0 -3
  17. data/lib/rex/elfscan/scanner.rb +184 -166
  18. data/lib/rex/elfscan/search.rb +35 -38
  19. data/lib/rex/encoder/alpha2.rb +1 -2
  20. data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
  21. data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
  22. data/lib/rex/encoder/alpha2/generic.rb +77 -78
  23. data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
  24. data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
  25. data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
  26. data/lib/rex/encoder/ndr.rb +68 -68
  27. data/lib/rex/encoder/nonalpha.rb +50 -51
  28. data/lib/rex/encoder/nonupper.rb +50 -51
  29. data/lib/rex/encoder/xdr.rb +78 -78
  30. data/lib/rex/encoder/xor.rb +52 -53
  31. data/lib/rex/encoder/xor/dword.rb +1 -2
  32. data/lib/rex/encoder/xor/dword_additive.rb +1 -2
  33. data/lib/rex/encoders/xor_dword.rb +17 -18
  34. data/lib/rex/encoders/xor_dword_additive.rb +35 -36
  35. data/lib/rex/encoding/xor.rb +0 -1
  36. data/lib/rex/encoding/xor/byte.rb +3 -4
  37. data/lib/rex/encoding/xor/dword.rb +3 -4
  38. data/lib/rex/encoding/xor/dword_additive.rb +72 -73
  39. data/lib/rex/encoding/xor/exceptions.rb +2 -3
  40. data/lib/rex/encoding/xor/generic.rb +129 -130
  41. data/lib/rex/encoding/xor/qword.rb +3 -4
  42. data/lib/rex/encoding/xor/word.rb +3 -4
  43. data/lib/rex/exceptions.rb +100 -101
  44. data/lib/rex/exploitation/cmdstager.rb +3 -3
  45. data/lib/rex/exploitation/cmdstager/base.rb +170 -156
  46. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  47. data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
  48. data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
  49. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  50. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  51. data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
  52. data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
  53. data/lib/rex/exploitation/egghunter.rb +359 -346
  54. data/lib/rex/exploitation/encryptjs.rb +60 -60
  55. data/lib/rex/exploitation/heaplib.rb +76 -76
  56. data/lib/rex/exploitation/js.rb +6 -0
  57. data/lib/rex/exploitation/js/detect.rb +69 -0
  58. data/lib/rex/exploitation/js/memory.rb +81 -0
  59. data/lib/rex/exploitation/js/network.rb +84 -0
  60. data/lib/rex/exploitation/js/utils.rb +33 -0
  61. data/lib/rex/exploitation/jsobfu.rb +448 -424
  62. data/lib/rex/exploitation/obfuscatejs.rb +301 -301
  63. data/lib/rex/exploitation/omelet.rb +257 -257
  64. data/lib/rex/exploitation/opcodedb.rb +699 -699
  65. data/lib/rex/exploitation/ropdb.rb +189 -0
  66. data/lib/rex/exploitation/seh.rb +68 -68
  67. data/lib/rex/file.rb +96 -49
  68. data/lib/rex/image_source.rb +0 -3
  69. data/lib/rex/image_source/disk.rb +45 -48
  70. data/lib/rex/image_source/image_source.rb +33 -36
  71. data/lib/rex/image_source/memory.rb +17 -20
  72. data/lib/rex/io/bidirectional_pipe.rb +118 -115
  73. data/lib/rex/io/datagram_abstraction.rb +13 -14
  74. data/lib/rex/io/ring_buffer.rb +273 -273
  75. data/lib/rex/io/stream.rb +284 -284
  76. data/lib/rex/io/stream_abstraction.rb +183 -181
  77. data/lib/rex/io/stream_server.rb +193 -193
  78. data/lib/rex/job_container.rb +167 -167
  79. data/lib/rex/logging.rb +0 -1
  80. data/lib/rex/logging/log_dispatcher.rb +113 -113
  81. data/lib/rex/logging/log_sink.rb +17 -17
  82. data/lib/rex/logging/sinks/flatfile.rb +36 -36
  83. data/lib/rex/logging/sinks/stderr.rb +27 -27
  84. data/lib/rex/mac_oui.rb +16572 -16571
  85. data/lib/rex/machparsey.rb +0 -1
  86. data/lib/rex/machparsey/exceptions.rb +0 -1
  87. data/lib/rex/machparsey/mach.rb +160 -161
  88. data/lib/rex/machparsey/machbase.rb +367 -368
  89. data/lib/rex/machscan.rb +0 -1
  90. data/lib/rex/machscan/scanner.rb +175 -176
  91. data/lib/rex/mime/encoding.rb +17 -0
  92. data/lib/rex/mime/header.rb +58 -58
  93. data/lib/rex/mime/message.rb +140 -137
  94. data/lib/rex/mime/part.rb +41 -12
  95. data/lib/rex/nop/opty2.rb +90 -90
  96. data/lib/rex/nop/opty2_tables.rb +273 -273
  97. data/lib/rex/ole.rb +0 -4
  98. data/lib/rex/ole/clsid.rb +26 -30
  99. data/lib/rex/ole/difat.rb +121 -125
  100. data/lib/rex/ole/directory.rb +205 -209
  101. data/lib/rex/ole/direntry.rb +217 -221
  102. data/lib/rex/ole/fat.rb +79 -83
  103. data/lib/rex/ole/header.rb +178 -182
  104. data/lib/rex/ole/minifat.rb +49 -53
  105. data/lib/rex/ole/propset.rb +113 -117
  106. data/lib/rex/ole/samples/create_ole.rb +8 -9
  107. data/lib/rex/ole/samples/dir.rb +10 -11
  108. data/lib/rex/ole/samples/dump_stream.rb +14 -15
  109. data/lib/rex/ole/samples/ole_info.rb +5 -6
  110. data/lib/rex/ole/storage.rb +372 -376
  111. data/lib/rex/ole/stream.rb +33 -37
  112. data/lib/rex/ole/substorage.rb +20 -24
  113. data/lib/rex/ole/util.rb +137 -141
  114. data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
  115. data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
  116. data/lib/rex/parser/appscan_nokogiri.rb +359 -359
  117. data/lib/rex/parser/arguments.rb +88 -88
  118. data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
  119. data/lib/rex/parser/ci_nokogiri.rb +184 -184
  120. data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
  121. data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
  122. data/lib/rex/parser/ini.rb +167 -167
  123. data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
  124. data/lib/rex/parser/ip360_xml.rb +77 -77
  125. data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
  126. data/lib/rex/parser/nessus_xml.rb +100 -100
  127. data/lib/rex/parser/netsparker_xml.rb +89 -75
  128. data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
  129. data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
  130. data/lib/rex/parser/nexpose_xml.rb +105 -105
  131. data/lib/rex/parser/nmap_nokogiri.rb +386 -386
  132. data/lib/rex/parser/nmap_xml.rb +116 -116
  133. data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
  134. data/lib/rex/parser/openvas_nokogiri.rb +162 -162
  135. data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
  136. data/lib/rex/parser/retina_xml.rb +90 -90
  137. data/lib/rex/parser/unattend.rb +171 -0
  138. data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
  139. data/lib/rex/payloads/win32/common.rb +14 -14
  140. data/lib/rex/payloads/win32/kernel.rb +36 -36
  141. data/lib/rex/payloads/win32/kernel/common.rb +32 -32
  142. data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
  143. data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
  144. data/lib/rex/peparsey.rb +0 -3
  145. data/lib/rex/peparsey/exceptions.rb +0 -3
  146. data/lib/rex/peparsey/pe.rb +196 -199
  147. data/lib/rex/peparsey/pe_memdump.rb +35 -38
  148. data/lib/rex/peparsey/pebase.rb +1633 -1652
  149. data/lib/rex/peparsey/section.rb +115 -124
  150. data/lib/rex/pescan.rb +0 -3
  151. data/lib/rex/pescan/analyze.rb +351 -351
  152. data/lib/rex/pescan/scanner.rb +182 -182
  153. data/lib/rex/pescan/search.rb +59 -59
  154. data/lib/rex/platforms/windows.rb +37 -37
  155. data/lib/rex/poly.rb +111 -110
  156. data/lib/rex/poly/block.rb +419 -417
  157. data/lib/rex/poly/machine.rb +12 -0
  158. data/lib/rex/poly/machine/machine.rb +829 -0
  159. data/lib/rex/poly/machine/x86.rb +508 -0
  160. data/lib/rex/poly/register.rb +70 -70
  161. data/lib/rex/poly/register/x86.rb +22 -22
  162. data/lib/rex/post.rb +0 -1
  163. data/lib/rex/post/dir.rb +35 -36
  164. data/lib/rex/post/file.rb +140 -141
  165. data/lib/rex/post/file_stat.rb +198 -199
  166. data/lib/rex/post/io.rb +167 -168
  167. data/lib/rex/post/meterpreter.rb +1 -1
  168. data/lib/rex/post/meterpreter/channel.rb +389 -390
  169. data/lib/rex/post/meterpreter/channel_container.rb +33 -34
  170. data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
  171. data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
  172. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
  173. data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
  174. data/lib/rex/post/meterpreter/client.rb +442 -436
  175. data/lib/rex/post/meterpreter/client_core.rb +326 -310
  176. data/lib/rex/post/meterpreter/dependencies.rb +0 -1
  177. data/lib/rex/post/meterpreter/extension.rb +12 -13
  178. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
  179. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  180. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  181. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  182. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  183. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  184. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  185. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  186. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
  187. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  189. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  192. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
  193. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  194. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  195. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
  196. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
  197. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
  198. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
  199. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
  200. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
  201. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
  205. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
  212. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
  213. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
  214. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
  215. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
  242. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
  243. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
  244. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
  245. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
  246. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
  247. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
  257. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
  258. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
  259. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
  260. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
  261. data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
  262. data/lib/rex/post/meterpreter/packet.rb +591 -592
  263. data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
  264. data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
  265. data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
  266. data/lib/rex/post/meterpreter/ui/console.rb +112 -112
  267. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
  268. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
  269. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
  270. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  271. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
  288. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
  289. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
  290. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
  291. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
  292. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
  294. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
  295. data/lib/rex/post/permission.rb +0 -1
  296. data/lib/rex/post/process.rb +39 -40
  297. data/lib/rex/post/thread.rb +41 -42
  298. data/lib/rex/post/ui.rb +35 -36
  299. data/lib/rex/proto/addp.rb +218 -0
  300. data/lib/rex/proto/dcerpc/client.rb +344 -344
  301. data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
  302. data/lib/rex/proto/dcerpc/handle.rb +32 -32
  303. data/lib/rex/proto/dcerpc/ndr.rb +56 -56
  304. data/lib/rex/proto/dcerpc/packet.rb +249 -245
  305. data/lib/rex/proto/dcerpc/response.rb +170 -170
  306. data/lib/rex/proto/dcerpc/uuid.rb +65 -65
  307. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  308. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  309. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  310. data/lib/rex/proto/dhcp.rb +0 -1
  311. data/lib/rex/proto/dhcp/constants.rb +0 -1
  312. data/lib/rex/proto/dhcp/server.rb +303 -304
  313. data/lib/rex/proto/drda/constants.rb +1 -1
  314. data/lib/rex/proto/drda/packet.rb +186 -186
  315. data/lib/rex/proto/drda/utils.rb +104 -104
  316. data/lib/rex/proto/http.rb +1 -0
  317. data/lib/rex/proto/http/client.rb +692 -820
  318. data/lib/rex/proto/http/client_request.rb +472 -0
  319. data/lib/rex/proto/http/handler.rb +25 -25
  320. data/lib/rex/proto/http/handler/erb.rb +104 -104
  321. data/lib/rex/proto/http/handler/proc.rb +37 -37
  322. data/lib/rex/proto/http/header.rb +149 -149
  323. data/lib/rex/proto/http/packet.rb +388 -382
  324. data/lib/rex/proto/http/request.rb +332 -335
  325. data/lib/rex/proto/http/response.rb +132 -72
  326. data/lib/rex/proto/http/server.rb +348 -338
  327. data/lib/rex/proto/iax2/call.rb +310 -310
  328. data/lib/rex/proto/iax2/client.rb +197 -197
  329. data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
  330. data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
  331. data/lib/rex/proto/ipmi.rb +57 -0
  332. data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
  333. data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
  334. data/lib/rex/proto/ipmi/rakp2.rb +35 -0
  335. data/lib/rex/proto/ipmi/utils.rb +125 -0
  336. data/lib/rex/proto/natpmp.rb +1 -5
  337. data/lib/rex/proto/natpmp/constants.rb +4 -4
  338. data/lib/rex/proto/natpmp/packet.rb +25 -25
  339. data/lib/rex/proto/ntlm/base.rb +271 -271
  340. data/lib/rex/proto/ntlm/constants.rb +61 -61
  341. data/lib/rex/proto/ntlm/crypt.rb +348 -352
  342. data/lib/rex/proto/ntlm/exceptions.rb +3 -3
  343. data/lib/rex/proto/ntlm/message.rb +468 -471
  344. data/lib/rex/proto/ntlm/utils.rb +746 -746
  345. data/lib/rex/proto/pjl.rb +30 -0
  346. data/lib/rex/proto/pjl/client.rb +162 -0
  347. data/lib/rex/proto/proxy/socks4a.rb +440 -440
  348. data/lib/rex/proto/rfb.rb +1 -8
  349. data/lib/rex/proto/rfb/cipher.rb +46 -49
  350. data/lib/rex/proto/rfb/client.rb +179 -182
  351. data/lib/rex/proto/rfb/constants.rb +18 -21
  352. data/lib/rex/proto/smb/client.rb +1954 -1843
  353. data/lib/rex/proto/smb/constants.rb +533 -516
  354. data/lib/rex/proto/smb/crypt.rb +21 -21
  355. data/lib/rex/proto/smb/evasions.rb +43 -43
  356. data/lib/rex/proto/smb/exceptions.rb +791 -791
  357. data/lib/rex/proto/smb/simpleclient.rb +142 -286
  358. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  359. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  360. data/lib/rex/proto/smb/utils.rb +81 -81
  361. data/lib/rex/proto/sunrpc/client.rb +158 -158
  362. data/lib/rex/proto/tftp.rb +0 -1
  363. data/lib/rex/proto/tftp/client.rb +289 -289
  364. data/lib/rex/proto/tftp/constants.rb +9 -10
  365. data/lib/rex/proto/tftp/server.rb +466 -467
  366. data/lib/rex/random_identifier_generator.rb +176 -0
  367. data/lib/rex/registry.rb +1 -1
  368. data/lib/rex/registry/hive.rb +88 -88
  369. data/lib/rex/registry/lfkey.rb +25 -25
  370. data/lib/rex/registry/nodekey.rb +30 -30
  371. data/lib/rex/registry/regf.rb +10 -10
  372. data/lib/rex/registry/valuekey.rb +43 -43
  373. data/lib/rex/registry/valuelist.rb +13 -13
  374. data/lib/rex/ropbuilder/rop.rb +254 -253
  375. data/lib/rex/script.rb +21 -22
  376. data/lib/rex/script/base.rb +51 -50
  377. data/lib/rex/script/meterpreter.rb +2 -2
  378. data/lib/rex/service.rb +24 -24
  379. data/lib/rex/service_manager.rb +132 -132
  380. data/lib/rex/services/local_relay.rb +398 -398
  381. data/lib/rex/socket.rb +758 -763
  382. data/lib/rex/socket/comm.rb +95 -95
  383. data/lib/rex/socket/comm/local.rb +507 -440
  384. data/lib/rex/socket/ip.rb +118 -118
  385. data/lib/rex/socket/parameters.rb +351 -350
  386. data/lib/rex/socket/range_walker.rb +445 -368
  387. data/lib/rex/socket/ssl_tcp.rb +323 -317
  388. data/lib/rex/socket/ssl_tcp_server.rb +173 -158
  389. data/lib/rex/socket/subnet_walker.rb +48 -48
  390. data/lib/rex/socket/switch_board.rb +259 -259
  391. data/lib/rex/socket/tcp.rb +58 -56
  392. data/lib/rex/socket/tcp_server.rb +42 -42
  393. data/lib/rex/socket/udp.rb +152 -152
  394. data/lib/rex/sslscan/result.rb +200 -0
  395. data/lib/rex/sslscan/scanner.rb +205 -0
  396. data/lib/rex/struct2.rb +0 -1
  397. data/lib/rex/struct2/c_struct.rb +162 -163
  398. data/lib/rex/struct2/c_struct_template.rb +21 -22
  399. data/lib/rex/struct2/constant.rb +6 -7
  400. data/lib/rex/struct2/element.rb +30 -31
  401. data/lib/rex/struct2/generic.rb +60 -61
  402. data/lib/rex/struct2/restraint.rb +40 -41
  403. data/lib/rex/struct2/s_string.rb +60 -61
  404. data/lib/rex/struct2/s_struct.rb +97 -98
  405. data/lib/rex/sync.rb +0 -1
  406. data/lib/rex/sync/event.rb +62 -72
  407. data/lib/rex/sync/read_write_lock.rb +149 -149
  408. data/lib/rex/sync/ref.rb +42 -42
  409. data/lib/rex/sync/thread_safe.rb +59 -59
  410. data/lib/rex/text.rb +1803 -1315
  411. data/lib/rex/thread_factory.rb +25 -25
  412. data/lib/rex/time.rb +44 -44
  413. data/lib/rex/transformer.rb +91 -91
  414. data/lib/rex/ui/interactive.rb +265 -265
  415. data/lib/rex/ui/output.rb +66 -60
  416. data/lib/rex/ui/progress_tracker.rb +79 -79
  417. data/lib/rex/ui/subscriber.rb +144 -134
  418. data/lib/rex/ui/text/color.rb +76 -76
  419. data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
  420. data/lib/rex/ui/text/input.rb +96 -96
  421. data/lib/rex/ui/text/input/buffer.rb +58 -58
  422. data/lib/rex/ui/text/input/readline.rb +114 -114
  423. data/lib/rex/ui/text/input/socket.rb +77 -77
  424. data/lib/rex/ui/text/input/stdio.rb +24 -24
  425. data/lib/rex/ui/text/irb_shell.rb +45 -41
  426. data/lib/rex/ui/text/output.rb +64 -60
  427. data/lib/rex/ui/text/output/buffer.rb +42 -42
  428. data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
  429. data/lib/rex/ui/text/output/file.rb +24 -24
  430. data/lib/rex/ui/text/output/socket.rb +24 -24
  431. data/lib/rex/ui/text/output/stdio.rb +29 -29
  432. data/lib/rex/ui/text/output/tee.rb +36 -36
  433. data/lib/rex/ui/text/progress_tracker.rb +37 -37
  434. data/lib/rex/ui/text/shell.rb +371 -361
  435. data/lib/rex/ui/text/table.rb +320 -284
  436. data/lib/rex/zip.rb +0 -1
  437. data/lib/rex/zip/archive.rb +115 -94
  438. data/lib/rex/zip/blocks.rb +101 -100
  439. data/lib/rex/zip/entry.rb +108 -99
  440. data/lib/rex/zip/jar.rb +261 -206
  441. data/lib/rex/zip/samples/comment.rb +1 -2
  442. data/lib/rex/zip/samples/mkwar.rb +12 -13
  443. data/lib/rex/zip/samples/mkzip.rb +1 -2
  444. data/lib/rex/zip/samples/recursive.rb +29 -30
  445. metadata +424 -446
  446. data/lib/rex/arch/sparc.rb.ut.rb +0 -19
  447. data/lib/rex/arch/x86.rb.ut.rb +0 -94
  448. data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
  449. data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
  450. data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
  451. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
  452. data/lib/rex/encoding/xor.rb.ts.rb +0 -15
  453. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
  454. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
  455. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
  456. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
  457. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
  458. data/lib/rex/exceptions.rb.ut.rb +0 -45
  459. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
  460. data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
  461. data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
  462. data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
  463. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
  464. data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
  465. data/lib/rex/file.rb.ut.rb +0 -17
  466. data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
  467. data/lib/rex/nop/opty2.rb.ut.rb +0 -24
  468. data/lib/rex/parser/arguments.rb.ut.rb +0 -68
  469. data/lib/rex/parser/ini.rb.ut.rb +0 -30
  470. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
  471. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
  472. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
  473. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
  474. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
  475. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
  476. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
  477. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
  478. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
  479. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
  480. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
  481. data/lib/rex/proto.rb.ts.rb +0 -9
  482. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
  483. data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
  484. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
  485. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
  486. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
  487. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
  488. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
  489. data/lib/rex/proto/drda.rb.ts.rb +0 -18
  490. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
  491. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
  492. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
  493. data/lib/rex/proto/http.rb.ts.rb +0 -13
  494. data/lib/rex/proto/http/client.rb.ut.rb +0 -96
  495. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
  496. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
  497. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
  498. data/lib/rex/proto/http/header.rb.ut.rb +0 -47
  499. data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
  500. data/lib/rex/proto/http/request.rb.ut.rb +0 -215
  501. data/lib/rex/proto/http/response.rb.ut.rb +0 -150
  502. data/lib/rex/proto/http/server.rb.ut.rb +0 -80
  503. data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
  504. data/lib/rex/proto/rfb.rb.ut.rb +0 -40
  505. data/lib/rex/proto/smb.rb.ts.rb +0 -9
  506. data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
  507. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
  508. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
  509. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
  510. data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
  511. data/lib/rex/service_manager.rb.ut.rb +0 -33
  512. data/lib/rex/socket.rb.ut.rb +0 -108
  513. data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
  514. data/lib/rex/socket/parameters.rb.ut.rb +0 -52
  515. data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
  516. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
  517. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
  518. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
  519. data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
  520. data/lib/rex/socket/tcp.rb.ut.rb +0 -65
  521. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
  522. data/lib/rex/socket/udp.rb.ut.rb +0 -45
  523. data/lib/rex/test.rb +0 -36
  524. data/lib/rex/text.rb.ut.rb +0 -193
  525. data/lib/rex/transformer.rb.ut.rb +0 -39
  526. data/lib/rex/ui/text/color.rb.ut.rb +0 -19
  527. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
  528. data/lib/rex/ui/text/table.rb.ut.rb +0 -56
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  module Rex
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  module Rex
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  require 'rex/machparsey/machbase'
@@ -10,198 +9,198 @@ module MachParsey
10
9
 
11
10
 
12
11
  class Mach < MachBase
13
- attr_accessor :mach_header, :segments, :isource, :bits, :endian, :arch, :fat_offset
14
-
15
- def initialize(isource, offset = 0, fat = false)
16
- _parse_mach_header(isource, offset)
17
- if fat == true
18
- self.fat_offset = offset
19
- else
20
- self.fat_offset = 0
21
- end
22
-
23
- self.isource = isource
24
- end
25
-
26
- def _parse_mach_header(isource, offset)
27
- self.mach_header = MachHeader.new(isource.read(offset, MACH_HEADER_SIZE_64))
28
- bits = mach_header.bits
29
- endian = mach_header.endian
30
- ncmds = mach_header.ncmds
31
-
32
- if bits == BITS_32
33
- offset += MACH_HEADER_SIZE
34
- else
35
- offset += MACH_HEADER_SIZE_64
36
- end
37
-
38
-
39
- segments = []
40
- ncmds.times do
41
- load_command = LoadCommand.new(isource.read(offset, LOAD_COMMAND_SIZE), endian)
42
-
43
- case load_command.cmd
44
- when LC_SEGMENT
45
- segments << Segment.new(isource.read(offset, SEGMENT_COMMAND_SIZE), bits, endian)
46
- when LC_SEGMENT_64
47
- segments << Segment.new(isource.read(offset, SEGMENT_COMMAND_SIZE_64), bits, endian)
48
- end
49
-
50
- offset += load_command.cmdsize
51
- end
52
-
53
- self.mach_header = mach_header
54
- self.segments = segments
55
- self.isource = isource
56
- self.bits = bits
57
- self.endian = endian
58
-
59
- return segments
60
- end
61
-
62
- def self.new_from_file(filename, disk_backed = false)
63
-
64
- file = ::File.open(filename, "rb")
65
-
66
- if disk_backed
67
- return self.new(ImageSource::Disk.new(file))
68
- else
69
- obj = new_from_string(file.read)
70
- file.close
71
- return obj
72
- end
73
- end
74
-
75
- def self.new_from_string(data)
76
- return self.new(ImageSource::Memory.new(data))
77
- end
78
-
79
- def ptr_64?
80
- mach_header.bits == BITS_64
81
- end
82
-
83
- def ptr_32?
84
- ptr_64? == false
85
- end
86
-
87
- def ptr_s(vaddr)
88
- (ptr_32?) ? ("0x%.8x" % vaddr) : ("0x%.16x" % vaddr)
89
- end
90
-
91
- def read(offset, len)
92
- isource.read(fat_offset + offset, len)
93
- end
94
-
95
- def index(*args)
96
- isource.index(*args)
97
- end
98
-
99
- def close
100
- isource.close
101
- end
12
+ attr_accessor :mach_header, :segments, :isource, :bits, :endian, :arch, :fat_offset
13
+
14
+ def initialize(isource, offset = 0, fat = false)
15
+ _parse_mach_header(isource, offset)
16
+ if fat == true
17
+ self.fat_offset = offset
18
+ else
19
+ self.fat_offset = 0
20
+ end
21
+
22
+ self.isource = isource
23
+ end
24
+
25
+ def _parse_mach_header(isource, offset)
26
+ self.mach_header = MachHeader.new(isource.read(offset, MACH_HEADER_SIZE_64))
27
+ bits = mach_header.bits
28
+ endian = mach_header.endian
29
+ ncmds = mach_header.ncmds
30
+
31
+ if bits == BITS_32
32
+ offset += MACH_HEADER_SIZE
33
+ else
34
+ offset += MACH_HEADER_SIZE_64
35
+ end
36
+
37
+
38
+ segments = []
39
+ ncmds.times do
40
+ load_command = LoadCommand.new(isource.read(offset, LOAD_COMMAND_SIZE), endian)
41
+
42
+ case load_command.cmd
43
+ when LC_SEGMENT
44
+ segments << Segment.new(isource.read(offset, SEGMENT_COMMAND_SIZE), bits, endian)
45
+ when LC_SEGMENT_64
46
+ segments << Segment.new(isource.read(offset, SEGMENT_COMMAND_SIZE_64), bits, endian)
47
+ end
48
+
49
+ offset += load_command.cmdsize
50
+ end
51
+
52
+ self.mach_header = mach_header
53
+ self.segments = segments
54
+ self.isource = isource
55
+ self.bits = bits
56
+ self.endian = endian
57
+
58
+ return segments
59
+ end
60
+
61
+ def self.new_from_file(filename, disk_backed = false)
62
+
63
+ file = ::File.open(filename, "rb")
64
+
65
+ if disk_backed
66
+ return self.new(ImageSource::Disk.new(file))
67
+ else
68
+ obj = new_from_string(file.read)
69
+ file.close
70
+ return obj
71
+ end
72
+ end
73
+
74
+ def self.new_from_string(data)
75
+ return self.new(ImageSource::Memory.new(data))
76
+ end
77
+
78
+ def ptr_64?
79
+ mach_header.bits == BITS_64
80
+ end
81
+
82
+ def ptr_32?
83
+ ptr_64? == false
84
+ end
85
+
86
+ def ptr_s(vaddr)
87
+ (ptr_32?) ? ("0x%.8x" % vaddr) : ("0x%.16x" % vaddr)
88
+ end
89
+
90
+ def read(offset, len)
91
+ isource.read(fat_offset + offset, len)
92
+ end
93
+
94
+ def index(*args)
95
+ isource.index(*args)
96
+ end
97
+
98
+ def close
99
+ isource.close
100
+ end
102
101
 
103
102
  end
104
103
 
105
104
  class Fat < FatBase
106
- attr_accessor :fat_header, :fat_archs, :machos, :isource
105
+ attr_accessor :fat_header, :fat_archs, :machos, :isource
107
106
 
108
- def initialize(isource, offset = 0)
109
- self.fat_archs = []
110
- self.machos = []
111
- self.isource = isource
112
- self.fat_header = FatHeader.new(isource.read(offset, FAT_HEADER_SIZE))
107
+ def initialize(isource, offset = 0)
108
+ self.fat_archs = []
109
+ self.machos = []
110
+ self.isource = isource
111
+ self.fat_header = FatHeader.new(isource.read(offset, FAT_HEADER_SIZE))
113
112
 
114
- if !self.fat_header
115
- raise FatHeaderError, "Could not parse FAT header"
116
- end
113
+ if !self.fat_header
114
+ raise FatHeaderError, "Could not parse FAT header"
115
+ end
117
116
 
118
- print "Detected " + self.fat_header.nfat_arch.to_s + " archs in binary.\n"
117
+ print "Detected " + self.fat_header.nfat_arch.to_s + " archs in binary.\n"
119
118
 
120
- offset += FAT_HEADER_SIZE
119
+ offset += FAT_HEADER_SIZE
121
120
 
122
- self.fat_header.nfat_arch.times do
123
- fat_arch = FatArch.new(isource.read(offset, FAT_ARCH_SIZE), self.fat_header.endian)
124
- self.fat_archs << fat_arch
125
- self.machos << Mach.new(isource, fat_arch.offset, true)
126
- offset += FAT_ARCH_SIZE
127
- end
121
+ self.fat_header.nfat_arch.times do
122
+ fat_arch = FatArch.new(isource.read(offset, FAT_ARCH_SIZE), self.fat_header.endian)
123
+ self.fat_archs << fat_arch
124
+ self.machos << Mach.new(isource, fat_arch.offset, true)
125
+ offset += FAT_ARCH_SIZE
126
+ end
128
127
 
129
128
 
130
- end
129
+ end
131
130
 
132
- #this is useful for debugging but we don't use it for anything.
133
- def _parse_fat_header(isource, offset)
134
- archs = []
135
- nfat_arch = self.fat_header.nfat_arch
131
+ #this is useful for debugging but we don't use it for anything.
132
+ def _parse_fat_header(isource, offset)
133
+ archs = []
134
+ nfat_arch = self.fat_header.nfat_arch
136
135
 
137
- print "Number of archs in binary: " + nfat_arch.to_s + "\n"
136
+ print "Number of archs in binary: " + nfat_arch.to_s + "\n"
138
137
 
139
- nfat_arch.times do
140
- arch = FatArch.new(isource.read(offset, FAT_ARCH_SIZE), self.endian)
138
+ nfat_arch.times do
139
+ arch = FatArch.new(isource.read(offset, FAT_ARCH_SIZE), self.endian)
141
140
 
142
- case arch.cpu_type
141
+ case arch.cpu_type
143
142
 
144
- when CPU_TYPE_I386
145
- print "i386\n"
143
+ when CPU_TYPE_I386
144
+ print "i386\n"
146
145
 
147
- when CPU_TYPE_X86_64
148
- print "x86_64\n"
146
+ when CPU_TYPE_X86_64
147
+ print "x86_64\n"
149
148
 
150
- when CPU_TYPE_ARM
151
- print "Arm\n"
149
+ when CPU_TYPE_ARM
150
+ print "Arm\n"
152
151
 
153
- when CPU_TYPE_POWERPC
154
- print "Power PC\n"
152
+ when CPU_TYPE_POWERPC
153
+ print "Power PC\n"
155
154
 
156
- when CPU_TYPE_POWERPC64
157
- print "Power PC 64\n"
158
- end
155
+ when CPU_TYPE_POWERPC64
156
+ print "Power PC 64\n"
157
+ end
159
158
 
160
- offset += FAT_ARCH_SIZE
161
- end
162
- end
159
+ offset += FAT_ARCH_SIZE
160
+ end
161
+ end
163
162
 
164
- def self.new_from_file(filename, disk_backed = false)
163
+ def self.new_from_file(filename, disk_backed = false)
165
164
 
166
- file = ::File.open(filename, "rb")
165
+ file = ::File.open(filename, "rb")
167
166
 
168
- if disk_backed
169
- return self.new(ImageSource::Disk.new(file))
170
- else
171
- obj = new_from_string(file.read)
172
- file.close
173
- return obj
174
- end
175
- end
167
+ if disk_backed
168
+ return self.new(ImageSource::Disk.new(file))
169
+ else
170
+ obj = new_from_string(file.read)
171
+ file.close
172
+ return obj
173
+ end
174
+ end
176
175
 
177
176
 
178
- def self.new_from_string(data)
179
- return self.new(ImageSource::Memory.new(data))
180
- end
177
+ def self.new_from_string(data)
178
+ return self.new(ImageSource::Memory.new(data))
179
+ end
181
180
 
182
- def ptr_64?
183
- mach_header.bits == BITS_64
184
- end
181
+ def ptr_64?
182
+ mach_header.bits == BITS_64
183
+ end
185
184
 
186
- def ptr_32?
187
- ptr_64? == false
188
- end
185
+ def ptr_32?
186
+ ptr_64? == false
187
+ end
189
188
 
190
- def ptr_s(vaddr)
191
- (ptr_32?) ? ("0x%.8x" % vaddr) : ("0x%.16x" % vaddr)
192
- end
189
+ def ptr_s(vaddr)
190
+ (ptr_32?) ? ("0x%.8x" % vaddr) : ("0x%.16x" % vaddr)
191
+ end
193
192
 
194
- def read(offset, len)
195
- isource.read(offset, len)
196
- end
193
+ def read(offset, len)
194
+ isource.read(offset, len)
195
+ end
197
196
 
198
- def index(*args)
199
- isource.index(*args)
200
- end
197
+ def index(*args)
198
+ isource.index(*args)
199
+ end
201
200
 
202
- def close
203
- isource.close
204
- end
201
+ def close
202
+ isource.close
203
+ end
205
204
 
206
205
  end
207
206
 
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  require 'rex/struct2'
@@ -10,29 +9,29 @@ require 'rex/machparsey/exceptions'
10
9
  require 'rex/struct2'
11
10
 
12
11
  class GenericStruct
13
- attr_accessor :struct
14
- def initialize(_struct)
15
- self.struct = _struct
16
- end
17
-
18
- # Access a value
19
- def v
20
- struct.v
21
- end
22
-
23
- # Access a value by array
24
- def [](*args)
25
- struct[*args]
26
- end
27
-
28
- # Obtain an array of all fields
29
- def keys
30
- struct.keys
31
- end
32
-
33
- def method_missing(meth, *args)
34
- v[meth.to_s] || (raise NoMethodError.new, meth)
35
- end
12
+ attr_accessor :struct
13
+ def initialize(_struct)
14
+ self.struct = _struct
15
+ end
16
+
17
+ # Access a value
18
+ def v
19
+ struct.v
20
+ end
21
+
22
+ # Access a value by array
23
+ def [](*args)
24
+ struct[*args]
25
+ end
26
+
27
+ # Obtain an array of all fields
28
+ def keys
29
+ struct.keys
30
+ end
31
+
32
+ def method_missing(meth, *args)
33
+ v[meth.to_s] || (raise NoMethodError.new, meth)
34
+ end
36
35
  end
37
36
 
38
37
  class GenericHeader < GenericStruct
@@ -45,362 +44,362 @@ ENDIAN_MSB = 1
45
44
 
46
45
  class MachBase
47
46
 
48
- MH_MAGIC = 0xfeedface
49
- MH_MAGIC_64 = 0xfeedfacf
50
- MH_CIGAM = 0xcefaedfe
51
- MH_CIGAM_64 = 0xcffaedfe
52
- MACH_HEADER_SIZE = 28
53
- MACH_HEADER_SIZE_64 = 32
54
-
55
-
56
- MACH_HEADER_LSB = Rex::Struct2::CStructTemplate.new(
57
- ['uint32v', 'magic', 0],
58
- ['uint32v', 'cputype', 0],
59
- ['uint32v', 'cpusubtype',0],
60
- ['uint32v', 'filetype', 0],
61
- ['uint32v', 'ncmds', 0],
62
- ['uint32v', 'sizeofcmds',0],
63
- ['uint32v', 'flags', 0]
64
- )
65
-
66
- MACH_HEADER_MSB = Rex::Struct2::CStructTemplate.new(
67
- ['uint32n', 'magic', 0],
68
- ['uint32n', 'cputype', 0],
69
- ['uint32n', 'cpusubtype',0],
70
- ['uint32n', 'filetype', 0],
71
- ['uint32n', 'ncmds', 0],
72
- ['uint32n', 'sizeofcmds',0],
73
- ['uint32n', 'flags', 0]
74
- )
75
-
76
-
77
- MACH_HEADER_64_LSB = Rex::Struct2::CStructTemplate.new(
78
- ['uint32v', 'magic', 0],
79
- ['uint32v', 'cputype', 0],
80
- ['uint32v', 'cpusubtype',0],
81
- ['uint32v', 'filetype', 0],
82
- ['uint32v', 'ncmds', 0],
83
- ['uint32v', 'sizeofcmds',0],
84
- ['uint32v', 'flags', 0],
85
- ['uint32v', 'reserved', 0]
86
- )
87
-
88
- MACH_HEADER_64_MSB = Rex::Struct2::CStructTemplate.new(
89
- ['uint32n', 'magic', 0],
90
- ['uint32n', 'cputype', 0],
91
- ['uint32n', 'cpusubtype',0],
92
- ['uint32n', 'filetype', 0],
93
- ['uint32n', 'ncmds', 0],
94
- ['uint32n', 'sizeofcmds',0],
95
- ['uint32n', 'flags', 0],
96
- ['uint32n', 'reserved', 0]
97
- )
98
-
99
- #cpu types for Mach-O binaries
100
- CPU_TYPE_I386 = 0x7
101
- CPU_TYPE_X86_64 = 0x01000007
102
- CPU_TYPE_ARM = 0xC
103
- CPU_TYPE_POWERPC = 0x12
104
- CPU_TYPE_POWERPC64 = 0x01000012
105
-
106
- CPU_SUBTYPE_LITTLE_ENDIAN = 0
107
- CPU_SUBTYPE_BIG_ENDIAN = 1
108
-
109
- LC_SEGMENT = 0x1 #/* segment of this file to be mapped */
110
- LC_SYMTAB = 0x2 #/* link-edit stab symbol table info */
111
- LC_SYMSEG = 0x3 #/* link-edit gdb symbol table info (obsolete) */
112
- LC_THREAD = 0x4 #/* thread */
113
- LC_UNIXTHREAD = 0x5 #/* unix thread (includes a stack) */
114
- LC_LOADFVMLIB = 0x6 #/* load a specified fixed VM shared library */
115
- LC_IDFVMLIB = 0x7 #/* fixed VM shared library identification */
116
- LC_IDENT = 0x8 #/* object identification info (obsolete) */
117
- LC_FVMFILE = 0x9 #/* fixed VM file inclusion (internal use) */
118
- LC_PREPAGE = 0xa #/* prepage command (internal use) */
119
- LC_DYSYMTAB = 0xb #/* dynamic link-edit symbol table info */
120
- LC_LOAD_DYLIB = 0xc #/* load a dynamicly linked shared library */
121
- LC_ID_DYLIB = 0xd #/* dynamicly linked shared lib identification */
122
- LC_LOAD_DYLINKER = 0xe #/* load a dynamic linker */
123
- LC_ID_DYLINKER = 0xf #/* dynamic linker identification */
124
- LC_PREBOUND_DYLIB = 0x10 #/* modules prebound for a dynamicly */
125
- LC_SEGMENT_64 = 0x19 #/* segment of this file to be mapped */
126
-
127
-
128
-
129
-
130
- class MachHeader < GenericHeader
131
- attr_accessor :bits, :endian
132
-
133
- def initialize(rawdata)
134
- mach_header = MACH_HEADER_LSB.make_struct
135
- if !mach_header.from_s(rawdata)
136
- raise MachHeaderError, "Could't access Mach-O Magic", caller
137
- end
138
-
139
- if mach_header.v['magic'] == MH_MAGIC
140
- endian = ENDIAN_LSB
141
- bits = BITS_32
142
- mach_header = MACH_HEADER_LSB.make_struct
143
- elsif mach_header.v['magic'] == MH_CIGAM
144
- bits = BITS_32
145
- endian = ENDIAN_MSB
146
- mach_header = MACH_HEADER_MSB.make_struct
147
- elsif mach_header.v['magic'] == MH_MAGIC_64
148
- endian = ENDIAN_LSB
149
- bits = BITS_64
150
- mach_header = MACH_HEADER_LSB.make_struct
151
- elsif mach_header.v['magic'] == MH_CIGAM_64
152
- endian = ENDIAN_MSB
153
- bits = BITS_64
154
- mach_header = MACH_HEADER_MSB.make_struct
155
- else
156
- raise MachHeaderError, "Couldn't find Mach Magic", caller
157
- end
158
-
159
- if !mach_header.from_s(rawdata)
160
- raise MachHeaderError, "Could't process Mach-O Header", caller
161
- end
162
-
163
- self.struct = mach_header
164
- self.endian = endian
165
- self.bits = bits
166
- end
167
- end
168
-
169
- LOAD_COMMAND_SIZE = 8
170
-
171
- LOAD_COMMAND_LSB = Rex::Struct2::CStructTemplate.new(
172
- ['uint32v','cmd',0],
173
- ['uint32v','cmdsize',0]
174
- )
175
-
176
- LOAD_COMMAND_MSB = Rex::Struct2::CStructTemplate.new(
177
- ['uint32n','cmd',0],
178
- ['uint32n','cmdsize',0]
179
- )
180
-
181
- class LoadCommand < GenericHeader
182
- def initialize(rawdata, endian)
183
-
184
- if endian == ENDIAN_MSB
185
- load_command = LOAD_COMMAND_MSB.make_struct
186
- else
187
- load_command = LOAD_COMMAND_LSB.make_struct
188
- end
189
-
190
- if !load_command.from_s(rawdata)
191
- raise MachParseError, "Couldn't parse load command"
192
- end
193
-
194
- self.struct = load_command
195
-
196
- end
197
- end
198
-
199
- SEGMENT_COMMAND_SIZE = 56
200
-
201
- SEGMENT_COMMAND_LSB = Rex::Struct2::CStructTemplate.new(
202
- ['uint32v', 'cmd', 0],
203
- ['uint32v', 'cmdsize', 0],
204
- ['string', 'segname', 16, ''],
205
- ['uint32v', 'vmaddr', 0],
206
- ['uint32v', 'vmsize', 0],
207
- ['uint32v', 'fileoff', 0],
208
- ['uint32v', 'filesize', 0],
209
- ['uint32v', 'maxprot', 0],
210
- ['uint32v', 'initprot', 0],
211
- ['uint32v', 'nsects', 0],
212
- ['uint32v', 'flags', 0]
213
- )
214
-
215
- SEGMENT_COMMAND_MSB = Rex::Struct2::CStructTemplate.new(
216
- ['uint32n', 'cmd', 0],
217
- ['uint32n', 'cmdsize', 0],
218
- ['string', 'segname', 16, ''],
219
- ['uint32n', 'vmaddr', 0],
220
- ['uint32n', 'vmsize', 0],
221
- ['uint32n', 'fileoff', 0],
222
- ['uint32n', 'filesize', 0],
223
- ['uint32n', 'maxprot', 0],
224
- ['uint32n', 'initprot', 0],
225
- ['uint32n', 'nsects', 0],
226
- ['uint32n', 'flags', 0]
227
- )
228
-
229
- SEGMENT_COMMAND_SIZE_64 = 72
230
-
231
- SEGMENT_COMMAND_64_LSB = Rex::Struct2::CStructTemplate.new(
232
- ['uint32v', 'cmd', 0],
233
- ['uint32v', 'cmdsize', 0],
234
- ['string', 'segname', 16, ''],
235
- ['uint64v', 'vmaddr', 0],
236
- ['uint64v', 'vmsize', 0],
237
- ['uint64v', 'fileoff', 0],
238
- ['uint64v', 'filesize', 0],
239
- ['uint32v', 'maxprot', 0],
240
- ['uint32v', 'initprot', 0],
241
- ['uint32v', 'nsects', 0],
242
- ['uint32v', 'flags', 0]
243
- )
244
-
245
- SEGMENT_COMMAND_64_MSB = Rex::Struct2::CStructTemplate.new(
246
- ['uint32n', 'cmd', 0],
247
- ['uint32n', 'cmdsize', 0],
248
- ['string', 'segname', 16, ''],
249
- ['uint64n', 'vmaddr', 0],
250
- ['uint64n', 'vmsize', 0],
251
- ['uint64n', 'fileoff', 0],
252
- ['uint64n', 'filesize', 0],
253
- ['uint32n', 'maxprot', 0],
254
- ['uint32n', 'initprot', 0],
255
- ['uint32n', 'nsects', 0],
256
- ['uint32n', 'flags', 0]
257
- )
258
-
259
- class Segment < GenericHeader
260
- attr_accessor :_bits, :_endian
261
-
262
- def initialize(rawdata, bits, endian)
263
- self._bits = bits
264
-
265
- if bits == BITS_64
266
- if endian == ENDIAN_MSB
267
- segment_command = SEGMENT_COMMAND_64_MSB.make_struct
268
- else
269
- segment_command = SEGMENT_COMMAND_64_LSB.make_struct
270
- end
271
- else
272
- if endian == ENDIAN_MSB
273
- segment_command = SEGMENT_COMMAND_MSB.make_struct
274
- else
275
- segment_command = SEGMENT_COMMAND_LSB.make_struct
276
- end
277
- end
278
- if !segment_command.from_s(rawdata)
279
- raise MachParseError, "Couldn't parse segment command"
280
- end
281
-
282
- self.struct = segment_command
283
- end
284
-
285
- def Segname
286
- v['segname']
287
- end
288
-
289
- def Vmaddr
290
- v['vmaddr']
291
- end
292
-
293
- def Vmsize
294
- v['vmsize']
295
- end
296
-
297
- def FileOff
298
- v['fileoff']
299
- end
300
-
301
- def FileSize
302
- v['filesize']
303
- end
304
- end
305
-
306
- class Thread < GenericHeader
307
- def initialize(rawdata)
308
- end
309
- end
47
+ MH_MAGIC = 0xfeedface
48
+ MH_MAGIC_64 = 0xfeedfacf
49
+ MH_CIGAM = 0xcefaedfe
50
+ MH_CIGAM_64 = 0xcffaedfe
51
+ MACH_HEADER_SIZE = 28
52
+ MACH_HEADER_SIZE_64 = 32
53
+
54
+
55
+ MACH_HEADER_LSB = Rex::Struct2::CStructTemplate.new(
56
+ ['uint32v', 'magic', 0],
57
+ ['uint32v', 'cputype', 0],
58
+ ['uint32v', 'cpusubtype',0],
59
+ ['uint32v', 'filetype', 0],
60
+ ['uint32v', 'ncmds', 0],
61
+ ['uint32v', 'sizeofcmds',0],
62
+ ['uint32v', 'flags', 0]
63
+ )
64
+
65
+ MACH_HEADER_MSB = Rex::Struct2::CStructTemplate.new(
66
+ ['uint32n', 'magic', 0],
67
+ ['uint32n', 'cputype', 0],
68
+ ['uint32n', 'cpusubtype',0],
69
+ ['uint32n', 'filetype', 0],
70
+ ['uint32n', 'ncmds', 0],
71
+ ['uint32n', 'sizeofcmds',0],
72
+ ['uint32n', 'flags', 0]
73
+ )
74
+
75
+
76
+ MACH_HEADER_64_LSB = Rex::Struct2::CStructTemplate.new(
77
+ ['uint32v', 'magic', 0],
78
+ ['uint32v', 'cputype', 0],
79
+ ['uint32v', 'cpusubtype',0],
80
+ ['uint32v', 'filetype', 0],
81
+ ['uint32v', 'ncmds', 0],
82
+ ['uint32v', 'sizeofcmds',0],
83
+ ['uint32v', 'flags', 0],
84
+ ['uint32v', 'reserved', 0]
85
+ )
86
+
87
+ MACH_HEADER_64_MSB = Rex::Struct2::CStructTemplate.new(
88
+ ['uint32n', 'magic', 0],
89
+ ['uint32n', 'cputype', 0],
90
+ ['uint32n', 'cpusubtype',0],
91
+ ['uint32n', 'filetype', 0],
92
+ ['uint32n', 'ncmds', 0],
93
+ ['uint32n', 'sizeofcmds',0],
94
+ ['uint32n', 'flags', 0],
95
+ ['uint32n', 'reserved', 0]
96
+ )
97
+
98
+ #cpu types for Mach-O binaries
99
+ CPU_TYPE_I386 = 0x7
100
+ CPU_TYPE_X86_64 = 0x01000007
101
+ CPU_TYPE_ARM = 0xC
102
+ CPU_TYPE_POWERPC = 0x12
103
+ CPU_TYPE_POWERPC64 = 0x01000012
104
+
105
+ CPU_SUBTYPE_LITTLE_ENDIAN = 0
106
+ CPU_SUBTYPE_BIG_ENDIAN = 1
107
+
108
+ LC_SEGMENT = 0x1 #/* segment of this file to be mapped */
109
+ LC_SYMTAB = 0x2 #/* link-edit stab symbol table info */
110
+ LC_SYMSEG = 0x3 #/* link-edit gdb symbol table info (obsolete) */
111
+ LC_THREAD = 0x4 #/* thread */
112
+ LC_UNIXTHREAD = 0x5 #/* unix thread (includes a stack) */
113
+ LC_LOADFVMLIB = 0x6 #/* load a specified fixed VM shared library */
114
+ LC_IDFVMLIB = 0x7 #/* fixed VM shared library identification */
115
+ LC_IDENT = 0x8 #/* object identification info (obsolete) */
116
+ LC_FVMFILE = 0x9 #/* fixed VM file inclusion (internal use) */
117
+ LC_PREPAGE = 0xa #/* prepage command (internal use) */
118
+ LC_DYSYMTAB = 0xb #/* dynamic link-edit symbol table info */
119
+ LC_LOAD_DYLIB = 0xc #/* load a dynamicly linked shared library */
120
+ LC_ID_DYLIB = 0xd #/* dynamicly linked shared lib identification */
121
+ LC_LOAD_DYLINKER = 0xe #/* load a dynamic linker */
122
+ LC_ID_DYLINKER = 0xf #/* dynamic linker identification */
123
+ LC_PREBOUND_DYLIB = 0x10 #/* modules prebound for a dynamicly */
124
+ LC_SEGMENT_64 = 0x19 #/* segment of this file to be mapped */
125
+
126
+
127
+
128
+
129
+ class MachHeader < GenericHeader
130
+ attr_accessor :bits, :endian
131
+
132
+ def initialize(rawdata)
133
+ mach_header = MACH_HEADER_LSB.make_struct
134
+ if !mach_header.from_s(rawdata)
135
+ raise MachHeaderError, "Could't access Mach-O Magic", caller
136
+ end
137
+
138
+ if mach_header.v['magic'] == MH_MAGIC
139
+ endian = ENDIAN_LSB
140
+ bits = BITS_32
141
+ mach_header = MACH_HEADER_LSB.make_struct
142
+ elsif mach_header.v['magic'] == MH_CIGAM
143
+ bits = BITS_32
144
+ endian = ENDIAN_MSB
145
+ mach_header = MACH_HEADER_MSB.make_struct
146
+ elsif mach_header.v['magic'] == MH_MAGIC_64
147
+ endian = ENDIAN_LSB
148
+ bits = BITS_64
149
+ mach_header = MACH_HEADER_LSB.make_struct
150
+ elsif mach_header.v['magic'] == MH_CIGAM_64
151
+ endian = ENDIAN_MSB
152
+ bits = BITS_64
153
+ mach_header = MACH_HEADER_MSB.make_struct
154
+ else
155
+ raise MachHeaderError, "Couldn't find Mach Magic", caller
156
+ end
157
+
158
+ if !mach_header.from_s(rawdata)
159
+ raise MachHeaderError, "Could't process Mach-O Header", caller
160
+ end
161
+
162
+ self.struct = mach_header
163
+ self.endian = endian
164
+ self.bits = bits
165
+ end
166
+ end
167
+
168
+ LOAD_COMMAND_SIZE = 8
169
+
170
+ LOAD_COMMAND_LSB = Rex::Struct2::CStructTemplate.new(
171
+ ['uint32v','cmd',0],
172
+ ['uint32v','cmdsize',0]
173
+ )
174
+
175
+ LOAD_COMMAND_MSB = Rex::Struct2::CStructTemplate.new(
176
+ ['uint32n','cmd',0],
177
+ ['uint32n','cmdsize',0]
178
+ )
179
+
180
+ class LoadCommand < GenericHeader
181
+ def initialize(rawdata, endian)
182
+
183
+ if endian == ENDIAN_MSB
184
+ load_command = LOAD_COMMAND_MSB.make_struct
185
+ else
186
+ load_command = LOAD_COMMAND_LSB.make_struct
187
+ end
188
+
189
+ if !load_command.from_s(rawdata)
190
+ raise MachParseError, "Couldn't parse load command"
191
+ end
192
+
193
+ self.struct = load_command
194
+
195
+ end
196
+ end
197
+
198
+ SEGMENT_COMMAND_SIZE = 56
199
+
200
+ SEGMENT_COMMAND_LSB = Rex::Struct2::CStructTemplate.new(
201
+ ['uint32v', 'cmd', 0],
202
+ ['uint32v', 'cmdsize', 0],
203
+ ['string', 'segname', 16, ''],
204
+ ['uint32v', 'vmaddr', 0],
205
+ ['uint32v', 'vmsize', 0],
206
+ ['uint32v', 'fileoff', 0],
207
+ ['uint32v', 'filesize', 0],
208
+ ['uint32v', 'maxprot', 0],
209
+ ['uint32v', 'initprot', 0],
210
+ ['uint32v', 'nsects', 0],
211
+ ['uint32v', 'flags', 0]
212
+ )
213
+
214
+ SEGMENT_COMMAND_MSB = Rex::Struct2::CStructTemplate.new(
215
+ ['uint32n', 'cmd', 0],
216
+ ['uint32n', 'cmdsize', 0],
217
+ ['string', 'segname', 16, ''],
218
+ ['uint32n', 'vmaddr', 0],
219
+ ['uint32n', 'vmsize', 0],
220
+ ['uint32n', 'fileoff', 0],
221
+ ['uint32n', 'filesize', 0],
222
+ ['uint32n', 'maxprot', 0],
223
+ ['uint32n', 'initprot', 0],
224
+ ['uint32n', 'nsects', 0],
225
+ ['uint32n', 'flags', 0]
226
+ )
227
+
228
+ SEGMENT_COMMAND_SIZE_64 = 72
229
+
230
+ SEGMENT_COMMAND_64_LSB = Rex::Struct2::CStructTemplate.new(
231
+ ['uint32v', 'cmd', 0],
232
+ ['uint32v', 'cmdsize', 0],
233
+ ['string', 'segname', 16, ''],
234
+ ['uint64v', 'vmaddr', 0],
235
+ ['uint64v', 'vmsize', 0],
236
+ ['uint64v', 'fileoff', 0],
237
+ ['uint64v', 'filesize', 0],
238
+ ['uint32v', 'maxprot', 0],
239
+ ['uint32v', 'initprot', 0],
240
+ ['uint32v', 'nsects', 0],
241
+ ['uint32v', 'flags', 0]
242
+ )
243
+
244
+ SEGMENT_COMMAND_64_MSB = Rex::Struct2::CStructTemplate.new(
245
+ ['uint32n', 'cmd', 0],
246
+ ['uint32n', 'cmdsize', 0],
247
+ ['string', 'segname', 16, ''],
248
+ ['uint64n', 'vmaddr', 0],
249
+ ['uint64n', 'vmsize', 0],
250
+ ['uint64n', 'fileoff', 0],
251
+ ['uint64n', 'filesize', 0],
252
+ ['uint32n', 'maxprot', 0],
253
+ ['uint32n', 'initprot', 0],
254
+ ['uint32n', 'nsects', 0],
255
+ ['uint32n', 'flags', 0]
256
+ )
257
+
258
+ class Segment < GenericHeader
259
+ attr_accessor :_bits, :_endian
260
+
261
+ def initialize(rawdata, bits, endian)
262
+ self._bits = bits
263
+
264
+ if bits == BITS_64
265
+ if endian == ENDIAN_MSB
266
+ segment_command = SEGMENT_COMMAND_64_MSB.make_struct
267
+ else
268
+ segment_command = SEGMENT_COMMAND_64_LSB.make_struct
269
+ end
270
+ else
271
+ if endian == ENDIAN_MSB
272
+ segment_command = SEGMENT_COMMAND_MSB.make_struct
273
+ else
274
+ segment_command = SEGMENT_COMMAND_LSB.make_struct
275
+ end
276
+ end
277
+ if !segment_command.from_s(rawdata)
278
+ raise MachParseError, "Couldn't parse segment command"
279
+ end
280
+
281
+ self.struct = segment_command
282
+ end
283
+
284
+ def Segname
285
+ v['segname']
286
+ end
287
+
288
+ def Vmaddr
289
+ v['vmaddr']
290
+ end
291
+
292
+ def Vmsize
293
+ v['vmsize']
294
+ end
295
+
296
+ def FileOff
297
+ v['fileoff']
298
+ end
299
+
300
+ def FileSize
301
+ v['filesize']
302
+ end
303
+ end
304
+
305
+ class Thread < GenericHeader
306
+ def initialize(rawdata)
307
+ end
308
+ end
310
309
  end
311
310
 
312
- FAT_MAGIC = 0xcafebabe
313
- FAT_CIGAM = 0xbebafeca
314
- FAT_HEADER_SIZE = 8
311
+ FAT_MAGIC = 0xcafebabe
312
+ FAT_CIGAM = 0xbebafeca
313
+ FAT_HEADER_SIZE = 8
315
314
 
316
- FAT_HEADER_LSB = Rex::Struct2::CStructTemplate.new(
317
- ['uint32v', 'magic', 0],
318
- ['uint32v', 'nfat_arch',0]
319
- )
315
+ FAT_HEADER_LSB = Rex::Struct2::CStructTemplate.new(
316
+ ['uint32v', 'magic', 0],
317
+ ['uint32v', 'nfat_arch',0]
318
+ )
320
319
 
321
- FAT_HEADER_MSB = Rex::Struct2::CStructTemplate.new(
322
- ['uint32n', 'magic', 0],
323
- ['uint32n', 'nfat_arch',0]
324
- )
320
+ FAT_HEADER_MSB = Rex::Struct2::CStructTemplate.new(
321
+ ['uint32n', 'magic', 0],
322
+ ['uint32n', 'nfat_arch',0]
323
+ )
325
324
 
326
325
 
327
- FAT_ARCH_SIZE = 20
326
+ FAT_ARCH_SIZE = 20
328
327
 
329
- FAT_ARCH_LSB = Rex::Struct2::CStructTemplate.new(
330
- ['uint32v', 'cpu_type', 0],
331
- ['uint32v', 'cpu_subtype',0],
332
- ['uint32v', 'offset', 0],
333
- ['uint32v', 'size', 0],
334
- ['uint32v', 'align', 0]
335
- )
328
+ FAT_ARCH_LSB = Rex::Struct2::CStructTemplate.new(
329
+ ['uint32v', 'cpu_type', 0],
330
+ ['uint32v', 'cpu_subtype',0],
331
+ ['uint32v', 'offset', 0],
332
+ ['uint32v', 'size', 0],
333
+ ['uint32v', 'align', 0]
334
+ )
336
335
 
337
- FAT_ARCH_MSB = Rex::Struct2::CStructTemplate.new(
338
- ['uint32n', 'cpu_type', 0],
339
- ['uint32n', 'cpu_subtype',0],
340
- ['uint32n', 'offset', 0],
341
- ['uint32n', 'size', 0],
342
- ['uint32n', 'align', 0]
343
- )
336
+ FAT_ARCH_MSB = Rex::Struct2::CStructTemplate.new(
337
+ ['uint32n', 'cpu_type', 0],
338
+ ['uint32n', 'cpu_subtype',0],
339
+ ['uint32n', 'offset', 0],
340
+ ['uint32n', 'size', 0],
341
+ ['uint32n', 'align', 0]
342
+ )
344
343
 
345
344
 
346
345
  class FatBase
347
346
 
348
- class FatHeader < GenericHeader
349
- attr_accessor :nfat_arch, :endian, :exists
350
-
351
- def initialize(rawdata)
352
- fat_header = FAT_HEADER_LSB.make_struct
353
- if !fat_header.from_s(rawdata)
354
- #raise something
355
- end
356
-
357
- magic = fat_header.v['magic']
358
- if magic == FAT_MAGIC
359
- endian = ENDIAN_LSB
360
- elsif magic == FAT_CIGAM
361
- endian = ENDIAN_MSB
362
- fat_header = FAT_HEADER_MSB.make_struct
363
- if !fat_header.from_s(rawdata)
364
- raise FatHeaderError, "Could not parse FAT header"
365
- end
366
- else
367
- self.exists = 0
368
- return
369
- end
370
-
371
- self.nfat_arch = fat_header.v['nfat_arch']
372
- self.struct = fat_header
373
- self.endian = endian
374
- end
375
- end
376
-
377
- class FatArch < GenericHeader
378
- attr_accessor :cpu_type, :cpu_subtype, :offset, :size
379
-
380
- def initialize(rawdata, endian)
381
- if endian == ENDIAN_LSB
382
- fat_arch = FAT_ARCH_LSB.make_struct
383
- else
384
- fat_arch = FAT_ARCH_MSB.make_struct
385
- end
386
-
387
- if !fat_arch.from_s(rawdata)
388
- raise FatHeaderError, "Could not parse arch from FAT header"
389
- end
390
-
391
- self.cpu_type = fat_arch.v['cpu_type']
392
- self.cpu_subtype = fat_arch.v['cpu_subtype']
393
- self.offset = fat_arch.v['offset']
394
- self.size = fat_arch.v['size']
395
- self.struct = fat_arch
396
- end
397
-
398
- end
399
-
400
- class Thread < GenericHeader
401
- def initialize(rawdata)
402
- end
403
- end
347
+ class FatHeader < GenericHeader
348
+ attr_accessor :nfat_arch, :endian, :exists
349
+
350
+ def initialize(rawdata)
351
+ fat_header = FAT_HEADER_LSB.make_struct
352
+ if !fat_header.from_s(rawdata)
353
+ #raise something
354
+ end
355
+
356
+ magic = fat_header.v['magic']
357
+ if magic == FAT_MAGIC
358
+ endian = ENDIAN_LSB
359
+ elsif magic == FAT_CIGAM
360
+ endian = ENDIAN_MSB
361
+ fat_header = FAT_HEADER_MSB.make_struct
362
+ if !fat_header.from_s(rawdata)
363
+ raise FatHeaderError, "Could not parse FAT header"
364
+ end
365
+ else
366
+ self.exists = 0
367
+ return
368
+ end
369
+
370
+ self.nfat_arch = fat_header.v['nfat_arch']
371
+ self.struct = fat_header
372
+ self.endian = endian
373
+ end
374
+ end
375
+
376
+ class FatArch < GenericHeader
377
+ attr_accessor :cpu_type, :cpu_subtype, :offset, :size
378
+
379
+ def initialize(rawdata, endian)
380
+ if endian == ENDIAN_LSB
381
+ fat_arch = FAT_ARCH_LSB.make_struct
382
+ else
383
+ fat_arch = FAT_ARCH_MSB.make_struct
384
+ end
385
+
386
+ if !fat_arch.from_s(rawdata)
387
+ raise FatHeaderError, "Could not parse arch from FAT header"
388
+ end
389
+
390
+ self.cpu_type = fat_arch.v['cpu_type']
391
+ self.cpu_subtype = fat_arch.v['cpu_subtype']
392
+ self.offset = fat_arch.v['offset']
393
+ self.size = fat_arch.v['size']
394
+ self.struct = fat_arch
395
+ end
396
+
397
+ end
398
+
399
+ class Thread < GenericHeader
400
+ def initialize(rawdata)
401
+ end
402
+ end
404
403
 
405
404
 
406
405
  end