librex 0.0.1

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 (370) hide show
  1. data/README +4 -0
  2. data/lib/rex.rb +101 -0
  3. data/lib/rex.rb.ts.rb +70 -0
  4. data/lib/rex/LICENSE +29 -0
  5. data/lib/rex/arch.rb +103 -0
  6. data/lib/rex/arch/sparc.rb +75 -0
  7. data/lib/rex/arch/sparc.rb.ut.rb +18 -0
  8. data/lib/rex/arch/x86.rb +513 -0
  9. data/lib/rex/arch/x86.rb.ut.rb +93 -0
  10. data/lib/rex/assembly/nasm.rb +100 -0
  11. data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
  12. data/lib/rex/codepage.map +104 -0
  13. data/lib/rex/compat.rb +281 -0
  14. data/lib/rex/constants.rb +113 -0
  15. data/lib/rex/elfparsey.rb +11 -0
  16. data/lib/rex/elfparsey/elf.rb +123 -0
  17. data/lib/rex/elfparsey/elfbase.rb +260 -0
  18. data/lib/rex/elfparsey/exceptions.rb +27 -0
  19. data/lib/rex/elfscan.rb +12 -0
  20. data/lib/rex/elfscan/scanner.rb +207 -0
  21. data/lib/rex/elfscan/search.rb +46 -0
  22. data/lib/rex/encoder/alpha2.rb +31 -0
  23. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  24. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  25. data/lib/rex/encoder/alpha2/generic.rb +113 -0
  26. data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
  27. data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
  28. data/lib/rex/encoder/ndr.rb +89 -0
  29. data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
  30. data/lib/rex/encoder/nonalpha.rb +61 -0
  31. data/lib/rex/encoder/nonupper.rb +64 -0
  32. data/lib/rex/encoder/xdr.rb +106 -0
  33. data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
  34. data/lib/rex/encoder/xor.rb +69 -0
  35. data/lib/rex/encoder/xor/dword.rb +13 -0
  36. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  37. data/lib/rex/encoders/xor_dword.rb +35 -0
  38. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  39. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
  40. data/lib/rex/encoding/xor.rb +20 -0
  41. data/lib/rex/encoding/xor.rb.ts.rb +14 -0
  42. data/lib/rex/encoding/xor/byte.rb +15 -0
  43. data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
  44. data/lib/rex/encoding/xor/dword.rb +21 -0
  45. data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
  46. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  47. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
  48. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  49. data/lib/rex/encoding/xor/generic.rb +146 -0
  50. data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
  51. data/lib/rex/encoding/xor/qword.rb +15 -0
  52. data/lib/rex/encoding/xor/word.rb +21 -0
  53. data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
  54. data/lib/rex/exceptions.rb +275 -0
  55. data/lib/rex/exceptions.rb.ut.rb +44 -0
  56. data/lib/rex/exploitation/cmdstager.rb +133 -0
  57. data/lib/rex/exploitation/egghunter.rb +143 -0
  58. data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
  59. data/lib/rex/exploitation/encryptjs.rb +77 -0
  60. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  61. data/lib/rex/exploitation/heaplib.rb +94 -0
  62. data/lib/rex/exploitation/javascriptosdetect.rb +735 -0
  63. data/lib/rex/exploitation/obfuscatejs.rb +335 -0
  64. data/lib/rex/exploitation/opcodedb.rb +818 -0
  65. data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
  66. data/lib/rex/exploitation/seh.rb +92 -0
  67. data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
  68. data/lib/rex/file.rb +84 -0
  69. data/lib/rex/file.rb.ut.rb +16 -0
  70. data/lib/rex/image_source.rb +12 -0
  71. data/lib/rex/image_source/disk.rb +60 -0
  72. data/lib/rex/image_source/image_source.rb +46 -0
  73. data/lib/rex/image_source/memory.rb +37 -0
  74. data/lib/rex/io/bidirectional_pipe.rb +157 -0
  75. data/lib/rex/io/datagram_abstraction.rb +35 -0
  76. data/lib/rex/io/stream.rb +313 -0
  77. data/lib/rex/io/stream_abstraction.rb +186 -0
  78. data/lib/rex/io/stream_server.rb +211 -0
  79. data/lib/rex/job_container.rb +202 -0
  80. data/lib/rex/logging.rb +4 -0
  81. data/lib/rex/logging/log_dispatcher.rb +179 -0
  82. data/lib/rex/logging/log_sink.rb +42 -0
  83. data/lib/rex/logging/sinks/flatfile.rb +55 -0
  84. data/lib/rex/logging/sinks/stderr.rb +43 -0
  85. data/lib/rex/machparsey.rb +9 -0
  86. data/lib/rex/machparsey/exceptions.rb +34 -0
  87. data/lib/rex/machparsey/mach.rb +209 -0
  88. data/lib/rex/machparsey/machbase.rb +408 -0
  89. data/lib/rex/machscan.rb +9 -0
  90. data/lib/rex/machscan/scanner.rb +217 -0
  91. data/lib/rex/mime.rb +9 -0
  92. data/lib/rex/mime/header.rb +75 -0
  93. data/lib/rex/mime/message.rb +112 -0
  94. data/lib/rex/mime/part.rb +20 -0
  95. data/lib/rex/nop/opty2.rb +108 -0
  96. data/lib/rex/nop/opty2.rb.ut.rb +23 -0
  97. data/lib/rex/nop/opty2_tables.rb +300 -0
  98. data/lib/rex/ole.rb +128 -0
  99. data/lib/rex/ole/clsid.rb +47 -0
  100. data/lib/rex/ole/difat.rb +141 -0
  101. data/lib/rex/ole/directory.rb +230 -0
  102. data/lib/rex/ole/direntry.rb +240 -0
  103. data/lib/rex/ole/fat.rb +99 -0
  104. data/lib/rex/ole/header.rb +204 -0
  105. data/lib/rex/ole/minifat.rb +77 -0
  106. data/lib/rex/ole/samples/create_ole.rb +27 -0
  107. data/lib/rex/ole/samples/dir.rb +35 -0
  108. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  109. data/lib/rex/ole/samples/ole_info.rb +23 -0
  110. data/lib/rex/ole/storage.rb +395 -0
  111. data/lib/rex/ole/stream.rb +53 -0
  112. data/lib/rex/ole/substorage.rb +49 -0
  113. data/lib/rex/ole/util.rb +157 -0
  114. data/lib/rex/parser/arguments.rb +97 -0
  115. data/lib/rex/parser/arguments.rb.ut.rb +67 -0
  116. data/lib/rex/parser/ini.rb +185 -0
  117. data/lib/rex/parser/ini.rb.ut.rb +29 -0
  118. data/lib/rex/parser/nmap_xml.rb +111 -0
  119. data/lib/rex/payloads.rb +1 -0
  120. data/lib/rex/payloads/win32.rb +2 -0
  121. data/lib/rex/payloads/win32/common.rb +26 -0
  122. data/lib/rex/payloads/win32/kernel.rb +53 -0
  123. data/lib/rex/payloads/win32/kernel/common.rb +54 -0
  124. data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
  125. data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
  126. data/lib/rex/payloads/win32/kernel/stager.rb +171 -0
  127. data/lib/rex/peparsey.rb +12 -0
  128. data/lib/rex/peparsey/exceptions.rb +32 -0
  129. data/lib/rex/peparsey/pe.rb +188 -0
  130. data/lib/rex/peparsey/pe_memdump.rb +63 -0
  131. data/lib/rex/peparsey/pebase.rb +1655 -0
  132. data/lib/rex/peparsey/section.rb +136 -0
  133. data/lib/rex/pescan.rb +13 -0
  134. data/lib/rex/pescan/analyze.rb +309 -0
  135. data/lib/rex/pescan/scanner.rb +206 -0
  136. data/lib/rex/pescan/search.rb +56 -0
  137. data/lib/rex/platforms.rb +1 -0
  138. data/lib/rex/platforms/windows.rb +51 -0
  139. data/lib/rex/poly.rb +132 -0
  140. data/lib/rex/poly/block.rb +468 -0
  141. data/lib/rex/poly/register.rb +100 -0
  142. data/lib/rex/poly/register/x86.rb +40 -0
  143. data/lib/rex/post.rb +8 -0
  144. data/lib/rex/post/dir.rb +51 -0
  145. data/lib/rex/post/file.rb +172 -0
  146. data/lib/rex/post/file_stat.rb +220 -0
  147. data/lib/rex/post/gen.pl +13 -0
  148. data/lib/rex/post/io.rb +182 -0
  149. data/lib/rex/post/meterpreter.rb +4 -0
  150. data/lib/rex/post/meterpreter/channel.rb +438 -0
  151. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  152. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  153. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  154. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  155. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  156. data/lib/rex/post/meterpreter/client.rb +335 -0
  157. data/lib/rex/post/meterpreter/client_core.rb +274 -0
  158. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  159. data/lib/rex/post/meterpreter/extension.rb +32 -0
  160. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  161. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
  162. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  163. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
  164. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  165. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  166. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +104 -0
  167. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
  168. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +100 -0
  169. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +24 -0
  170. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
  171. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +273 -0
  172. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +235 -0
  173. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
  174. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  175. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
  176. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
  177. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
  178. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
  179. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +167 -0
  180. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
  181. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +192 -0
  182. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +139 -0
  183. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
  184. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +184 -0
  185. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  186. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
  187. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  189. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  190. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  191. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  192. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
  193. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +182 -0
  194. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  195. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +174 -0
  196. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +185 -0
  197. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
  198. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  199. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  200. data/lib/rex/post/meterpreter/packet.rb +596 -0
  201. data/lib/rex/post/meterpreter/packet_dispatcher.rb +409 -0
  202. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  203. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  204. data/lib/rex/post/meterpreter/ui/console.rb +135 -0
  205. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
  206. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +595 -0
  207. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
  208. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
  209. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
  210. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
  211. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
  212. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
  213. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
  214. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +63 -0
  215. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +376 -0
  216. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +270 -0
  217. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +484 -0
  218. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
  219. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
  220. data/lib/rex/post/permission.rb +26 -0
  221. data/lib/rex/post/process.rb +57 -0
  222. data/lib/rex/post/thread.rb +57 -0
  223. data/lib/rex/post/ui.rb +52 -0
  224. data/lib/rex/proto.rb +12 -0
  225. data/lib/rex/proto.rb.ts.rb +8 -0
  226. data/lib/rex/proto/dcerpc.rb +6 -0
  227. data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
  228. data/lib/rex/proto/dcerpc/client.rb +358 -0
  229. data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
  230. data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
  231. data/lib/rex/proto/dcerpc/handle.rb +47 -0
  232. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
  233. data/lib/rex/proto/dcerpc/ndr.rb +72 -0
  234. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
  235. data/lib/rex/proto/dcerpc/packet.rb +253 -0
  236. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
  237. data/lib/rex/proto/dcerpc/response.rb +186 -0
  238. data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
  239. data/lib/rex/proto/dcerpc/uuid.rb +84 -0
  240. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
  241. data/lib/rex/proto/drda.rb +5 -0
  242. data/lib/rex/proto/drda.rb.ts.rb +17 -0
  243. data/lib/rex/proto/drda/constants.rb +49 -0
  244. data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
  245. data/lib/rex/proto/drda/packet.rb +252 -0
  246. data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
  247. data/lib/rex/proto/drda/utils.rb +123 -0
  248. data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
  249. data/lib/rex/proto/http.rb +5 -0
  250. data/lib/rex/proto/http.rb.ts.rb +12 -0
  251. data/lib/rex/proto/http/client.rb +817 -0
  252. data/lib/rex/proto/http/client.rb.ut.rb +93 -0
  253. data/lib/rex/proto/http/handler.rb +46 -0
  254. data/lib/rex/proto/http/handler/erb.rb +128 -0
  255. data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
  256. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
  257. data/lib/rex/proto/http/handler/proc.rb +54 -0
  258. data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
  259. data/lib/rex/proto/http/header.rb +161 -0
  260. data/lib/rex/proto/http/header.rb.ut.rb +46 -0
  261. data/lib/rex/proto/http/packet.rb +394 -0
  262. data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
  263. data/lib/rex/proto/http/request.rb +356 -0
  264. data/lib/rex/proto/http/request.rb.ut.rb +214 -0
  265. data/lib/rex/proto/http/response.rb +85 -0
  266. data/lib/rex/proto/http/response.rb.ut.rb +149 -0
  267. data/lib/rex/proto/http/server.rb +367 -0
  268. data/lib/rex/proto/http/server.rb.ut.rb +79 -0
  269. data/lib/rex/proto/smb.rb +7 -0
  270. data/lib/rex/proto/smb.rb.ts.rb +8 -0
  271. data/lib/rex/proto/smb/client.rb +1733 -0
  272. data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
  273. data/lib/rex/proto/smb/constants.rb +1062 -0
  274. data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
  275. data/lib/rex/proto/smb/crypt.rb +95 -0
  276. data/lib/rex/proto/smb/crypt.rb.ut.rb +20 -0
  277. data/lib/rex/proto/smb/evasions.rb +65 -0
  278. data/lib/rex/proto/smb/exceptions.rb +846 -0
  279. data/lib/rex/proto/smb/simpleclient.rb +292 -0
  280. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
  281. data/lib/rex/proto/smb/utils.rb +514 -0
  282. data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
  283. data/lib/rex/proto/sunrpc.rb +1 -0
  284. data/lib/rex/proto/sunrpc/client.rb +195 -0
  285. data/lib/rex/script.rb +42 -0
  286. data/lib/rex/script/base.rb +59 -0
  287. data/lib/rex/script/meterpreter.rb +9 -0
  288. data/lib/rex/script/shell.rb +9 -0
  289. data/lib/rex/service.rb +48 -0
  290. data/lib/rex/service_manager.rb +141 -0
  291. data/lib/rex/service_manager.rb.ut.rb +32 -0
  292. data/lib/rex/services/local_relay.rb +423 -0
  293. data/lib/rex/socket.rb +586 -0
  294. data/lib/rex/socket.rb.ut.rb +86 -0
  295. data/lib/rex/socket/comm.rb +119 -0
  296. data/lib/rex/socket/comm/local.rb +409 -0
  297. data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
  298. data/lib/rex/socket/ip.rb +129 -0
  299. data/lib/rex/socket/parameters.rb +345 -0
  300. data/lib/rex/socket/parameters.rb.ut.rb +51 -0
  301. data/lib/rex/socket/range_walker.rb +295 -0
  302. data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
  303. data/lib/rex/socket/ssl_tcp.rb +184 -0
  304. data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
  305. data/lib/rex/socket/ssl_tcp_server.rb +122 -0
  306. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +51 -0
  307. data/lib/rex/socket/subnet_walker.rb +75 -0
  308. data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
  309. data/lib/rex/socket/switch_board.rb +272 -0
  310. data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
  311. data/lib/rex/socket/tcp.rb +76 -0
  312. data/lib/rex/socket/tcp.rb.ut.rb +64 -0
  313. data/lib/rex/socket/tcp_server.rb +67 -0
  314. data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
  315. data/lib/rex/socket/udp.rb +157 -0
  316. data/lib/rex/socket/udp.rb.ut.rb +44 -0
  317. data/lib/rex/struct2.rb +5 -0
  318. data/lib/rex/struct2/c_struct.rb +181 -0
  319. data/lib/rex/struct2/c_struct_template.rb +39 -0
  320. data/lib/rex/struct2/constant.rb +26 -0
  321. data/lib/rex/struct2/element.rb +44 -0
  322. data/lib/rex/struct2/generic.rb +73 -0
  323. data/lib/rex/struct2/restraint.rb +54 -0
  324. data/lib/rex/struct2/s_string.rb +72 -0
  325. data/lib/rex/struct2/s_struct.rb +111 -0
  326. data/lib/rex/sync.rb +6 -0
  327. data/lib/rex/sync/event.rb +94 -0
  328. data/lib/rex/sync/read_write_lock.rb +176 -0
  329. data/lib/rex/sync/ref.rb +57 -0
  330. data/lib/rex/sync/thread_safe.rb +82 -0
  331. data/lib/rex/test.rb +35 -0
  332. data/lib/rex/text.rb +1029 -0
  333. data/lib/rex/text.rb.ut.rb +168 -0
  334. data/lib/rex/time.rb +65 -0
  335. data/lib/rex/transformer.rb +115 -0
  336. data/lib/rex/transformer.rb.ut.rb +38 -0
  337. data/lib/rex/ui.rb +21 -0
  338. data/lib/rex/ui/interactive.rb +252 -0
  339. data/lib/rex/ui/output.rb +80 -0
  340. data/lib/rex/ui/output/none.rb +18 -0
  341. data/lib/rex/ui/progress_tracker.rb +96 -0
  342. data/lib/rex/ui/subscriber.rb +149 -0
  343. data/lib/rex/ui/text/color.rb +97 -0
  344. data/lib/rex/ui/text/color.rb.ut.rb +18 -0
  345. data/lib/rex/ui/text/dispatcher_shell.rb +382 -0
  346. data/lib/rex/ui/text/input.rb +117 -0
  347. data/lib/rex/ui/text/input/buffer.rb +75 -0
  348. data/lib/rex/ui/text/input/readline.rb +129 -0
  349. data/lib/rex/ui/text/input/socket.rb +95 -0
  350. data/lib/rex/ui/text/input/stdio.rb +45 -0
  351. data/lib/rex/ui/text/irb_shell.rb +55 -0
  352. data/lib/rex/ui/text/output.rb +80 -0
  353. data/lib/rex/ui/text/output/buffer.rb +65 -0
  354. data/lib/rex/ui/text/output/file.rb +37 -0
  355. data/lib/rex/ui/text/output/socket.rb +43 -0
  356. data/lib/rex/ui/text/output/stdio.rb +40 -0
  357. data/lib/rex/ui/text/progress_tracker.rb +56 -0
  358. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
  359. data/lib/rex/ui/text/shell.rb +321 -0
  360. data/lib/rex/ui/text/table.rb +254 -0
  361. data/lib/rex/ui/text/table.rb.ut.rb +55 -0
  362. data/lib/rex/zip.rb +93 -0
  363. data/lib/rex/zip/archive.rb +91 -0
  364. data/lib/rex/zip/blocks.rb +182 -0
  365. data/lib/rex/zip/entry.rb +95 -0
  366. data/lib/rex/zip/samples/comment.rb +32 -0
  367. data/lib/rex/zip/samples/mkwar.rb +138 -0
  368. data/lib/rex/zip/samples/mkzip.rb +19 -0
  369. data/lib/rex/zip/samples/recursive.rb +58 -0
  370. metadata +435 -0
@@ -0,0 +1,94 @@
1
+ require 'rex/text'
2
+ require 'rex/exploitation/obfuscatejs'
3
+
4
+ module Rex
5
+ module Exploitation
6
+
7
+ #
8
+ # Encapsulates the generation of the Alexander Sotirov's HeapLib javascript
9
+ # stub
10
+ #
11
+ class HeapLib
12
+
13
+ #
14
+ # The source file to load the javascript from
15
+ #
16
+ JavascriptFile = File.join(File.dirname(__FILE__), "heaplib.js.b64")
17
+
18
+ #
19
+ # The list of symbols found in the file. This is used to dynamically
20
+ # replace contents.
21
+ #
22
+ SymbolNames =
23
+ {
24
+ "Methods" =>
25
+ [
26
+ "vtable",
27
+ "lookasideAddr",
28
+ "lookaside",
29
+ "freeList",
30
+ "gc",
31
+ "flushOleaut32",
32
+ "freeOleaut32",
33
+ "allocOleaut32",
34
+ "free",
35
+ "alloc",
36
+ "addr",
37
+ "hex",
38
+ "round",
39
+ "paddingStr",
40
+ "padding",
41
+ "debugBreak",
42
+ "debugHeap",
43
+ "debug",
44
+ ],
45
+ "Classes" =>
46
+ [
47
+ { 'Namespace' => "heapLib", 'Class' => "ie" }
48
+ ],
49
+ "Namespaces" =>
50
+ [
51
+ "heapLib"
52
+ ]
53
+ }
54
+
55
+ #
56
+ # Initializes the heap library javascript
57
+ #
58
+ def initialize(custom_js = '')
59
+ load_js(custom_js)
60
+ end
61
+
62
+ #
63
+ # Return the replaced version of the javascript
64
+ #
65
+ def to_s
66
+ @js
67
+ end
68
+
69
+ protected
70
+
71
+ #
72
+ # Loads the raw javascript from the source file and strips out comments
73
+ #
74
+ def load_js(custom_js)
75
+
76
+ # Grab the complete javascript
77
+ File.open(JavascriptFile) { |f|
78
+ @js = f.read
79
+ }
80
+
81
+ # Decode the text
82
+ @js = Rex::Text.decode_base64(@js)
83
+
84
+ # Append the real code
85
+ @js += "\n" + custom_js
86
+
87
+ # Obfuscate the javascript
88
+ @js = ObfuscateJS.obfuscate(@js, 'Symbols' => SymbolNames)
89
+ end
90
+
91
+ end
92
+
93
+ end
94
+ end
@@ -0,0 +1,735 @@
1
+
2
+ require 'rex/text'
3
+ require 'rex/exploitation/obfuscatejs'
4
+ require 'msf/core/auxiliary'
5
+
6
+ module Rex
7
+ module Exploitation
8
+
9
+ #
10
+ # Provides several javascript functions for determining the OS and browser versions of a client.
11
+ #
12
+ # getVersion(): returns an object with the following properties
13
+ # os_name - OS name, one of the Msf::OperatingSystems constants
14
+ # os_flavor - OS flavor as a string (e.g.: "XP", "2000")
15
+ # os_sp - OS service pack (e.g.: "SP2", will be empty on non-Windows)
16
+ # os_lang - OS language (e.g.: "en-us")
17
+ # ua_name - Client name, one of the Msf::HttpClients constants
18
+ # ua_version - Client version as a string (e.g.: "3.5.1", "6.0;SP2")
19
+ # arch - Architecture, one of the ARCH_* constants
20
+ #
21
+ # The following functions work on the version returned in obj.ua_version
22
+ #
23
+ # ua_ver_cmp(a, b): returns -1, 0, or 1 based on whether a < b, a == b, or a > b respectively
24
+ # ua_ver_lt(a, b): returns true if a < b
25
+ # ua_ver_gt(a, b): returns true if a > b
26
+ # ua_ver_eq(a, b): returns true if a == b
27
+ #
28
+ class JavascriptOSDetect < ObfuscateJS
29
+
30
+ def initialize(custom_js = '', opts = {})
31
+ clients = ::Msf::HttpClients
32
+ oses = ::Msf::OperatingSystems
33
+ @js = custom_js
34
+ @js = <<ENDJS + @js
35
+ /**
36
+ * This can reliably detect browser versions for IE and Firefox even in the
37
+ * presence of a spoofed User-Agent. OS detection is more fragile and
38
+ * requires truthful navigator.appVersion and navigator.userAgent strings in
39
+ * order to be accurate for more than just IE on Windows.
40
+ **/
41
+ function getVersion(){
42
+ //Default values:
43
+ var os_name;
44
+ var os_flavor;
45
+ var os_sp;
46
+ var os_lang;
47
+ var ua_name;
48
+ var ua_version;
49
+ var arch = "";
50
+ var useragent = navigator.userAgent;
51
+ // Trust but verify...
52
+ var ua_is_lying = false;
53
+
54
+ var version = "";
55
+
56
+ //--
57
+ // Client
58
+ //--
59
+ if (window.opera) {
60
+ ua_name = "#{clients::OPERA}";
61
+ // This seems to be completely accurate, e.g. "9.21" is the return
62
+ // value of opera.version() when run on Opera 9.21
63
+ ua_version = opera.version();
64
+ if (!os_name) {
65
+ // The 'inconspicuous' argument is there to give us a real value on
66
+ // Opera 6 where, without it, the return value is supposedly
67
+ // 'Hm, were you only as smart as Bjorn Vermo...'
68
+ // though I have not verfied this claim.
69
+ switch (opera.buildNumber('inconspicuous')) {
70
+ case "344": // opera-9.0-20060616.1-static-qt.i386-en-344
71
+ case "2091": // opera-9.52-2091.gcc3-shared-qt3.i386.rpm
72
+ case "2444": // opera-9.60.gcc4-shared-qt3.i386.rpm
73
+ os_name = "#{oses::LINUX}";
74
+ break;
75
+ case "8502": // "Opera 9 Eng Setup.exe"
76
+ case "8679": // "Opera_9.10_Eng_Setup.exe"
77
+ case "8771": // "Opera_9.20_Eng_Setup.exe"
78
+ case "8776": // "Opera_9.21_Eng_Setup.exe"
79
+ case "8801": // "Opera_9.22_Eng_Setup.exe"
80
+ case "10108": // "Opera_952_10108_en.exe"
81
+ case "10467": // "Opera_962_en_Setup.exe"
82
+ os_name = "#{oses::WINDOWS}";
83
+ break;
84
+ //default:
85
+ // document.write(opera.buildNumber('inconspicuous'));
86
+ // break;
87
+ }
88
+ }
89
+ } else if (typeof window.onmousewheel != 'undefined') {
90
+ // Then this is webkit, could be Safari or Chrome.
91
+ // Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1
92
+ // Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.78 Safari/532.5
93
+
94
+ // Google Chrome has window.google (all versions), window.chromium (all versions), and window.window.chrome (3+)
95
+ if (window.chromium || window.google) {
96
+ ua_name = "#{clients::CHROME}";
97
+ search = "Chrome";
98
+ } else {
99
+ // navigator.language for;
100
+ // Safari on Mac (OS X, iPod, and iPhone): lower case language & lower case country code (en-us)
101
+ // Safari on Windows: lower case language & upper case country code (en-US).
102
+ if (navigator.language.toLowerCase() == navigator.language) {
103
+ os_name = "#{oses::MAC_OSX}";
104
+ } else {
105
+ os_name = "#{oses::WINDOWS}";
106
+ }
107
+
108
+ ua_name = "#{clients::SAFARI}";
109
+ search = "Version";
110
+ }
111
+ ua_version = searchVersion(search, navigator.userAgent);
112
+ if (!ua_version || 0 == ua_version.length) {
113
+ ua_is_lying = true;
114
+ }
115
+ } else if (!document.all && navigator.taintEnabled) {
116
+ // Use taintEnabled to identify FF since other recent browsers
117
+ // implement window.getComputedStyle now. For some reason, checking for
118
+ // taintEnabled seems to cause IE 6 to stop parsing, so make sure this
119
+ // isn't IE first.
120
+ //
121
+ // Then this is a Gecko derivative, assume Firefox since that's the
122
+ // only one we have sploits for. We may need to revisit this in the
123
+ // future. This works for multi/browser/mozilla_compareto against
124
+ // Firefox and Mozilla, so it's probably good enough for now.
125
+ ua_name = "#{clients::FF}";
126
+ if (document.readyState) {
127
+ ua_version = "3.6";
128
+ } else if (String.trimRight) {
129
+ ua_version = "3.5";
130
+ } else if (document.getElementsByClassName) {
131
+ ua_version = "3";
132
+ } else if (window.Iterator) {
133
+ ua_version = "2";
134
+ } else if (Array.every) {
135
+ ua_version = "1.5";
136
+ } else {
137
+ ua_version = "1";
138
+ }
139
+
140
+ // oscpu is unaffected by changes in the useragent and has values like:
141
+ // "Linux i686"
142
+ // "Windows NT 6.0"
143
+ // haven't tested on 64-bit Windows
144
+ version = navigator.oscpu;
145
+ if (version.match(/i.86/)) {
146
+ arch = "#{ARCH_X86}";
147
+ }
148
+ if (version.match(/x86_64/)) {
149
+ arch = "#{ARCH_X86_64}";
150
+ }
151
+ if (version.match(/Windows/)) {
152
+ os_name = "#{oses::WINDOWS}";
153
+ switch(version) {
154
+ case "Windows NT 5.0": os_flavor = "2000"; break;
155
+ case "Windows NT 5.1": os_flavor = "XP"; break;
156
+ case "Windows NT 5.2": os_flavor = "2003"; break;
157
+ case "Windows NT 6.0": os_flavor = "Vista"; break;
158
+ case "Windows NT 6.1": os_flavor = "7"; break;
159
+ }
160
+ }
161
+ if (version.match(/Linux/)) {
162
+ os_name = "#{oses::LINUX}";
163
+ }
164
+ // end navigator.oscpu checks
165
+
166
+ // buildID is unaffected by changes in the useragent and typically has
167
+ // the compile date which in some cases can be used to map to specific
168
+ // Version & O/S (including Distro and even Arch). Depending upon the
169
+ // buildID, sometime navigator.productSub will be needed.
170
+ //
171
+ // This technique, and the laboriously compiled associated table,
172
+ // submitted by Mark Fioravanti.
173
+
174
+ var buildid = navigator.buildID;
175
+
176
+ switch(buildid) {
177
+ case "2008041514": ua_version = "3.0.0.b5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
178
+ case "2008041515": ua_version = "3.0.0.b5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
179
+ case "2008052312": ua_version = "3.0.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
180
+ case "2008052906": ua_version = "3.0.0"; os_name = "#{oses::WINDOWS}"; break;
181
+ case "2008052909": ua_version = "3.0.0.rc1"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
182
+ case "2008052912": ua_version = "3.0.0"; os_name = "#{oses::LINUX}"; break;
183
+ case "2008060309": ua_version = "3.0.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
184
+ case "2008070205": ua_version = "2.0.0.16"; os_name = "#{oses::WINDOWS}"; break;
185
+ case "2008070206": ua_version = "3.0.1"; os_name = "#{oses::LINUX}"; break;
186
+ case "2008070208": ua_version = "3.0.1"; os_name = "#{oses::WINDOWS}"; break;
187
+ case "2008071222": ua_version = "3.0.1"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
188
+ case "2008072820":
189
+ switch (navigator.productSub) {
190
+ case "2008072820": ua_version = "3.0.1"; os_name = "#{oses::LINUX}"; break;
191
+ case "2008092313": ua_version = "3.0.2"; os_name = "#{oses::LINUX}"; break;
192
+ } break;
193
+ case "2008082909": ua_version = "2.0.0.17"; os_name = "#{oses::WINDOWS}"; break;
194
+ case "2008091618": ua_version = "3.0.2"; os_name = "#{oses::LINUX}"; break;
195
+ case "2008091620": ua_version = "3.0.2"; os_name = "#{oses::WINDOWS}"; break;
196
+ case "2008092313": ua_version = "3.0.3"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
197
+ case "2008092416": ua_version = "3.0.3"; os_name = "#{oses::LINUX}"; break;
198
+ case "2008092417": ua_version = "3.0.3"; os_name = "#{oses::WINDOWS}"; break;
199
+ case "2008092510": ua_version = "3.0.4"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
200
+ case "2008101315":
201
+ switch (navigator.productSub) {
202
+ case "2008101315": ua_version = "3.0.3"; os_name = "#{oses::LINUX}"; break;
203
+ case "2008111318": ua_version = "3.0.4"; os_name = "#{oses::LINUX}"; arch = "#{ARCH_X86}"; break;
204
+ } break;
205
+ case "2008102918": ua_version = "2.0.0.18"; os_name = "#{oses::WINDOWS}"; break;
206
+ case "2008102920": ua_version = "3.0.4"; break;
207
+ case "2008111317": ua_version = "3.0.5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
208
+ case "2008111318": ua_version = "3.0.5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
209
+ case "2008120119": ua_version = "2.0.0.19"; os_name = "#{oses::WINDOWS}"; break;
210
+ case "2008120121": ua_version = "3.0.5"; os_name = "#{oses::LINUX}"; break;
211
+ case "2008120122": ua_version = "3.0.5"; os_name = "#{oses::WINDOWS}"; break;
212
+ case "2008121709": ua_version = "2.0.0.20"; os_name = "#{oses::WINDOWS}"; break;
213
+ case "2009011912": ua_version = "3.0.6"; os_name = "#{oses::LINUX}"; break;
214
+ case "2009011913": ua_version = "3.0.6"; os_name = "#{oses::WINDOWS}"; break;
215
+ case "2009012615": ua_version = "3.0.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
216
+ case "2009012616": ua_version = "3.0.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
217
+ case "2009021906": ua_version = "3.0.7"; os_name = "#{oses::LINUX}"; break;
218
+ case "2009021910": ua_version = "3.0.7"; os_name = "#{oses::WINDOWS}"; break;
219
+ case "2009030422": ua_version = "3.0.8"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
220
+ case "2009032608": ua_version = "3.0.8"; os_name = "#{oses::LINUX}"; break;
221
+ case "2009032609": ua_version = "3.0.8"; os_name = "#{oses::WINDOWS}"; break;
222
+ case "2009032711": ua_version = "3.0.9"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
223
+ case "2009033100":
224
+ switch (navigator.productSub) {
225
+ case "2009033100": ua_version = "3.0.8"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
226
+ case "2009042113": ua_version = "3.0.9"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
227
+ } break;
228
+ case "2009040820": ua_version = "3.0.9"; os_name = "#{oses::LINUX}"; break;
229
+ case "2009040821": ua_version = "3.0.9"; os_name = "#{oses::WINDOWS}"; break;
230
+ case "2009042113": ua_version = "3.0.10"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
231
+ case "2009042114": ua_version = "3.0.10"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
232
+ case "2009042315": ua_version = "3.0.10"; os_name = "#{oses::LINUX}"; break;
233
+ case "2009042316": ua_version = "3.0.10"; os_name = "#{oses::WINDOWS}"; break;
234
+ case "20090427153806": ua_version = "3.5.0.b4"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
235
+ case "20090427153807": ua_version = "3.5.0.b4"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
236
+ case "2009060214": ua_version = "3.0.11"; os_name = "#{oses::LINUX}"; break;
237
+ case "2009060215": ua_version = "3.0.11"; os_name = "#{oses::WINDOWS}"; break;
238
+ case "2009060308":
239
+ switch (navigator.productSub) {
240
+ case "2009060308": ua_version = "3.0.11"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
241
+ case "2009070811": ua_version = "3.0.12"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
242
+ } break;
243
+ case "2009060309":
244
+ switch (navigator.productSub) {
245
+ case "2009060309": ua_version = "3.0.11"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
246
+ case "2009070811": ua_version = "3.0.12"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
247
+ } break;
248
+ case "2009060310": ua_version = "3.0.11"; os_name = "#{oses::LINUX}"; os_flavor = "BackTrack"; break;
249
+ case "2009062005": ua_version = "3.0.11"; os_name = "#{oses::LINUX}"; os_flavor = "PCLunixOS"; break;
250
+ case "20090624012136": ua_version = "3.5.0"; os_name = "#{oses::MAC_OSX}"; break;
251
+ case "20090624012820": ua_version = "3.5.0"; os_name = "#{oses::LINUX}"; break;
252
+ case "20090701234143": ua_version = "3.5.0"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
253
+ case "20090702060527": ua_version = "3.5.0"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86_64}"; break;
254
+ case "2009070610": ua_version = "3.0.12"; os_name = "#{oses::LINUX}"; break;
255
+ case "2009070611": ua_version = "3.0.12"; os_name = "#{oses::WINDOWS}"; break;
256
+ case "2009070811": ua_version = "3.0.13"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
257
+ case "20090715083437": ua_version = "3.5.1"; os_name = "#{oses::MAC_OSX}"; break;
258
+ case "20090715083816": ua_version = "3.5.1"; os_name = "#{oses::LINUX}"; break;
259
+ case "20090715094852": ua_version = "3.5.1"; os_name = "#{oses::WINDOWS}"; break;
260
+ case "2009072202": ua_version = "3.0.12"; os_name = "#{oses::LINUX}"; os_flavor = "Oracle"; break;
261
+ case "2009072711": ua_version = "3.0.12"; os_name = "#{oses::LINUX}"; os_flavor = "CentOS"; break;
262
+ case "20090729211433": ua_version = "3.5.2"; os_name = "#{oses::MAC_OSX}"; break;
263
+ case "20090729211829": ua_version = "3.5.2"; os_name = "#{oses::LINUX}"; break;
264
+ case "20090729225027": ua_version = "3.5.2"; os_name = "#{oses::WINDOWS}"; break;
265
+ case "2009073021": ua_version = "3.0.13"; os_name = "#{oses::LINUX}"; break;
266
+ case "2009073022": ua_version = "3.0.13"; os_name = "#{oses::WINDOWS}"; break;
267
+ case "20090824085414": ua_version = "3.5.3"; os_name = "#{oses::MAC_OSX}"; break;
268
+ case "20090824085743": ua_version = "3.5.3"; os_name = "#{oses::LINUX}"; break;
269
+ case "20090824101458": ua_version = "3.5.3"; os_name = "#{oses::WINDOWS}"; break;
270
+ case "2009082707": ua_version = "3.0.14"; break;
271
+ case "2009090216": ua_version = "3.0.14"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
272
+ case "20090914014745": ua_version = "3.5.3"; os_name = "#{oses::LINUX}"; os_flavor = "Mandriva"; arch = "#{ARCH_X86}"; break;
273
+ case "20090915065903": ua_version = "3.5.3"; os_name = "#{oses::LINUX}"; os_flavor = "Sabayon"; arch = "#{ARCH_X86_64}"; break;
274
+ case "20090915070141": ua_version = "3.5.3"; os_name = "#{oses::LINUX}"; os_flavor = "Sabayon"; arch = "#{ARCH_X86}"; break;
275
+ case "20091007090112": ua_version = "3.5.3"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
276
+ case "20091007095328": ua_version = "3.5.3"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break; // Could also be Mint x86-64
277
+ case "2009101600":
278
+ switch (navigator.productSub) {
279
+ case "2009101600": ua_version = "3.0.15"; break; // Can be either Mac or Linux
280
+ case "20091016": ua_version = "3.5.4"; os_name = "#{oses::LINUX}"; os_flavor = "SUSE"; arch = "#{ARCH_X86}"; break;
281
+ } break;
282
+ case "2009101601": ua_version = "3.0.15"; os_name = "#{oses::WINDOWS}"; break;
283
+ case "20091016081620": ua_version = "3.5.4"; os_name = "#{oses::MAC_OSX}"; break;
284
+ case "20091016081727": ua_version = "3.5.4"; os_name = "#{oses::LINUX}"; break;
285
+ case "20091016092926": ua_version = "3.5.4"; os_name = "#{oses::WINDOWS}"; break;
286
+ case "20091020122601": ua_version = "3.5.4"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break; // Could also be Mint x86-64
287
+ case "2009102814":
288
+ switch (navigator.productSub) {
289
+ case "2009121601": ua_version = "3.0.16"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
290
+ case "2009121602": ua_version = "3.0.16"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
291
+ case "2010010604": ua_version = "3.0.17"; os_name = "#{oses::LINUX}"; os_flavor = "Mint"; break;
292
+ case "2010021501": ua_version = "3.0.17;xul1.9.0.18"; os_name = "#{oses::LINUX}"; os_flavor = "Mint"; arch = "#{ARCH_X86}"; break;
293
+ case "2010021502": ua_version = "3.0.17;xul1.9.0.18"; os_name = "#{oses::LINUX}"; os_flavor = "Mint"; arch = "#{ARCH_X86_64}"; break;
294
+ } break;
295
+ case "2009102815":
296
+ switch (navigator.productSub) {
297
+ case "2009102815": ua_version = "3.0.15"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
298
+ case "2009121601": ua_version = "3.0.16"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
299
+ } break;
300
+ case "20091029152254": ua_version = "3.6.0.b1"; os_name = "#{oses::LINUX}"; break;
301
+ case "20091029171059": ua_version = "3.6.0.b1"; os_name = "#{oses::WINDOWS}"; break;
302
+ case "20091102134505": ua_version = "3.5.5"; os_name = "#{oses::MAC_OSX}"; break;
303
+ case "20091102141836": ua_version = "3.5.5"; os_name = "#{oses::LINUX}"; break;
304
+ case "20091102152451": ua_version = "3.5.5"; os_name = "#{oses::WINDOWS}"; break;
305
+ case "2009110421": ua_version = "3.0.15"; os_name = "#{oses::FREEBSD}"; arch = "#{ARCH_X86}"; break;
306
+ case "20091106091959": ua_version = "3.5.5"; os_name = "#{oses::LINUX}"; os_flavor = "Mandriva"; arch = "#{ARCH_X86}"; break;
307
+ case "20091106140514": ua_version = "3.5.5"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
308
+ case "20091106145609": ua_version = "3.5.5"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86_64}"; break;
309
+ case "20091108163911": ua_version = "3.6.0.b2"; os_name = "#{oses::LINUX}"; break;
310
+ case "20091108181924": ua_version = "3.6.0.b2"; os_name = "#{oses::WINDOWS}"; break;
311
+ case "20091109125225":
312
+ switch (navigator.productSub) {
313
+ case "20091109": ua_version = "3.5.5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
314
+ case "20091215": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
315
+ } break;
316
+ case "20091109134913": ua_version = "3.5.5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
317
+ case "20091115172547": ua_version = "3.6.0.b3"; os_name = "#{oses::LINUX}"; break;
318
+ case "20091115182845": ua_version = "3.6.0.b3"; os_name = "#{oses::WINDOWS}"; break;
319
+ case "20091124201530": ua_version = "3.6.0.b4"; os_name = "#{oses::MAC_OSX}"; break;
320
+ case "20091124201751": ua_version = "3.6.0.b4"; os_name = "#{oses::LINUX}"; break;
321
+ case "20091124213835": ua_version = "3.6.0.b4"; os_name = "#{oses::WINDOWS}"; break;
322
+ case "2009120100": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "SUSE"; break;
323
+ case "20091201203240": ua_version = "3.5.6"; os_name = "#{oses::MAC_OSX}"; break;
324
+ case "20091201204959": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; break;
325
+ case "20091201220228": ua_version = "3.5.6"; os_name = "#{oses::WINDOWS}"; break;
326
+ case "2009120206": ua_version = "3.0.16"; break; // Can be either Mac or Linux
327
+ case "2009120208": ua_version = "3.0.16"; os_name = "#{oses::WINDOWS}"; break;
328
+ case "20091204132459": ua_version = "3.6.0.b5"; os_name = "#{oses::LINUX}"; break;
329
+ case "20091204132509": ua_version = "3.6.0.b5"; os_name = "#{oses::MAC_OSX}"; break;
330
+ case "20091204143806": ua_version = "3.6.0.b5"; os_name = "#{oses::WINDOWS}"; break;
331
+ case "20091215230859": ua_version = "3.5.7"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
332
+ case "20091215230946": ua_version = "3.5.7"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
333
+ case "20091215231400": ua_version = "3.5.7"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
334
+ case "20091215231754":
335
+ switch (navigator.productSub) {
336
+ case "20091215": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
337
+ case "20100106": ua_version = "3.5.7"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break; // Could also be Mint x86-64
338
+ } break;
339
+ case "2009121601":
340
+ switch (navigator.productSub) {
341
+ case "2009121601": ua_version = "3.0.16"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
342
+ case "2010010604": ua_version = "3.0.17"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break; // Could also be Mint x86-64
343
+ } break;
344
+ case "2009121602": ua_version = "3.0.17"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
345
+ case "20091216104148": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Mandriva"; break;
346
+ case "20091216132458": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
347
+ case "20091216132537": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
348
+ case "20091216142458": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
349
+ case "20091216142519": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
350
+ case "2009121708": ua_version = "3.0.16"; os_name = "#{oses::LINUX}"; os_flavor = "CentOS"; arch = "#{ARCH_X86}"; break;
351
+ case "2009122115": ua_version = "3.0.17"; break; // Can be either Mac or Linux
352
+ case "2009122116": ua_version = "3.0.17"; os_name = "#{oses::WINDOWS}"; break;
353
+ case "20091221151141": ua_version = "3.5.7"; os_name = "#{oses::MAC_OSX}"; break;
354
+ case "20091221152502": ua_version = "3.5.7"; os_name = "#{oses::LINUX}"; break;
355
+ case "20091221164558": ua_version = "3.5.7"; os_name = "#{oses::WINDOWS}"; break;
356
+ case "2009122200": ua_version = "3.5.7"; os_name = "#{oses::LINUX}"; os_flavor = "SUSE"; break;
357
+ case "20091223231431": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "PCLunixOS"; arch = "#{ARCH_X86}"; break;
358
+ case "20100105194006": ua_version = "3.6.0.rc1"; os_name = "#{oses::MAC_OSX}"; break;
359
+ case "20100105194116": ua_version = "3.6.0.rc1"; os_name = "#{oses::LINUX}"; break;
360
+ case "20100105212446": ua_version = "3.6.0.rc1"; os_name = "#{oses::WINDOWS}"; break;
361
+ case "2010010604": ua_version = "3.0.18"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
362
+ case "2010010605": ua_version = "3.0.18"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
363
+ case "20100106054534": ua_version = "3.5.8"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
364
+ case "20100106054634": ua_version = "3.5.8"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break; // Could also be Mint x86-64
365
+ case "20100106211825": ua_version = "3.5.7"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
366
+ case "20100106212742": ua_version = "3.5.7"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86_64}"; break;
367
+ case "20100106215614": ua_version = "3.5.7"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
368
+ case "20100110112429": ua_version = "3.5.7"; os_name = "#{oses::LINUX}"; os_flavor = "Mandriva"; break;
369
+ case "20100115132715": ua_version = "3.6.0"; os_name = "#{oses::MAC_OSX}"; break;
370
+ case "20100115133306": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; break;
371
+ case "20100115144158": ua_version = "3.6.0"; os_name = "#{oses::WINDOWS}"; break;
372
+ case "20100125074043": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
373
+ case "20100125074127": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break; // Could also be Mint x86-64
374
+ case "20100125204847": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Sabayon"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
375
+ case "20100125204903": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Sabayon"; arch = "#{ARCH_X86_64}"; break; // Could also be Mint x86-64
376
+ case "20100202152834": ua_version = "3.5.8"; os_name = "#{oses::MAC_OSX}"; break;
377
+ case "20100202153512": ua_version = "3.5.8"; os_name = "#{oses::LINUX}"; break;
378
+ case "20100202165920": ua_version = "3.5.8"; os_name = "#{oses::WINDOWS}"; break;
379
+ case "2010020219": ua_version = "3.0.18"; os_name = "#{oses::MAC_OSX}"; break;
380
+ case "2010020220": ua_version = "3.0.18"; os_name = "#{oses::WINDOWS}"; break;
381
+ case "2010020400": ua_version = "3.5.8"; os_name = "#{oses::LINUX}"; os_flavor = "SUSE"; break;
382
+ case "20100212131909": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
383
+ case "20100212132013": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break; // Could also be Mint x86-64
384
+ case "20100216105329": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
385
+ case "20100216105348": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
386
+ case "20100216105410": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
387
+ case "20100216110009": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
388
+ case "20100218022359": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
389
+ case "20100218022705": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break; // Could also be Mint x86-64
390
+ case "20100218112915": ua_version = "3.5.8"; os_name = "#{oses::LINUX}"; os_flavor = "Mandriva"; break;
391
+ case "20100222120605": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
392
+ case "20100222120717": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break; // Could also be Mint x86-64
393
+ case "20100301015346": ua_version = "3.6.0"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
394
+ case "20100305054927": ua_version = "3.6.0"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86_64}"; break;
395
+ case "20100307204001": ua_version = "3.6.0"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
396
+ case "20100308142847": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
397
+ case "20100308151019": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break; // Could also be Mint x86-64
398
+ case "20100316055951": ua_version = "3.6.2"; os_name = "#{oses::MAC_OSX}"; break;
399
+ case "20100316060223": ua_version = "3.6.2"; os_name = "#{oses::LINUX}"; break;
400
+ case "20100316074819": ua_version = "3.6.2"; os_name = "#{oses::WINDOWS}"; break;
401
+ case "20100324182054": ua_version = "3.6.2"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
402
+ case "20100401080539": ua_version = "3.6.3"; os_name = "#{oses::WINDOWS}"; break;
403
+ case "20100402010516": ua_version = "3.5.9"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
404
+ default:
405
+ version = searchVersion("Firefox", navigator.userAgent);
406
+ // Verify whether the ua string is lying by checking if it contains
407
+ // the major version we detected using known objects above. If it
408
+ // appears to be truthful, then use its more precise version number.
409
+ if (version && version.split(".")[0] == ua_version.split(".")[0]) {
410
+ // The version number will sometimes end with a space or end of
411
+ // line, so strip off anything after a space if one exists
412
+ if (-1 != version.indexOf(" ")) {
413
+ version = version.substr(0,version.indexOf(" "));
414
+ }
415
+ ua_version = version;
416
+ } else {
417
+ ua_is_lying = true;
418
+ }
419
+ break;
420
+ }
421
+ if (ua_is_lying) { alert("UA is lying"); }
422
+ alert(ua_version + " vs " + navigator.userAgent);
423
+
424
+ // end navigator.buildID checks
425
+
426
+ } else if (typeof ScriptEngineMajorVersion == "function") {
427
+ // Then this is IE and we can very reliably detect the OS.
428
+ // Need to add detection for IE on Mac. Low priority, since we
429
+ // don't have any sploits for it yet and it's a very low market
430
+ // share.
431
+ os_name = "#{oses::WINDOWS}";
432
+ ua_name = "#{clients::IE}";
433
+ version = ScriptEngineMajorVersion().toString();
434
+ version += ScriptEngineMinorVersion().toString();
435
+ version += ScriptEngineBuildVersion().toString();
436
+ //document.write("ScriptEngine: "+version+"<br />");
437
+ switch (version){
438
+ case "514615":
439
+ // IE 5.00.2920.0000, 2000 Advanced Server SP0 English
440
+ ua_version = "5.0";
441
+ os_flavor = "2000";
442
+ os_sp = "SP0";
443
+ break;
444
+ case "515907":
445
+ os_flavor = "2000";
446
+ os_sp = "SP3"; //or SP2: oCC.getComponentVersion('{22d6f312-b0f6-11d0-94ab-0080c74c7e95}', 'componentid') => 6,4,9,1109
447
+ break;
448
+ case "518513":
449
+ os_flavor = "2000";
450
+ os_sp = "SP4";
451
+ break;
452
+ case "566626":
453
+ // IE 6.0.2600.0000, XP SP0 English
454
+ // IE 6.0.2800.1106, XP SP1 English
455
+ ua_version = "6.0";
456
+ os_flavor = "XP";
457
+ os_sp = "SP0";
458
+ break;
459
+ case "568515":
460
+ // IE 6.0.3790.0, 2003 Standard SP0 English
461
+ ua_version = "6.0";
462
+ os_flavor = "2003";
463
+ os_sp = "SP0";
464
+ break;
465
+ case "568820":
466
+ // IE 6.0.2900.2180, xp sp2 english
467
+ os_flavor = "XP";
468
+ os_sp = "SP2";
469
+ break;
470
+ case "568827":
471
+ os_flavor = "2003";
472
+ os_sp = "SP1";
473
+ break;
474
+ case "568831": //XP SP2 -OR- 2K SP4
475
+ if (os_flavor == "2000"){
476
+ os_sp = "SP4";
477
+ }
478
+ else{
479
+ os_flavor = "XP";
480
+ os_sp = "SP2";
481
+ }
482
+ break;
483
+ case "568832":
484
+ os_flavor = "2003";
485
+ os_sp = "SP2";
486
+ break;
487
+ case "575730":
488
+ // IE 7.0.5730.13, Server 2003 Standard SP2 English
489
+ // IE 7.0.5730.13, Server 2003 Standard SP1 English
490
+ // IE 7.0.5730.13, XP Professional SP2 English
491
+ // Rely on the user agent matching above to determine the OS.
492
+ // This will incorrectly identify 2k3 SP1 as SP2
493
+ ua_version = "7.0";
494
+ os_sp = "SP2";
495
+ break;
496
+ case "5716599":
497
+ // IE 7.0.5730.13, XP Professional SP3 English
498
+ case "5718066":
499
+ // IE 7.0.5730.13, XP Professional SP3 English
500
+ ua_version = "7.0";
501
+ os_flavor = "XP";
502
+ os_sp = "SP3";
503
+ break;
504
+ case "5818702":
505
+ // IE 8.0.6001.18702, XP Professional SP3 English
506
+ ua_version = "8.0";
507
+ os_flavor = "XP";
508
+ os_sp = "SP3";
509
+ break;
510
+ case "580":
511
+ // IE 8.0.7100.0, Windows 7 English
512
+ // IE 8.0.7100.0, Windows 7 64-bit English
513
+ case "5816385":
514
+ // IE 8.0.7600.16385, Windows 7 English
515
+ ua_version = "8.0";
516
+ os_flavor = "7";
517
+ os_sp = "SP0";
518
+ break;
519
+ //default:
520
+ // document.writeln(version);
521
+ // break;
522
+ }
523
+
524
+ if (!ua_version) {
525
+ // The ScriptEngine functions failed us, try some object detection
526
+ if (document.documentElement && (typeof document.documentElement.style.maxHeight)!="undefined") {
527
+ // IE8 detection straight from IEBlog. Thank you Microsoft.
528
+ try {
529
+ ua_version = "8.0";
530
+ document.documentElement.style.display = "table-cell";
531
+ } catch(e) {
532
+ // This executes in IE7,
533
+ // but not IE8, regardless of mode
534
+ ua_version = "7.0";
535
+ }
536
+ } else if (document.compatMode) {
537
+ ua_version = "6.0";
538
+ } else if (window.createPopup) {
539
+ ua_version = "5.5";
540
+ } else if (window.attachEvent) {
541
+ ua_version = "5.0";
542
+ } else {
543
+ ua_version = "4.0";
544
+ }
545
+ switch (navigator.appMinorVersion){
546
+ case ";SP2;":
547
+ ua_version += ";SP2";
548
+ break;
549
+ }
550
+ }
551
+ }
552
+
553
+ if (!os_name && navigator.platform == "Win32") { os_name = "#{oses::WINDOWS}"; }
554
+
555
+ //--
556
+ // Flavor
557
+ //--
558
+ if (navigator.oscpu) {
559
+ // Then this is Gecko and we can do it without the useragent
560
+ version = navigator.oscpu.toLowerCase();
561
+ } else if (!ua_is_lying) {
562
+ version = useragent.toLowerCase();
563
+ } else {
564
+ // All we have left is the useragent and we know it's lying, so don't bother
565
+ version = " ";
566
+ }
567
+ if (!os_name || 0 == os_name.length) {
568
+ if (version.indexOf("windows") != -1) { os_name = "#{oses::WINDOWS}"; }
569
+ else if (version.indexOf("mac") != -1) { os_name = "#{oses::MAC_OSX}"; }
570
+ else if (version.indexOf("linux") != -1) { os_name = "#{oses::LINUX}"; }
571
+ }
572
+ if (os_name == "#{oses::WINDOWS}" && (!os_flavor || 0 == os_flavor.length)) {
573
+ if (version.indexOf("windows 95") != -1) { os_flavor = "95"; }
574
+ else if (version.indexOf("windows nt 4") != -1) { os_flavor = "NT"; }
575
+ else if (version.indexOf("win 9x 4.9") != -1) { os_flavor = "ME"; }
576
+ else if (version.indexOf("windows 98") != -1) { os_flavor = "98"; }
577
+ else if (version.indexOf("windows nt 5.0") != -1) { os_flavor = "2000"; }
578
+ else if (version.indexOf("windows nt 5.1") != -1) { os_flavor = "XP"; }
579
+ else if (version.indexOf("windows nt 5.2") != -1) { os_flavor = "2003"; }
580
+ else if (version.indexOf("windows nt 6.0") != -1) { os_flavor = "Vista"; }
581
+ else if (version.indexOf("windows nt 6.1") != -1) { os_flavor = "7"; }
582
+ }
583
+ if (os_name == "#{oses::LINUX}" && (!os_flavor || 0 == os_flavor.length)) {
584
+ if (version.indexOf("gentoo") != -1) { os_flavor = "Gentoo"; }
585
+ else if (version.indexOf("ubuntu") != -1) { os_flavor = "Ubuntu"; }
586
+ else if (version.indexOf("debian") != -1) { os_flavor = "Debian"; }
587
+ else if (version.indexOf("rhel") != -1) { os_flavor = "RHEL"; }
588
+ else if (version.indexOf("red hat") != -1){ os_flavor = "RHEL"; }
589
+ else if (version.indexOf("centos") != -1) { os_flavor = "CentOS"; }
590
+ }
591
+
592
+ //--
593
+ // Language
594
+ //--
595
+ if (navigator.systemLanguage) {
596
+ // ie
597
+ os_lang = navigator.systemLanguage;
598
+ } else if (navigator.language) {
599
+ // gecko derivatives, safari, opera
600
+ os_lang = navigator.language;
601
+ } else {
602
+ // some other browser and we don't know how to get the language, so
603
+ // just guess english
604
+ os_lang = "en";
605
+ }
606
+
607
+ //--
608
+ // Architecture
609
+ //--
610
+ if (!arch || 0 == arch.length) {
611
+ version = navigator.platform;
612
+ //document.write(version + "\\n");
613
+ // IE 8 does a bit of wacky user-agent switching for "Compatibility View";
614
+ // 64-bit client on Windows 7, 64-bit:
615
+ // Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0)
616
+ // 32-bit client on Windows 7, 64-bit:
617
+ // Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0)
618
+ // 32-bit client on Vista, 32-bit, "Compatibility View":
619
+ // Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0)
620
+ //
621
+ // Report 32-bit client on 64-bit OS as being 32 because exploits will
622
+ // need to know the bittedness of the process, not the OS.
623
+ if ( ("Win32" == version) || (version.match(/i.86/)) ) {
624
+ arch = "#{ARCH_X86}";
625
+ } else if (-1 != version.indexOf('x64') || (-1 != version.indexOf('x86_64'))) {
626
+ arch = "#{ARCH_X86_64}";
627
+ } else if (-1 != version.indexOf('PPC')) {
628
+ arch = "#{ARCH_PPC}";
629
+ }
630
+ }
631
+
632
+ return { os_name:os_name, os_flavor:os_flavor, os_sp:os_sp, os_lang:os_lang, arch:arch, ua_name:ua_name, ua_version:ua_version };
633
+ } // function getVersion
634
+ function searchVersion(needle, haystack) {
635
+ var index = haystack.indexOf(needle);
636
+ var found_version;
637
+ if (index == -1) { return; }
638
+ found_version = haystack.substring(index+needle.length+1);
639
+ if (found_version.indexOf(' ') != -1) {
640
+ // Strip off any junk at the end such as a CLR declaration
641
+ found_version = found_version.substring(0,found_version.indexOf(' '));
642
+ }
643
+ return found_version;
644
+ }
645
+
646
+
647
+ /*
648
+ * Return -1 if a < b, 0 if a == b, 1 if a > b
649
+ */
650
+ function ua_ver_cmp(ver_a, ver_b) {
651
+ // shortcut the easy case
652
+ if (ver_a == ver_b) {
653
+ return 0;
654
+ }
655
+
656
+ a = ver_a.split(".");
657
+ b = ver_b.split(".");
658
+ for (i = 0; i < Math.max(a.length, b.length); i++) {
659
+ // 3.0 == 3
660
+ if (!b[i]) { b[i] = "0"; }
661
+ if (!a[i]) { a[i] = "0"; }
662
+
663
+ if (a[i] == b[i]) { continue; }
664
+
665
+ a_int = parseInt(a[i]);
666
+ b_int = parseInt(b[i]);
667
+ a_rest = a[i].substr(a_int.toString().length);
668
+ b_rest = b[i].substr(b_int.toString().length);
669
+ if (a_int < b_int) {
670
+ return -1;
671
+ } else if (a_int > b_int) {
672
+ return 1;
673
+ } else { // ==
674
+ // Then we need to deal with the stuff after the ints, e.g.:
675
+ // "b4pre"
676
+ if (a_rest == "b" && b_rest.length == 0) {
677
+ return -1;
678
+ }
679
+ if (b_rest == "b" && a_rest.length == 0) {
680
+ return 1;
681
+ }
682
+ // Just give up and try a lexicographical comparison
683
+ if (a_rest < b_rest) {
684
+ return -1;
685
+ } else if (a_rest > b_rest) {
686
+ return 1;
687
+ }
688
+ }
689
+ }
690
+ // If we get here, they must be equal
691
+ return 0;
692
+ }
693
+
694
+ function ua_ver_lt(a, b) {
695
+ if (-1 == ua_ver_cmp(a,b)) { return true; }
696
+ return false;
697
+ }
698
+ function ua_ver_gt(a, b) {
699
+ if (1 == ua_ver_cmp(a,b)) { return true; }
700
+ return false;
701
+ }
702
+ function ua_ver_eq(a, b) {
703
+ if (0 == ua_ver_cmp(a,b)) { return true; }
704
+ return false;
705
+ }
706
+ ENDJS
707
+ super @js
708
+ update_opts(opts) if (opts)
709
+ update_opts({'Symbols' => {
710
+ 'Variables' => [
711
+ 'os_name', 'os_flavor',
712
+ 'os_sp', 'os_lang',
713
+ 'arch',
714
+ 'ua_name',
715
+ 'ua_version',
716
+ 'found_version',
717
+ 'needle',
718
+ 'haystack',
719
+ ],
720
+ 'Methods' => [
721
+ 'getVersion',
722
+ 'searchVersion'
723
+ ]
724
+ }
725
+ })
726
+
727
+ #self.obfuscate
728
+
729
+ return @js
730
+ end
731
+
732
+ end
733
+ end
734
+
735
+ end