immunio 0.15.4 → 0.16.0

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 (454) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +0 -27
  3. data/ext/immunio/Rakefile +9 -0
  4. data/lib/immunio/plugins/active_record.rb +1 -1
  5. data/lib/immunio/plugins/active_record_relation.rb +1 -1
  6. data/lib/immunio/plugins/environment_reporter.rb +20 -0
  7. data/lib/immunio/rufus_lua_ext/ref.rb +1 -3
  8. data/lib/immunio/version.rb +1 -1
  9. data/lib/immunio/vm.rb +1 -2
  10. data/lua-hooks/Makefile +97 -0
  11. data/lua-hooks/ext/all.c +41 -52
  12. data/lua-hooks/ext/all.o +0 -0
  13. data/lua-hooks/ext/libinjection/libinjection_html5.o +0 -0
  14. data/lua-hooks/ext/libinjection/libinjection_sqli.o +0 -0
  15. data/lua-hooks/ext/libinjection/libinjection_xss.o +0 -0
  16. data/lua-hooks/ext/libinjection/lualib.c +2 -2
  17. data/lua-hooks/ext/lpeg/lpcap.c +2 -2
  18. data/lua-hooks/ext/lpeg/lpcap.o +0 -0
  19. data/lua-hooks/ext/lpeg/lpcode.c +2 -2
  20. data/lua-hooks/ext/lpeg/lpcode.h +1 -1
  21. data/lua-hooks/ext/lpeg/lpcode.o +0 -0
  22. data/lua-hooks/ext/lpeg/lpprint.o +0 -0
  23. data/lua-hooks/ext/lpeg/lptree.c +2 -2
  24. data/lua-hooks/ext/lpeg/lptypes.h +1 -1
  25. data/lua-hooks/ext/lpeg/lpvm.c +2 -2
  26. data/lua-hooks/ext/lpeg/lpvm.o +0 -0
  27. data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +16 -3
  28. data/lua-hooks/ext/lua-snapshot/snapshot.c +14 -7
  29. data/lua-hooks/ext/luajit/COPYRIGHT +56 -0
  30. data/lua-hooks/ext/luajit/Makefile +159 -0
  31. data/lua-hooks/ext/luajit/README +16 -0
  32. data/lua-hooks/ext/luajit/doc/bluequad-print.css +166 -0
  33. data/lua-hooks/ext/luajit/doc/bluequad.css +325 -0
  34. data/lua-hooks/ext/luajit/doc/changes.html +804 -0
  35. data/lua-hooks/ext/luajit/doc/contact.html +104 -0
  36. data/lua-hooks/ext/luajit/doc/ext_c_api.html +189 -0
  37. data/lua-hooks/ext/luajit/doc/ext_ffi.html +332 -0
  38. data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +570 -0
  39. data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +1261 -0
  40. data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +603 -0
  41. data/lua-hooks/ext/luajit/doc/ext_jit.html +201 -0
  42. data/lua-hooks/ext/luajit/doc/ext_profiler.html +365 -0
  43. data/lua-hooks/ext/luajit/doc/extensions.html +448 -0
  44. data/lua-hooks/ext/luajit/doc/faq.html +186 -0
  45. data/lua-hooks/ext/luajit/doc/img/contact.png +0 -0
  46. data/lua-hooks/ext/luajit/doc/install.html +659 -0
  47. data/lua-hooks/ext/luajit/doc/luajit.html +236 -0
  48. data/lua-hooks/ext/luajit/doc/running.html +309 -0
  49. data/lua-hooks/ext/luajit/doc/status.html +118 -0
  50. data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +456 -0
  51. data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1125 -0
  52. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +518 -0
  53. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1166 -0
  54. data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +416 -0
  55. data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +953 -0
  56. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +419 -0
  57. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1919 -0
  58. data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +83 -0
  59. data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +12 -0
  60. data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +471 -0
  61. data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +1945 -0
  62. data/lua-hooks/ext/luajit/dynasm/dynasm.lua +1094 -0
  63. data/lua-hooks/ext/luajit/etc/luajit.1 +88 -0
  64. data/lua-hooks/ext/luajit/etc/luajit.pc +25 -0
  65. data/lua-hooks/ext/luajit/src/Makefile +697 -0
  66. data/lua-hooks/ext/luajit/src/Makefile.dep +244 -0
  67. data/lua-hooks/ext/luajit/src/host/README +4 -0
  68. data/lua-hooks/ext/luajit/src/host/buildvm +0 -0
  69. data/lua-hooks/ext/luajit/src/host/buildvm.c +518 -0
  70. data/lua-hooks/ext/luajit/src/host/buildvm.h +105 -0
  71. data/lua-hooks/ext/luajit/src/host/buildvm.o +0 -0
  72. data/lua-hooks/ext/luajit/src/host/buildvm_arch.h +7449 -0
  73. data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +345 -0
  74. data/lua-hooks/ext/luajit/src/host/buildvm_asm.o +0 -0
  75. data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +229 -0
  76. data/lua-hooks/ext/luajit/src/host/buildvm_fold.o +0 -0
  77. data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +457 -0
  78. data/lua-hooks/ext/luajit/src/host/buildvm_lib.o +0 -0
  79. data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +45 -0
  80. data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +368 -0
  81. data/lua-hooks/ext/luajit/src/host/buildvm_peobj.o +0 -0
  82. data/lua-hooks/ext/luajit/src/host/genlibbc.lua +197 -0
  83. data/lua-hooks/ext/luajit/src/host/genminilua.lua +428 -0
  84. data/lua-hooks/ext/luajit/src/host/minilua +0 -0
  85. data/lua-hooks/ext/luajit/src/host/minilua.c +7770 -0
  86. data/lua-hooks/ext/luajit/src/host/minilua.o +0 -0
  87. data/lua-hooks/ext/luajit/src/jit/bc.lua +190 -0
  88. data/lua-hooks/ext/luajit/src/jit/bcsave.lua +661 -0
  89. data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +689 -0
  90. data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +428 -0
  91. data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +17 -0
  92. data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +591 -0
  93. data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +17 -0
  94. data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +838 -0
  95. data/lua-hooks/ext/luajit/src/jit/dump.lua +706 -0
  96. data/lua-hooks/ext/luajit/src/jit/p.lua +310 -0
  97. data/lua-hooks/ext/luajit/src/jit/v.lua +170 -0
  98. data/lua-hooks/ext/luajit/src/jit/vmdef.lua +362 -0
  99. data/lua-hooks/ext/luajit/src/jit/zone.lua +45 -0
  100. data/lua-hooks/ext/{lua → luajit/src}/lauxlib.h +10 -17
  101. data/lua-hooks/ext/luajit/src/lib_aux.c +356 -0
  102. data/lua-hooks/ext/luajit/src/lib_aux.o +0 -0
  103. data/lua-hooks/ext/luajit/src/lib_aux_dyn.o +0 -0
  104. data/lua-hooks/ext/luajit/src/lib_base.c +664 -0
  105. data/lua-hooks/ext/luajit/src/lib_base.o +0 -0
  106. data/lua-hooks/ext/luajit/src/lib_base_dyn.o +0 -0
  107. data/lua-hooks/ext/luajit/src/lib_bit.c +180 -0
  108. data/lua-hooks/ext/luajit/src/lib_bit.o +0 -0
  109. data/lua-hooks/ext/luajit/src/lib_bit_dyn.o +0 -0
  110. data/lua-hooks/ext/luajit/src/lib_debug.c +405 -0
  111. data/lua-hooks/ext/luajit/src/lib_debug.o +0 -0
  112. data/lua-hooks/ext/luajit/src/lib_debug_dyn.o +0 -0
  113. data/lua-hooks/ext/luajit/src/lib_ffi.c +872 -0
  114. data/lua-hooks/ext/luajit/src/lib_ffi.o +0 -0
  115. data/lua-hooks/ext/luajit/src/lib_ffi_dyn.o +0 -0
  116. data/lua-hooks/ext/luajit/src/lib_init.c +55 -0
  117. data/lua-hooks/ext/luajit/src/lib_init.o +0 -0
  118. data/lua-hooks/ext/luajit/src/lib_init_dyn.o +0 -0
  119. data/lua-hooks/ext/luajit/src/lib_io.c +541 -0
  120. data/lua-hooks/ext/luajit/src/lib_io.o +0 -0
  121. data/lua-hooks/ext/luajit/src/lib_io_dyn.o +0 -0
  122. data/lua-hooks/ext/luajit/src/lib_jit.c +767 -0
  123. data/lua-hooks/ext/luajit/src/lib_jit.o +0 -0
  124. data/lua-hooks/ext/luajit/src/lib_jit_dyn.o +0 -0
  125. data/lua-hooks/ext/luajit/src/lib_math.c +230 -0
  126. data/lua-hooks/ext/luajit/src/lib_math.o +0 -0
  127. data/lua-hooks/ext/luajit/src/lib_math_dyn.o +0 -0
  128. data/lua-hooks/ext/luajit/src/lib_os.c +292 -0
  129. data/lua-hooks/ext/luajit/src/lib_os.o +0 -0
  130. data/lua-hooks/ext/luajit/src/lib_os_dyn.o +0 -0
  131. data/lua-hooks/ext/luajit/src/lib_package.c +610 -0
  132. data/lua-hooks/ext/luajit/src/lib_package.o +0 -0
  133. data/lua-hooks/ext/luajit/src/lib_package_dyn.o +0 -0
  134. data/lua-hooks/ext/luajit/src/lib_string.c +752 -0
  135. data/lua-hooks/ext/luajit/src/lib_string.o +0 -0
  136. data/lua-hooks/ext/luajit/src/lib_string_dyn.o +0 -0
  137. data/lua-hooks/ext/luajit/src/lib_table.c +307 -0
  138. data/lua-hooks/ext/luajit/src/lib_table.o +0 -0
  139. data/lua-hooks/ext/luajit/src/lib_table_dyn.o +0 -0
  140. data/lua-hooks/ext/luajit/src/libluajit.a +0 -0
  141. data/lua-hooks/ext/luajit/src/libluajit.so +0 -0
  142. data/lua-hooks/ext/luajit/src/lj.supp +26 -0
  143. data/lua-hooks/ext/luajit/src/lj_alloc.c +1398 -0
  144. data/lua-hooks/ext/luajit/src/lj_alloc.h +17 -0
  145. data/lua-hooks/ext/luajit/src/lj_alloc.o +0 -0
  146. data/lua-hooks/ext/luajit/src/lj_alloc_dyn.o +0 -0
  147. data/lua-hooks/ext/luajit/src/lj_api.c +1210 -0
  148. data/lua-hooks/ext/luajit/src/lj_api.o +0 -0
  149. data/lua-hooks/ext/luajit/src/lj_api_dyn.o +0 -0
  150. data/lua-hooks/ext/luajit/src/lj_arch.h +509 -0
  151. data/lua-hooks/ext/luajit/src/lj_asm.c +2278 -0
  152. data/lua-hooks/ext/luajit/src/lj_asm.h +17 -0
  153. data/lua-hooks/ext/luajit/src/lj_asm.o +0 -0
  154. data/lua-hooks/ext/luajit/src/lj_asm_arm.h +2217 -0
  155. data/lua-hooks/ext/luajit/src/lj_asm_dyn.o +0 -0
  156. data/lua-hooks/ext/luajit/src/lj_asm_mips.h +1833 -0
  157. data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +2015 -0
  158. data/lua-hooks/ext/luajit/src/lj_asm_x86.h +2634 -0
  159. data/lua-hooks/ext/luajit/src/lj_bc.c +14 -0
  160. data/lua-hooks/ext/luajit/src/lj_bc.h +265 -0
  161. data/lua-hooks/ext/luajit/src/lj_bc.o +0 -0
  162. data/lua-hooks/ext/luajit/src/lj_bc_dyn.o +0 -0
  163. data/lua-hooks/ext/luajit/src/lj_bcdef.h +220 -0
  164. data/lua-hooks/ext/luajit/src/lj_bcdump.h +68 -0
  165. data/lua-hooks/ext/luajit/src/lj_bcread.c +457 -0
  166. data/lua-hooks/ext/luajit/src/lj_bcread.o +0 -0
  167. data/lua-hooks/ext/luajit/src/lj_bcread_dyn.o +0 -0
  168. data/lua-hooks/ext/luajit/src/lj_bcwrite.c +361 -0
  169. data/lua-hooks/ext/luajit/src/lj_bcwrite.o +0 -0
  170. data/lua-hooks/ext/luajit/src/lj_bcwrite_dyn.o +0 -0
  171. data/lua-hooks/ext/luajit/src/lj_buf.c +234 -0
  172. data/lua-hooks/ext/luajit/src/lj_buf.h +105 -0
  173. data/lua-hooks/ext/luajit/src/lj_buf.o +0 -0
  174. data/lua-hooks/ext/luajit/src/lj_buf_dyn.o +0 -0
  175. data/lua-hooks/ext/luajit/src/lj_carith.c +429 -0
  176. data/lua-hooks/ext/luajit/src/lj_carith.h +37 -0
  177. data/lua-hooks/ext/luajit/src/lj_carith.o +0 -0
  178. data/lua-hooks/ext/luajit/src/lj_carith_dyn.o +0 -0
  179. data/lua-hooks/ext/luajit/src/lj_ccall.c +984 -0
  180. data/lua-hooks/ext/luajit/src/lj_ccall.h +178 -0
  181. data/lua-hooks/ext/luajit/src/lj_ccall.o +0 -0
  182. data/lua-hooks/ext/luajit/src/lj_ccall_dyn.o +0 -0
  183. data/lua-hooks/ext/luajit/src/lj_ccallback.c +712 -0
  184. data/lua-hooks/ext/luajit/src/lj_ccallback.h +25 -0
  185. data/lua-hooks/ext/luajit/src/lj_ccallback.o +0 -0
  186. data/lua-hooks/ext/luajit/src/lj_ccallback_dyn.o +0 -0
  187. data/lua-hooks/ext/luajit/src/lj_cconv.c +752 -0
  188. data/lua-hooks/ext/luajit/src/lj_cconv.h +70 -0
  189. data/lua-hooks/ext/luajit/src/lj_cconv.o +0 -0
  190. data/lua-hooks/ext/luajit/src/lj_cconv_dyn.o +0 -0
  191. data/lua-hooks/ext/luajit/src/lj_cdata.c +288 -0
  192. data/lua-hooks/ext/luajit/src/lj_cdata.h +76 -0
  193. data/lua-hooks/ext/luajit/src/lj_cdata.o +0 -0
  194. data/lua-hooks/ext/luajit/src/lj_cdata_dyn.o +0 -0
  195. data/lua-hooks/ext/luajit/src/lj_char.c +43 -0
  196. data/lua-hooks/ext/luajit/src/lj_char.h +42 -0
  197. data/lua-hooks/ext/luajit/src/lj_char.o +0 -0
  198. data/lua-hooks/ext/luajit/src/lj_char_dyn.o +0 -0
  199. data/lua-hooks/ext/luajit/src/lj_clib.c +418 -0
  200. data/lua-hooks/ext/luajit/src/lj_clib.h +29 -0
  201. data/lua-hooks/ext/luajit/src/lj_clib.o +0 -0
  202. data/lua-hooks/ext/luajit/src/lj_clib_dyn.o +0 -0
  203. data/lua-hooks/ext/luajit/src/lj_cparse.c +1862 -0
  204. data/lua-hooks/ext/luajit/src/lj_cparse.h +65 -0
  205. data/lua-hooks/ext/luajit/src/lj_cparse.o +0 -0
  206. data/lua-hooks/ext/luajit/src/lj_cparse_dyn.o +0 -0
  207. data/lua-hooks/ext/luajit/src/lj_crecord.c +1834 -0
  208. data/lua-hooks/ext/luajit/src/lj_crecord.h +38 -0
  209. data/lua-hooks/ext/luajit/src/lj_crecord.o +0 -0
  210. data/lua-hooks/ext/luajit/src/lj_crecord_dyn.o +0 -0
  211. data/lua-hooks/ext/luajit/src/lj_ctype.c +635 -0
  212. data/lua-hooks/ext/luajit/src/lj_ctype.h +461 -0
  213. data/lua-hooks/ext/luajit/src/lj_ctype.o +0 -0
  214. data/lua-hooks/ext/luajit/src/lj_ctype_dyn.o +0 -0
  215. data/lua-hooks/ext/luajit/src/lj_debug.c +699 -0
  216. data/lua-hooks/ext/luajit/src/lj_debug.h +65 -0
  217. data/lua-hooks/ext/luajit/src/lj_debug.o +0 -0
  218. data/lua-hooks/ext/luajit/src/lj_debug_dyn.o +0 -0
  219. data/lua-hooks/ext/luajit/src/lj_def.h +365 -0
  220. data/lua-hooks/ext/luajit/src/lj_dispatch.c +557 -0
  221. data/lua-hooks/ext/luajit/src/lj_dispatch.h +138 -0
  222. data/lua-hooks/ext/luajit/src/lj_dispatch.o +0 -0
  223. data/lua-hooks/ext/luajit/src/lj_dispatch_dyn.o +0 -0
  224. data/lua-hooks/ext/luajit/src/lj_emit_arm.h +356 -0
  225. data/lua-hooks/ext/luajit/src/lj_emit_mips.h +211 -0
  226. data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +238 -0
  227. data/lua-hooks/ext/luajit/src/lj_emit_x86.h +462 -0
  228. data/lua-hooks/ext/luajit/src/lj_err.c +794 -0
  229. data/lua-hooks/ext/luajit/src/lj_err.h +41 -0
  230. data/lua-hooks/ext/luajit/src/lj_err.o +0 -0
  231. data/lua-hooks/ext/luajit/src/lj_err_dyn.o +0 -0
  232. data/lua-hooks/ext/luajit/src/lj_errmsg.h +190 -0
  233. data/lua-hooks/ext/luajit/src/lj_ff.h +18 -0
  234. data/lua-hooks/ext/luajit/src/lj_ffdef.h +209 -0
  235. data/lua-hooks/ext/luajit/src/lj_ffrecord.c +1247 -0
  236. data/lua-hooks/ext/luajit/src/lj_ffrecord.h +24 -0
  237. data/lua-hooks/ext/luajit/src/lj_ffrecord.o +0 -0
  238. data/lua-hooks/ext/luajit/src/lj_ffrecord_dyn.o +0 -0
  239. data/lua-hooks/ext/luajit/src/lj_folddef.h +1138 -0
  240. data/lua-hooks/ext/luajit/src/lj_frame.h +259 -0
  241. data/lua-hooks/ext/luajit/src/lj_func.c +185 -0
  242. data/lua-hooks/ext/luajit/src/lj_func.h +24 -0
  243. data/lua-hooks/ext/luajit/src/lj_func.o +0 -0
  244. data/lua-hooks/ext/luajit/src/lj_func_dyn.o +0 -0
  245. data/lua-hooks/ext/luajit/src/lj_gc.c +845 -0
  246. data/lua-hooks/ext/luajit/src/lj_gc.h +134 -0
  247. data/lua-hooks/ext/luajit/src/lj_gc.o +0 -0
  248. data/lua-hooks/ext/luajit/src/lj_gc_dyn.o +0 -0
  249. data/lua-hooks/ext/luajit/src/lj_gdbjit.c +787 -0
  250. data/lua-hooks/ext/luajit/src/lj_gdbjit.h +22 -0
  251. data/lua-hooks/ext/luajit/src/lj_gdbjit.o +0 -0
  252. data/lua-hooks/ext/luajit/src/lj_gdbjit_dyn.o +0 -0
  253. data/lua-hooks/ext/luajit/src/lj_ir.c +505 -0
  254. data/lua-hooks/ext/luajit/src/lj_ir.h +577 -0
  255. data/lua-hooks/ext/luajit/src/lj_ir.o +0 -0
  256. data/lua-hooks/ext/luajit/src/lj_ir_dyn.o +0 -0
  257. data/lua-hooks/ext/luajit/src/lj_ircall.h +321 -0
  258. data/lua-hooks/ext/luajit/src/lj_iropt.h +161 -0
  259. data/lua-hooks/ext/luajit/src/lj_jit.h +440 -0
  260. data/lua-hooks/ext/luajit/src/lj_lex.c +482 -0
  261. data/lua-hooks/ext/luajit/src/lj_lex.h +86 -0
  262. data/lua-hooks/ext/luajit/src/lj_lex.o +0 -0
  263. data/lua-hooks/ext/luajit/src/lj_lex_dyn.o +0 -0
  264. data/lua-hooks/ext/luajit/src/lj_lib.c +303 -0
  265. data/lua-hooks/ext/luajit/src/lj_lib.h +115 -0
  266. data/lua-hooks/ext/luajit/src/lj_lib.o +0 -0
  267. data/lua-hooks/ext/luajit/src/lj_lib_dyn.o +0 -0
  268. data/lua-hooks/ext/luajit/src/lj_libdef.h +414 -0
  269. data/lua-hooks/ext/luajit/src/lj_load.c +168 -0
  270. data/lua-hooks/ext/luajit/src/lj_load.o +0 -0
  271. data/lua-hooks/ext/luajit/src/lj_load_dyn.o +0 -0
  272. data/lua-hooks/ext/luajit/src/lj_mcode.c +386 -0
  273. data/lua-hooks/ext/luajit/src/lj_mcode.h +30 -0
  274. data/lua-hooks/ext/luajit/src/lj_mcode.o +0 -0
  275. data/lua-hooks/ext/luajit/src/lj_mcode_dyn.o +0 -0
  276. data/lua-hooks/ext/luajit/src/lj_meta.c +477 -0
  277. data/lua-hooks/ext/luajit/src/lj_meta.h +38 -0
  278. data/lua-hooks/ext/luajit/src/lj_meta.o +0 -0
  279. data/lua-hooks/ext/luajit/src/lj_meta_dyn.o +0 -0
  280. data/lua-hooks/ext/luajit/src/lj_obj.c +50 -0
  281. data/lua-hooks/ext/luajit/src/lj_obj.h +976 -0
  282. data/lua-hooks/ext/luajit/src/lj_obj.o +0 -0
  283. data/lua-hooks/ext/luajit/src/lj_obj_dyn.o +0 -0
  284. data/lua-hooks/ext/luajit/src/lj_opt_dce.c +78 -0
  285. data/lua-hooks/ext/luajit/src/lj_opt_dce.o +0 -0
  286. data/lua-hooks/ext/luajit/src/lj_opt_dce_dyn.o +0 -0
  287. data/lua-hooks/ext/luajit/src/lj_opt_fold.c +2488 -0
  288. data/lua-hooks/ext/luajit/src/lj_opt_fold.o +0 -0
  289. data/lua-hooks/ext/luajit/src/lj_opt_fold_dyn.o +0 -0
  290. data/lua-hooks/ext/luajit/src/lj_opt_loop.c +449 -0
  291. data/lua-hooks/ext/luajit/src/lj_opt_loop.o +0 -0
  292. data/lua-hooks/ext/luajit/src/lj_opt_loop_dyn.o +0 -0
  293. data/lua-hooks/ext/luajit/src/lj_opt_mem.c +935 -0
  294. data/lua-hooks/ext/luajit/src/lj_opt_mem.o +0 -0
  295. data/lua-hooks/ext/luajit/src/lj_opt_mem_dyn.o +0 -0
  296. data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +652 -0
  297. data/lua-hooks/ext/luajit/src/lj_opt_narrow.o +0 -0
  298. data/lua-hooks/ext/luajit/src/lj_opt_narrow_dyn.o +0 -0
  299. data/lua-hooks/ext/luajit/src/lj_opt_sink.c +245 -0
  300. data/lua-hooks/ext/luajit/src/lj_opt_sink.o +0 -0
  301. data/lua-hooks/ext/luajit/src/lj_opt_sink_dyn.o +0 -0
  302. data/lua-hooks/ext/luajit/src/lj_opt_split.c +856 -0
  303. data/lua-hooks/ext/luajit/src/lj_opt_split.o +0 -0
  304. data/lua-hooks/ext/luajit/src/lj_opt_split_dyn.o +0 -0
  305. data/lua-hooks/ext/luajit/src/lj_parse.c +2725 -0
  306. data/lua-hooks/ext/luajit/src/lj_parse.h +18 -0
  307. data/lua-hooks/ext/luajit/src/lj_parse.o +0 -0
  308. data/lua-hooks/ext/luajit/src/lj_parse_dyn.o +0 -0
  309. data/lua-hooks/ext/luajit/src/lj_profile.c +368 -0
  310. data/lua-hooks/ext/luajit/src/lj_profile.h +21 -0
  311. data/lua-hooks/ext/luajit/src/lj_profile.o +0 -0
  312. data/lua-hooks/ext/luajit/src/lj_profile_dyn.o +0 -0
  313. data/lua-hooks/ext/luajit/src/lj_recdef.h +270 -0
  314. data/lua-hooks/ext/luajit/src/lj_record.c +2554 -0
  315. data/lua-hooks/ext/luajit/src/lj_record.h +45 -0
  316. data/lua-hooks/ext/luajit/src/lj_record.o +0 -0
  317. data/lua-hooks/ext/luajit/src/lj_record_dyn.o +0 -0
  318. data/lua-hooks/ext/luajit/src/lj_snap.c +870 -0
  319. data/lua-hooks/ext/luajit/src/lj_snap.h +34 -0
  320. data/lua-hooks/ext/luajit/src/lj_snap.o +0 -0
  321. data/lua-hooks/ext/luajit/src/lj_snap_dyn.o +0 -0
  322. data/lua-hooks/ext/luajit/src/lj_state.c +300 -0
  323. data/lua-hooks/ext/luajit/src/lj_state.h +35 -0
  324. data/lua-hooks/ext/luajit/src/lj_state.o +0 -0
  325. data/lua-hooks/ext/luajit/src/lj_state_dyn.o +0 -0
  326. data/lua-hooks/ext/luajit/src/lj_str.c +197 -0
  327. data/lua-hooks/ext/luajit/src/lj_str.h +27 -0
  328. data/lua-hooks/ext/luajit/src/lj_str.o +0 -0
  329. data/lua-hooks/ext/luajit/src/lj_str_dyn.o +0 -0
  330. data/lua-hooks/ext/luajit/src/lj_strfmt.c +554 -0
  331. data/lua-hooks/ext/luajit/src/lj_strfmt.h +125 -0
  332. data/lua-hooks/ext/luajit/src/lj_strfmt.o +0 -0
  333. data/lua-hooks/ext/luajit/src/lj_strfmt_dyn.o +0 -0
  334. data/lua-hooks/ext/luajit/src/lj_strscan.c +547 -0
  335. data/lua-hooks/ext/luajit/src/lj_strscan.h +39 -0
  336. data/lua-hooks/ext/luajit/src/lj_strscan.o +0 -0
  337. data/lua-hooks/ext/luajit/src/lj_strscan_dyn.o +0 -0
  338. data/lua-hooks/ext/luajit/src/lj_tab.c +666 -0
  339. data/lua-hooks/ext/luajit/src/lj_tab.h +73 -0
  340. data/lua-hooks/ext/luajit/src/lj_tab.o +0 -0
  341. data/lua-hooks/ext/luajit/src/lj_tab_dyn.o +0 -0
  342. data/lua-hooks/ext/luajit/src/lj_target.h +164 -0
  343. data/lua-hooks/ext/luajit/src/lj_target_arm.h +270 -0
  344. data/lua-hooks/ext/luajit/src/lj_target_arm64.h +97 -0
  345. data/lua-hooks/ext/luajit/src/lj_target_mips.h +260 -0
  346. data/lua-hooks/ext/luajit/src/lj_target_ppc.h +280 -0
  347. data/lua-hooks/ext/luajit/src/lj_target_x86.h +345 -0
  348. data/lua-hooks/ext/luajit/src/lj_trace.c +859 -0
  349. data/lua-hooks/ext/luajit/src/lj_trace.h +54 -0
  350. data/lua-hooks/ext/luajit/src/lj_trace.o +0 -0
  351. data/lua-hooks/ext/luajit/src/lj_trace_dyn.o +0 -0
  352. data/lua-hooks/ext/luajit/src/lj_traceerr.h +63 -0
  353. data/lua-hooks/ext/luajit/src/lj_udata.c +34 -0
  354. data/lua-hooks/ext/luajit/src/lj_udata.h +14 -0
  355. data/lua-hooks/ext/luajit/src/lj_udata.o +0 -0
  356. data/lua-hooks/ext/luajit/src/lj_udata_dyn.o +0 -0
  357. data/lua-hooks/ext/luajit/src/lj_vm.S +2730 -0
  358. data/lua-hooks/ext/luajit/src/lj_vm.h +114 -0
  359. data/lua-hooks/ext/luajit/src/lj_vm.o +0 -0
  360. data/lua-hooks/ext/luajit/src/lj_vm_dyn.o +0 -0
  361. data/lua-hooks/ext/luajit/src/lj_vmevent.c +58 -0
  362. data/lua-hooks/ext/luajit/src/lj_vmevent.h +59 -0
  363. data/lua-hooks/ext/luajit/src/lj_vmevent.o +0 -0
  364. data/lua-hooks/ext/luajit/src/lj_vmevent_dyn.o +0 -0
  365. data/lua-hooks/ext/luajit/src/lj_vmmath.c +152 -0
  366. data/lua-hooks/ext/luajit/src/lj_vmmath.o +0 -0
  367. data/lua-hooks/ext/luajit/src/lj_vmmath_dyn.o +0 -0
  368. data/lua-hooks/ext/luajit/src/ljamalg.c +96 -0
  369. data/lua-hooks/ext/{lua → luajit/src}/lua.h +12 -7
  370. data/lua-hooks/ext/luajit/src/lua.hpp +9 -0
  371. data/lua-hooks/ext/luajit/src/luaconf.h +156 -0
  372. data/lua-hooks/ext/luajit/src/luajit +0 -0
  373. data/lua-hooks/ext/luajit/src/luajit.c +570 -0
  374. data/lua-hooks/ext/luajit/src/luajit.h +79 -0
  375. data/lua-hooks/ext/luajit/src/luajit.o +0 -0
  376. data/lua-hooks/ext/luajit/src/lualib.h +43 -0
  377. data/lua-hooks/ext/luajit/src/msvcbuild.bat +114 -0
  378. data/lua-hooks/ext/luajit/src/ps4build.bat +103 -0
  379. data/lua-hooks/ext/luajit/src/psvitabuild.bat +93 -0
  380. data/lua-hooks/ext/luajit/src/vm_arm.dasc +4585 -0
  381. data/lua-hooks/ext/luajit/src/vm_arm64.dasc +3764 -0
  382. data/lua-hooks/ext/luajit/src/vm_mips.dasc +4355 -0
  383. data/lua-hooks/ext/luajit/src/vm_ppc.dasc +5252 -0
  384. data/lua-hooks/ext/luajit/src/vm_x64.dasc +4902 -0
  385. data/lua-hooks/ext/luajit/src/vm_x86.dasc +5710 -0
  386. data/lua-hooks/ext/luajit/src/xb1build.bat +101 -0
  387. data/lua-hooks/ext/luajit/src/xedkbuild.bat +92 -0
  388. data/lua-hooks/ext/luautf8/lutf8lib.c +3 -3
  389. data/lua-hooks/lib/boot.lua +37 -2
  390. metadata +372 -69
  391. data/lua-hooks/ext/bitop/README +0 -22
  392. data/lua-hooks/ext/bitop/bit.c +0 -189
  393. data/lua-hooks/ext/extconf.rb +0 -38
  394. data/lua-hooks/ext/lua/COPYRIGHT +0 -34
  395. data/lua-hooks/ext/lua/lapi.c +0 -1087
  396. data/lua-hooks/ext/lua/lapi.h +0 -16
  397. data/lua-hooks/ext/lua/lauxlib.c +0 -652
  398. data/lua-hooks/ext/lua/lbaselib.c +0 -659
  399. data/lua-hooks/ext/lua/lcode.c +0 -831
  400. data/lua-hooks/ext/lua/lcode.h +0 -76
  401. data/lua-hooks/ext/lua/ldblib.c +0 -398
  402. data/lua-hooks/ext/lua/ldebug.c +0 -638
  403. data/lua-hooks/ext/lua/ldebug.h +0 -33
  404. data/lua-hooks/ext/lua/ldo.c +0 -519
  405. data/lua-hooks/ext/lua/ldo.h +0 -57
  406. data/lua-hooks/ext/lua/ldump.c +0 -164
  407. data/lua-hooks/ext/lua/lfunc.c +0 -174
  408. data/lua-hooks/ext/lua/lfunc.h +0 -34
  409. data/lua-hooks/ext/lua/lgc.c +0 -710
  410. data/lua-hooks/ext/lua/lgc.h +0 -110
  411. data/lua-hooks/ext/lua/linit.c +0 -38
  412. data/lua-hooks/ext/lua/liolib.c +0 -556
  413. data/lua-hooks/ext/lua/llex.c +0 -463
  414. data/lua-hooks/ext/lua/llex.h +0 -81
  415. data/lua-hooks/ext/lua/llimits.h +0 -128
  416. data/lua-hooks/ext/lua/lmathlib.c +0 -263
  417. data/lua-hooks/ext/lua/lmem.c +0 -86
  418. data/lua-hooks/ext/lua/lmem.h +0 -49
  419. data/lua-hooks/ext/lua/loadlib.c +0 -705
  420. data/lua-hooks/ext/lua/loadlib_rel.c +0 -760
  421. data/lua-hooks/ext/lua/lobject.c +0 -214
  422. data/lua-hooks/ext/lua/lobject.h +0 -381
  423. data/lua-hooks/ext/lua/lopcodes.c +0 -102
  424. data/lua-hooks/ext/lua/lopcodes.h +0 -268
  425. data/lua-hooks/ext/lua/loslib.c +0 -243
  426. data/lua-hooks/ext/lua/lparser.c +0 -1339
  427. data/lua-hooks/ext/lua/lparser.h +0 -82
  428. data/lua-hooks/ext/lua/lstate.c +0 -214
  429. data/lua-hooks/ext/lua/lstate.h +0 -169
  430. data/lua-hooks/ext/lua/lstring.c +0 -111
  431. data/lua-hooks/ext/lua/lstring.h +0 -31
  432. data/lua-hooks/ext/lua/lstrlib.c +0 -871
  433. data/lua-hooks/ext/lua/ltable.c +0 -588
  434. data/lua-hooks/ext/lua/ltable.h +0 -40
  435. data/lua-hooks/ext/lua/ltablib.c +0 -287
  436. data/lua-hooks/ext/lua/ltm.c +0 -75
  437. data/lua-hooks/ext/lua/ltm.h +0 -54
  438. data/lua-hooks/ext/lua/lua.c +0 -392
  439. data/lua-hooks/ext/lua/lua.def +0 -131
  440. data/lua-hooks/ext/lua/lua.rc +0 -28
  441. data/lua-hooks/ext/lua/lua_dll.rc +0 -26
  442. data/lua-hooks/ext/lua/luac.c +0 -200
  443. data/lua-hooks/ext/lua/luac.rc +0 -1
  444. data/lua-hooks/ext/lua/luaconf.h +0 -763
  445. data/lua-hooks/ext/lua/luaconf.h.in +0 -724
  446. data/lua-hooks/ext/lua/luaconf.h.orig +0 -763
  447. data/lua-hooks/ext/lua/lualib.h +0 -53
  448. data/lua-hooks/ext/lua/lundump.c +0 -227
  449. data/lua-hooks/ext/lua/lundump.h +0 -36
  450. data/lua-hooks/ext/lua/lvm.c +0 -767
  451. data/lua-hooks/ext/lua/lvm.h +0 -36
  452. data/lua-hooks/ext/lua/lzio.c +0 -82
  453. data/lua-hooks/ext/lua/lzio.h +0 -67
  454. data/lua-hooks/ext/lua/print.c +0 -227
@@ -0,0 +1,17 @@
1
+ ----------------------------------------------------------------------------
2
+ -- LuaJIT x64 disassembler wrapper module.
3
+ --
4
+ -- Copyright (C) 2005-2015 Mike Pall. All rights reserved.
5
+ -- Released under the MIT license. See Copyright Notice in luajit.h
6
+ ----------------------------------------------------------------------------
7
+ -- This module just exports the 64 bit functions from the combined
8
+ -- x86/x64 disassembler module. All the interesting stuff is there.
9
+ ------------------------------------------------------------------------------
10
+
11
+ local dis_x86 = require((string.match(..., ".*%.") or "").."dis_x86")
12
+ return {
13
+ create = dis_x86.create64,
14
+ disass = dis_x86.disass64,
15
+ regname = dis_x86.regname64
16
+ }
17
+
@@ -0,0 +1,838 @@
1
+ ----------------------------------------------------------------------------
2
+ -- LuaJIT x86/x64 disassembler module.
3
+ --
4
+ -- Copyright (C) 2005-2015 Mike Pall. All rights reserved.
5
+ -- Released under the MIT license. See Copyright Notice in luajit.h
6
+ ----------------------------------------------------------------------------
7
+ -- This is a helper module used by the LuaJIT machine code dumper module.
8
+ --
9
+ -- Sending small code snippets to an external disassembler and mixing the
10
+ -- output with our own stuff was too fragile. So I had to bite the bullet
11
+ -- and write yet another x86 disassembler. Oh well ...
12
+ --
13
+ -- The output format is very similar to what ndisasm generates. But it has
14
+ -- been developed independently by looking at the opcode tables from the
15
+ -- Intel and AMD manuals. The supported instruction set is quite extensive
16
+ -- and reflects what a current generation Intel or AMD CPU implements in
17
+ -- 32 bit and 64 bit mode. Yes, this includes MMX, SSE, SSE2, SSE3, SSSE3,
18
+ -- SSE4.1, SSE4.2, SSE4a and even privileged and hypervisor (VMX/SVM)
19
+ -- instructions.
20
+ --
21
+ -- Notes:
22
+ -- * The (useless) a16 prefix, 3DNow and pre-586 opcodes are unsupported.
23
+ -- * No attempt at optimization has been made -- it's fast enough for my needs.
24
+ -- * The public API may change when more architectures are added.
25
+ ------------------------------------------------------------------------------
26
+
27
+ local type = type
28
+ local sub, byte, format = string.sub, string.byte, string.format
29
+ local match, gmatch, gsub = string.match, string.gmatch, string.gsub
30
+ local lower, rep = string.lower, string.rep
31
+ local bit = require("bit")
32
+ local tohex = bit.tohex
33
+
34
+ -- Map for 1st opcode byte in 32 bit mode. Ugly? Well ... read on.
35
+ local map_opc1_32 = {
36
+ --0x
37
+ [0]="addBmr","addVmr","addBrm","addVrm","addBai","addVai","push es","pop es",
38
+ "orBmr","orVmr","orBrm","orVrm","orBai","orVai","push cs","opc2*",
39
+ --1x
40
+ "adcBmr","adcVmr","adcBrm","adcVrm","adcBai","adcVai","push ss","pop ss",
41
+ "sbbBmr","sbbVmr","sbbBrm","sbbVrm","sbbBai","sbbVai","push ds","pop ds",
42
+ --2x
43
+ "andBmr","andVmr","andBrm","andVrm","andBai","andVai","es:seg","daa",
44
+ "subBmr","subVmr","subBrm","subVrm","subBai","subVai","cs:seg","das",
45
+ --3x
46
+ "xorBmr","xorVmr","xorBrm","xorVrm","xorBai","xorVai","ss:seg","aaa",
47
+ "cmpBmr","cmpVmr","cmpBrm","cmpVrm","cmpBai","cmpVai","ds:seg","aas",
48
+ --4x
49
+ "incVR","incVR","incVR","incVR","incVR","incVR","incVR","incVR",
50
+ "decVR","decVR","decVR","decVR","decVR","decVR","decVR","decVR",
51
+ --5x
52
+ "pushUR","pushUR","pushUR","pushUR","pushUR","pushUR","pushUR","pushUR",
53
+ "popUR","popUR","popUR","popUR","popUR","popUR","popUR","popUR",
54
+ --6x
55
+ "sz*pushaw,pusha","sz*popaw,popa","boundVrm","arplWmr",
56
+ "fs:seg","gs:seg","o16:","a16",
57
+ "pushUi","imulVrmi","pushBs","imulVrms",
58
+ "insb","insVS","outsb","outsVS",
59
+ --7x
60
+ "joBj","jnoBj","jbBj","jnbBj","jzBj","jnzBj","jbeBj","jaBj",
61
+ "jsBj","jnsBj","jpeBj","jpoBj","jlBj","jgeBj","jleBj","jgBj",
62
+ --8x
63
+ "arith!Bmi","arith!Vmi","arith!Bmi","arith!Vms",
64
+ "testBmr","testVmr","xchgBrm","xchgVrm",
65
+ "movBmr","movVmr","movBrm","movVrm",
66
+ "movVmg","leaVrm","movWgm","popUm",
67
+ --9x
68
+ "nop*xchgVaR|pause|xchgWaR|repne nop","xchgVaR","xchgVaR","xchgVaR",
69
+ "xchgVaR","xchgVaR","xchgVaR","xchgVaR",
70
+ "sz*cbw,cwde,cdqe","sz*cwd,cdq,cqo","call farViw","wait",
71
+ "sz*pushfw,pushf","sz*popfw,popf","sahf","lahf",
72
+ --Ax
73
+ "movBao","movVao","movBoa","movVoa",
74
+ "movsb","movsVS","cmpsb","cmpsVS",
75
+ "testBai","testVai","stosb","stosVS",
76
+ "lodsb","lodsVS","scasb","scasVS",
77
+ --Bx
78
+ "movBRi","movBRi","movBRi","movBRi","movBRi","movBRi","movBRi","movBRi",
79
+ "movVRI","movVRI","movVRI","movVRI","movVRI","movVRI","movVRI","movVRI",
80
+ --Cx
81
+ "shift!Bmu","shift!Vmu","retBw","ret","$lesVrm","$ldsVrm","movBmi","movVmi",
82
+ "enterBwu","leave","retfBw","retf","int3","intBu","into","iretVS",
83
+ --Dx
84
+ "shift!Bm1","shift!Vm1","shift!Bmc","shift!Vmc","aamBu","aadBu","salc","xlatb",
85
+ "fp*0","fp*1","fp*2","fp*3","fp*4","fp*5","fp*6","fp*7",
86
+ --Ex
87
+ "loopneBj","loopeBj","loopBj","sz*jcxzBj,jecxzBj,jrcxzBj",
88
+ "inBau","inVau","outBua","outVua",
89
+ "callVj","jmpVj","jmp farViw","jmpBj","inBad","inVad","outBda","outVda",
90
+ --Fx
91
+ "lock:","int1","repne:rep","rep:","hlt","cmc","testb!Bm","testv!Vm",
92
+ "clc","stc","cli","sti","cld","std","incb!Bm","incd!Vm",
93
+ }
94
+ assert(#map_opc1_32 == 255)
95
+
96
+ -- Map for 1st opcode byte in 64 bit mode (overrides only).
97
+ local map_opc1_64 = setmetatable({
98
+ [0x06]=false, [0x07]=false, [0x0e]=false,
99
+ [0x16]=false, [0x17]=false, [0x1e]=false, [0x1f]=false,
100
+ [0x27]=false, [0x2f]=false, [0x37]=false, [0x3f]=false,
101
+ [0x60]=false, [0x61]=false, [0x62]=false, [0x63]="movsxdVrDmt", [0x67]="a32:",
102
+ [0x40]="rex*", [0x41]="rex*b", [0x42]="rex*x", [0x43]="rex*xb",
103
+ [0x44]="rex*r", [0x45]="rex*rb", [0x46]="rex*rx", [0x47]="rex*rxb",
104
+ [0x48]="rex*w", [0x49]="rex*wb", [0x4a]="rex*wx", [0x4b]="rex*wxb",
105
+ [0x4c]="rex*wr", [0x4d]="rex*wrb", [0x4e]="rex*wrx", [0x4f]="rex*wrxb",
106
+ [0x82]=false, [0x9a]=false, [0xc4]=false, [0xc5]=false, [0xce]=false,
107
+ [0xd4]=false, [0xd5]=false, [0xd6]=false, [0xea]=false,
108
+ }, { __index = map_opc1_32 })
109
+
110
+ -- Map for 2nd opcode byte (0F xx). True CISC hell. Hey, I told you.
111
+ -- Prefix dependent MMX/SSE opcodes: (none)|rep|o16|repne, -|F3|66|F2
112
+ local map_opc2 = {
113
+ --0x
114
+ [0]="sldt!Dmp","sgdt!Ump","larVrm","lslVrm",nil,"syscall","clts","sysret",
115
+ "invd","wbinvd",nil,"ud1",nil,"$prefetch!Bm","femms","3dnowMrmu",
116
+ --1x
117
+ "movupsXrm|movssXrm|movupdXrm|movsdXrm",
118
+ "movupsXmr|movssXmr|movupdXmr|movsdXmr",
119
+ "movhlpsXrm$movlpsXrm|movsldupXrm|movlpdXrm|movddupXrm",
120
+ "movlpsXmr||movlpdXmr",
121
+ "unpcklpsXrm||unpcklpdXrm",
122
+ "unpckhpsXrm||unpckhpdXrm",
123
+ "movlhpsXrm$movhpsXrm|movshdupXrm|movhpdXrm",
124
+ "movhpsXmr||movhpdXmr",
125
+ "$prefetcht!Bm","hintnopVm","hintnopVm","hintnopVm",
126
+ "hintnopVm","hintnopVm","hintnopVm","hintnopVm",
127
+ --2x
128
+ "movUmx$","movUmy$","movUxm$","movUym$","movUmz$",nil,"movUzm$",nil,
129
+ "movapsXrm||movapdXrm",
130
+ "movapsXmr||movapdXmr",
131
+ "cvtpi2psXrMm|cvtsi2ssXrVmt|cvtpi2pdXrMm|cvtsi2sdXrVmt",
132
+ "movntpsXmr|movntssXmr|movntpdXmr|movntsdXmr",
133
+ "cvttps2piMrXm|cvttss2siVrXm|cvttpd2piMrXm|cvttsd2siVrXm",
134
+ "cvtps2piMrXm|cvtss2siVrXm|cvtpd2piMrXm|cvtsd2siVrXm",
135
+ "ucomissXrm||ucomisdXrm",
136
+ "comissXrm||comisdXrm",
137
+ --3x
138
+ "wrmsr","rdtsc","rdmsr","rdpmc","sysenter","sysexit",nil,"getsec",
139
+ "opc3*38",nil,"opc3*3a",nil,nil,nil,nil,nil,
140
+ --4x
141
+ "cmovoVrm","cmovnoVrm","cmovbVrm","cmovnbVrm",
142
+ "cmovzVrm","cmovnzVrm","cmovbeVrm","cmovaVrm",
143
+ "cmovsVrm","cmovnsVrm","cmovpeVrm","cmovpoVrm",
144
+ "cmovlVrm","cmovgeVrm","cmovleVrm","cmovgVrm",
145
+ --5x
146
+ "movmskpsVrXm$||movmskpdVrXm$","sqrtpsXrm|sqrtssXrm|sqrtpdXrm|sqrtsdXrm",
147
+ "rsqrtpsXrm|rsqrtssXrm","rcppsXrm|rcpssXrm",
148
+ "andpsXrm||andpdXrm","andnpsXrm||andnpdXrm",
149
+ "orpsXrm||orpdXrm","xorpsXrm||xorpdXrm",
150
+ "addpsXrm|addssXrm|addpdXrm|addsdXrm","mulpsXrm|mulssXrm|mulpdXrm|mulsdXrm",
151
+ "cvtps2pdXrm|cvtss2sdXrm|cvtpd2psXrm|cvtsd2ssXrm",
152
+ "cvtdq2psXrm|cvttps2dqXrm|cvtps2dqXrm",
153
+ "subpsXrm|subssXrm|subpdXrm|subsdXrm","minpsXrm|minssXrm|minpdXrm|minsdXrm",
154
+ "divpsXrm|divssXrm|divpdXrm|divsdXrm","maxpsXrm|maxssXrm|maxpdXrm|maxsdXrm",
155
+ --6x
156
+ "punpcklbwPrm","punpcklwdPrm","punpckldqPrm","packsswbPrm",
157
+ "pcmpgtbPrm","pcmpgtwPrm","pcmpgtdPrm","packuswbPrm",
158
+ "punpckhbwPrm","punpckhwdPrm","punpckhdqPrm","packssdwPrm",
159
+ "||punpcklqdqXrm","||punpckhqdqXrm",
160
+ "movPrVSm","movqMrm|movdquXrm|movdqaXrm",
161
+ --7x
162
+ "pshufwMrmu|pshufhwXrmu|pshufdXrmu|pshuflwXrmu","pshiftw!Pmu",
163
+ "pshiftd!Pmu","pshiftq!Mmu||pshiftdq!Xmu",
164
+ "pcmpeqbPrm","pcmpeqwPrm","pcmpeqdPrm","emms|",
165
+ "vmreadUmr||extrqXmuu$|insertqXrmuu$","vmwriteUrm||extrqXrm$|insertqXrm$",
166
+ nil,nil,
167
+ "||haddpdXrm|haddpsXrm","||hsubpdXrm|hsubpsXrm",
168
+ "movVSmMr|movqXrm|movVSmXr","movqMmr|movdquXmr|movdqaXmr",
169
+ --8x
170
+ "joVj","jnoVj","jbVj","jnbVj","jzVj","jnzVj","jbeVj","jaVj",
171
+ "jsVj","jnsVj","jpeVj","jpoVj","jlVj","jgeVj","jleVj","jgVj",
172
+ --9x
173
+ "setoBm","setnoBm","setbBm","setnbBm","setzBm","setnzBm","setbeBm","setaBm",
174
+ "setsBm","setnsBm","setpeBm","setpoBm","setlBm","setgeBm","setleBm","setgBm",
175
+ --Ax
176
+ "push fs","pop fs","cpuid","btVmr","shldVmru","shldVmrc",nil,nil,
177
+ "push gs","pop gs","rsm","btsVmr","shrdVmru","shrdVmrc","fxsave!Dmp","imulVrm",
178
+ --Bx
179
+ "cmpxchgBmr","cmpxchgVmr","$lssVrm","btrVmr",
180
+ "$lfsVrm","$lgsVrm","movzxVrBmt","movzxVrWmt",
181
+ "|popcntVrm","ud2Dp","bt!Vmu","btcVmr",
182
+ "bsfVrm","bsrVrm|lzcntVrm|bsrWrm","movsxVrBmt","movsxVrWmt",
183
+ --Cx
184
+ "xaddBmr","xaddVmr",
185
+ "cmppsXrmu|cmpssXrmu|cmppdXrmu|cmpsdXrmu","$movntiVmr|",
186
+ "pinsrwPrWmu","pextrwDrPmu",
187
+ "shufpsXrmu||shufpdXrmu","$cmpxchg!Qmp",
188
+ "bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR","bswapVR",
189
+ --Dx
190
+ "||addsubpdXrm|addsubpsXrm","psrlwPrm","psrldPrm","psrlqPrm",
191
+ "paddqPrm","pmullwPrm",
192
+ "|movq2dqXrMm|movqXmr|movdq2qMrXm$","pmovmskbVrMm||pmovmskbVrXm",
193
+ "psubusbPrm","psubuswPrm","pminubPrm","pandPrm",
194
+ "paddusbPrm","padduswPrm","pmaxubPrm","pandnPrm",
195
+ --Ex
196
+ "pavgbPrm","psrawPrm","psradPrm","pavgwPrm",
197
+ "pmulhuwPrm","pmulhwPrm",
198
+ "|cvtdq2pdXrm|cvttpd2dqXrm|cvtpd2dqXrm","$movntqMmr||$movntdqXmr",
199
+ "psubsbPrm","psubswPrm","pminswPrm","porPrm",
200
+ "paddsbPrm","paddswPrm","pmaxswPrm","pxorPrm",
201
+ --Fx
202
+ "|||lddquXrm","psllwPrm","pslldPrm","psllqPrm",
203
+ "pmuludqPrm","pmaddwdPrm","psadbwPrm","maskmovqMrm||maskmovdquXrm$",
204
+ "psubbPrm","psubwPrm","psubdPrm","psubqPrm",
205
+ "paddbPrm","paddwPrm","padddPrm","ud",
206
+ }
207
+ assert(map_opc2[255] == "ud")
208
+
209
+ -- Map for three-byte opcodes. Can't wait for their next invention.
210
+ local map_opc3 = {
211
+ ["38"] = { -- [66] 0f 38 xx
212
+ --0x
213
+ [0]="pshufbPrm","phaddwPrm","phadddPrm","phaddswPrm",
214
+ "pmaddubswPrm","phsubwPrm","phsubdPrm","phsubswPrm",
215
+ "psignbPrm","psignwPrm","psigndPrm","pmulhrswPrm",
216
+ nil,nil,nil,nil,
217
+ --1x
218
+ "||pblendvbXrma",nil,nil,nil,
219
+ "||blendvpsXrma","||blendvpdXrma",nil,"||ptestXrm",
220
+ nil,nil,nil,nil,
221
+ "pabsbPrm","pabswPrm","pabsdPrm",nil,
222
+ --2x
223
+ "||pmovsxbwXrm","||pmovsxbdXrm","||pmovsxbqXrm","||pmovsxwdXrm",
224
+ "||pmovsxwqXrm","||pmovsxdqXrm",nil,nil,
225
+ "||pmuldqXrm","||pcmpeqqXrm","||$movntdqaXrm","||packusdwXrm",
226
+ nil,nil,nil,nil,
227
+ --3x
228
+ "||pmovzxbwXrm","||pmovzxbdXrm","||pmovzxbqXrm","||pmovzxwdXrm",
229
+ "||pmovzxwqXrm","||pmovzxdqXrm",nil,"||pcmpgtqXrm",
230
+ "||pminsbXrm","||pminsdXrm","||pminuwXrm","||pminudXrm",
231
+ "||pmaxsbXrm","||pmaxsdXrm","||pmaxuwXrm","||pmaxudXrm",
232
+ --4x
233
+ "||pmulddXrm","||phminposuwXrm",
234
+ --Fx
235
+ [0xf0] = "|||crc32TrBmt",[0xf1] = "|||crc32TrVmt",
236
+ },
237
+
238
+ ["3a"] = { -- [66] 0f 3a xx
239
+ --0x
240
+ [0x00]=nil,nil,nil,nil,nil,nil,nil,nil,
241
+ "||roundpsXrmu","||roundpdXrmu","||roundssXrmu","||roundsdXrmu",
242
+ "||blendpsXrmu","||blendpdXrmu","||pblendwXrmu","palignrPrmu",
243
+ --1x
244
+ nil,nil,nil,nil,
245
+ "||pextrbVmXru","||pextrwVmXru","||pextrVmSXru","||extractpsVmXru",
246
+ nil,nil,nil,nil,nil,nil,nil,nil,
247
+ --2x
248
+ "||pinsrbXrVmu","||insertpsXrmu","||pinsrXrVmuS",nil,
249
+ --4x
250
+ [0x40] = "||dppsXrmu",
251
+ [0x41] = "||dppdXrmu",
252
+ [0x42] = "||mpsadbwXrmu",
253
+ --6x
254
+ [0x60] = "||pcmpestrmXrmu",[0x61] = "||pcmpestriXrmu",
255
+ [0x62] = "||pcmpistrmXrmu",[0x63] = "||pcmpistriXrmu",
256
+ },
257
+ }
258
+
259
+ -- Map for VMX/SVM opcodes 0F 01 C0-FF (sgdt group with register operands).
260
+ local map_opcvm = {
261
+ [0xc1]="vmcall",[0xc2]="vmlaunch",[0xc3]="vmresume",[0xc4]="vmxoff",
262
+ [0xc8]="monitor",[0xc9]="mwait",
263
+ [0xd8]="vmrun",[0xd9]="vmmcall",[0xda]="vmload",[0xdb]="vmsave",
264
+ [0xdc]="stgi",[0xdd]="clgi",[0xde]="skinit",[0xdf]="invlpga",
265
+ [0xf8]="swapgs",[0xf9]="rdtscp",
266
+ }
267
+
268
+ -- Map for FP opcodes. And you thought stack machines are simple?
269
+ local map_opcfp = {
270
+ -- D8-DF 00-BF: opcodes with a memory operand.
271
+ -- D8
272
+ [0]="faddFm","fmulFm","fcomFm","fcompFm","fsubFm","fsubrFm","fdivFm","fdivrFm",
273
+ "fldFm",nil,"fstFm","fstpFm","fldenvVm","fldcwWm","fnstenvVm","fnstcwWm",
274
+ -- DA
275
+ "fiaddDm","fimulDm","ficomDm","ficompDm",
276
+ "fisubDm","fisubrDm","fidivDm","fidivrDm",
277
+ -- DB
278
+ "fildDm","fisttpDm","fistDm","fistpDm",nil,"fld twordFmp",nil,"fstp twordFmp",
279
+ -- DC
280
+ "faddGm","fmulGm","fcomGm","fcompGm","fsubGm","fsubrGm","fdivGm","fdivrGm",
281
+ -- DD
282
+ "fldGm","fisttpQm","fstGm","fstpGm","frstorDmp",nil,"fnsaveDmp","fnstswWm",
283
+ -- DE
284
+ "fiaddWm","fimulWm","ficomWm","ficompWm",
285
+ "fisubWm","fisubrWm","fidivWm","fidivrWm",
286
+ -- DF
287
+ "fildWm","fisttpWm","fistWm","fistpWm",
288
+ "fbld twordFmp","fildQm","fbstp twordFmp","fistpQm",
289
+ -- xx C0-FF: opcodes with a pseudo-register operand.
290
+ -- D8
291
+ "faddFf","fmulFf","fcomFf","fcompFf","fsubFf","fsubrFf","fdivFf","fdivrFf",
292
+ -- D9
293
+ "fldFf","fxchFf",{"fnop"},nil,
294
+ {"fchs","fabs",nil,nil,"ftst","fxam"},
295
+ {"fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz"},
296
+ {"f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp"},
297
+ {"fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos"},
298
+ -- DA
299
+ "fcmovbFf","fcmoveFf","fcmovbeFf","fcmovuFf",nil,{nil,"fucompp"},nil,nil,
300
+ -- DB
301
+ "fcmovnbFf","fcmovneFf","fcmovnbeFf","fcmovnuFf",
302
+ {nil,nil,"fnclex","fninit"},"fucomiFf","fcomiFf",nil,
303
+ -- DC
304
+ "fadd toFf","fmul toFf",nil,nil,
305
+ "fsub toFf","fsubr toFf","fdivr toFf","fdiv toFf",
306
+ -- DD
307
+ "ffreeFf",nil,"fstFf","fstpFf","fucomFf","fucompFf",nil,nil,
308
+ -- DE
309
+ "faddpFf","fmulpFf",nil,{nil,"fcompp"},
310
+ "fsubrpFf","fsubpFf","fdivrpFf","fdivpFf",
311
+ -- DF
312
+ nil,nil,nil,nil,{"fnstsw ax"},"fucomipFf","fcomipFf",nil,
313
+ }
314
+ assert(map_opcfp[126] == "fcomipFf")
315
+
316
+ -- Map for opcode groups. The subkey is sp from the ModRM byte.
317
+ local map_opcgroup = {
318
+ arith = { "add", "or", "adc", "sbb", "and", "sub", "xor", "cmp" },
319
+ shift = { "rol", "ror", "rcl", "rcr", "shl", "shr", "sal", "sar" },
320
+ testb = { "testBmi", "testBmi", "not", "neg", "mul", "imul", "div", "idiv" },
321
+ testv = { "testVmi", "testVmi", "not", "neg", "mul", "imul", "div", "idiv" },
322
+ incb = { "inc", "dec" },
323
+ incd = { "inc", "dec", "callUmp", "$call farDmp",
324
+ "jmpUmp", "$jmp farDmp", "pushUm" },
325
+ sldt = { "sldt", "str", "lldt", "ltr", "verr", "verw" },
326
+ sgdt = { "vm*$sgdt", "vm*$sidt", "$lgdt", "vm*$lidt",
327
+ "smsw", nil, "lmsw", "vm*$invlpg" },
328
+ bt = { nil, nil, nil, nil, "bt", "bts", "btr", "btc" },
329
+ cmpxchg = { nil, "sz*,cmpxchg8bQmp,cmpxchg16bXmp", nil, nil,
330
+ nil, nil, "vmptrld|vmxon|vmclear", "vmptrst" },
331
+ pshiftw = { nil, nil, "psrlw", nil, "psraw", nil, "psllw" },
332
+ pshiftd = { nil, nil, "psrld", nil, "psrad", nil, "pslld" },
333
+ pshiftq = { nil, nil, "psrlq", nil, nil, nil, "psllq" },
334
+ pshiftdq = { nil, nil, "psrlq", "psrldq", nil, nil, "psllq", "pslldq" },
335
+ fxsave = { "$fxsave", "$fxrstor", "$ldmxcsr", "$stmxcsr",
336
+ nil, "lfenceDp$", "mfenceDp$", "sfenceDp$clflush" },
337
+ prefetch = { "prefetch", "prefetchw" },
338
+ prefetcht = { "prefetchnta", "prefetcht0", "prefetcht1", "prefetcht2" },
339
+ }
340
+
341
+ ------------------------------------------------------------------------------
342
+
343
+ -- Maps for register names.
344
+ local map_regs = {
345
+ B = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
346
+ "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" },
347
+ B64 = { "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
348
+ "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b" },
349
+ W = { "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
350
+ "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w" },
351
+ D = { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
352
+ "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d" },
353
+ Q = { "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
354
+ "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15" },
355
+ M = { "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
356
+ "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7" }, -- No x64 ext!
357
+ X = { "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
358
+ "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15" },
359
+ }
360
+ local map_segregs = { "es", "cs", "ss", "ds", "fs", "gs", "segr6", "segr7" }
361
+
362
+ -- Maps for size names.
363
+ local map_sz2n = {
364
+ B = 1, W = 2, D = 4, Q = 8, M = 8, X = 16,
365
+ }
366
+ local map_sz2prefix = {
367
+ B = "byte", W = "word", D = "dword",
368
+ Q = "qword",
369
+ M = "qword", X = "xword",
370
+ F = "dword", G = "qword", -- No need for sizes/register names for these two.
371
+ }
372
+
373
+ ------------------------------------------------------------------------------
374
+
375
+ -- Output a nicely formatted line with an opcode and operands.
376
+ local function putop(ctx, text, operands)
377
+ local code, pos, hex = ctx.code, ctx.pos, ""
378
+ local hmax = ctx.hexdump
379
+ if hmax > 0 then
380
+ for i=ctx.start,pos-1 do
381
+ hex = hex..format("%02X", byte(code, i, i))
382
+ end
383
+ if #hex > hmax then hex = sub(hex, 1, hmax)..". "
384
+ else hex = hex..rep(" ", hmax-#hex+2) end
385
+ end
386
+ if operands then text = text.." "..operands end
387
+ if ctx.o16 then text = "o16 "..text; ctx.o16 = false end
388
+ if ctx.a32 then text = "a32 "..text; ctx.a32 = false end
389
+ if ctx.rep then text = ctx.rep.." "..text; ctx.rep = false end
390
+ if ctx.rex then
391
+ local t = (ctx.rexw and "w" or "")..(ctx.rexr and "r" or "")..
392
+ (ctx.rexx and "x" or "")..(ctx.rexb and "b" or "")
393
+ if t ~= "" then text = "rex."..t.." "..text end
394
+ ctx.rexw = false; ctx.rexr = false; ctx.rexx = false; ctx.rexb = false
395
+ ctx.rex = false
396
+ end
397
+ if ctx.seg then
398
+ local text2, n = gsub(text, "%[", "["..ctx.seg..":")
399
+ if n == 0 then text = ctx.seg.." "..text else text = text2 end
400
+ ctx.seg = false
401
+ end
402
+ if ctx.lock then text = "lock "..text; ctx.lock = false end
403
+ local imm = ctx.imm
404
+ if imm then
405
+ local sym = ctx.symtab[imm]
406
+ if sym then text = text.."\t->"..sym end
407
+ end
408
+ ctx.out(format("%08x %s%s\n", ctx.addr+ctx.start, hex, text))
409
+ ctx.mrm = false
410
+ ctx.start = pos
411
+ ctx.imm = nil
412
+ end
413
+
414
+ -- Clear all prefix flags.
415
+ local function clearprefixes(ctx)
416
+ ctx.o16 = false; ctx.seg = false; ctx.lock = false; ctx.rep = false
417
+ ctx.rexw = false; ctx.rexr = false; ctx.rexx = false; ctx.rexb = false
418
+ ctx.rex = false; ctx.a32 = false
419
+ end
420
+
421
+ -- Fallback for incomplete opcodes at the end.
422
+ local function incomplete(ctx)
423
+ ctx.pos = ctx.stop+1
424
+ clearprefixes(ctx)
425
+ return putop(ctx, "(incomplete)")
426
+ end
427
+
428
+ -- Fallback for unknown opcodes.
429
+ local function unknown(ctx)
430
+ clearprefixes(ctx)
431
+ return putop(ctx, "(unknown)")
432
+ end
433
+
434
+ -- Return an immediate of the specified size.
435
+ local function getimm(ctx, pos, n)
436
+ if pos+n-1 > ctx.stop then return incomplete(ctx) end
437
+ local code = ctx.code
438
+ if n == 1 then
439
+ local b1 = byte(code, pos, pos)
440
+ return b1
441
+ elseif n == 2 then
442
+ local b1, b2 = byte(code, pos, pos+1)
443
+ return b1+b2*256
444
+ else
445
+ local b1, b2, b3, b4 = byte(code, pos, pos+3)
446
+ local imm = b1+b2*256+b3*65536+b4*16777216
447
+ ctx.imm = imm
448
+ return imm
449
+ end
450
+ end
451
+
452
+ -- Process pattern string and generate the operands.
453
+ local function putpat(ctx, name, pat)
454
+ local operands, regs, sz, mode, sp, rm, sc, rx, sdisp
455
+ local code, pos, stop = ctx.code, ctx.pos, ctx.stop
456
+
457
+ -- Chars used: 1DFGIMPQRSTUVWXacdfgijmoprstuwxyz
458
+ for p in gmatch(pat, ".") do
459
+ local x = nil
460
+ if p == "V" or p == "U" then
461
+ if ctx.rexw then sz = "Q"; ctx.rexw = false
462
+ elseif ctx.o16 then sz = "W"; ctx.o16 = false
463
+ elseif p == "U" and ctx.x64 then sz = "Q"
464
+ else sz = "D" end
465
+ regs = map_regs[sz]
466
+ elseif p == "T" then
467
+ if ctx.rexw then sz = "Q"; ctx.rexw = false else sz = "D" end
468
+ regs = map_regs[sz]
469
+ elseif p == "B" then
470
+ sz = "B"
471
+ regs = ctx.rex and map_regs.B64 or map_regs.B
472
+ elseif match(p, "[WDQMXFG]") then
473
+ sz = p
474
+ regs = map_regs[sz]
475
+ elseif p == "P" then
476
+ sz = ctx.o16 and "X" or "M"; ctx.o16 = false
477
+ regs = map_regs[sz]
478
+ elseif p == "S" then
479
+ name = name..lower(sz)
480
+ elseif p == "s" then
481
+ local imm = getimm(ctx, pos, 1); if not imm then return end
482
+ x = imm <= 127 and format("+0x%02x", imm)
483
+ or format("-0x%02x", 256-imm)
484
+ pos = pos+1
485
+ elseif p == "u" then
486
+ local imm = getimm(ctx, pos, 1); if not imm then return end
487
+ x = format("0x%02x", imm)
488
+ pos = pos+1
489
+ elseif p == "w" then
490
+ local imm = getimm(ctx, pos, 2); if not imm then return end
491
+ x = format("0x%x", imm)
492
+ pos = pos+2
493
+ elseif p == "o" then -- [offset]
494
+ if ctx.x64 then
495
+ local imm1 = getimm(ctx, pos, 4); if not imm1 then return end
496
+ local imm2 = getimm(ctx, pos+4, 4); if not imm2 then return end
497
+ x = format("[0x%08x%08x]", imm2, imm1)
498
+ pos = pos+8
499
+ else
500
+ local imm = getimm(ctx, pos, 4); if not imm then return end
501
+ x = format("[0x%08x]", imm)
502
+ pos = pos+4
503
+ end
504
+ elseif p == "i" or p == "I" then
505
+ local n = map_sz2n[sz]
506
+ if n == 8 and ctx.x64 and p == "I" then
507
+ local imm1 = getimm(ctx, pos, 4); if not imm1 then return end
508
+ local imm2 = getimm(ctx, pos+4, 4); if not imm2 then return end
509
+ x = format("0x%08x%08x", imm2, imm1)
510
+ else
511
+ if n == 8 then n = 4 end
512
+ local imm = getimm(ctx, pos, n); if not imm then return end
513
+ if sz == "Q" and (imm < 0 or imm > 0x7fffffff) then
514
+ imm = (0xffffffff+1)-imm
515
+ x = format(imm > 65535 and "-0x%08x" or "-0x%x", imm)
516
+ else
517
+ x = format(imm > 65535 and "0x%08x" or "0x%x", imm)
518
+ end
519
+ end
520
+ pos = pos+n
521
+ elseif p == "j" then
522
+ local n = map_sz2n[sz]
523
+ if n == 8 then n = 4 end
524
+ local imm = getimm(ctx, pos, n); if not imm then return end
525
+ if sz == "B" and imm > 127 then imm = imm-256
526
+ elseif imm > 2147483647 then imm = imm-4294967296 end
527
+ pos = pos+n
528
+ imm = imm + pos + ctx.addr
529
+ if imm > 4294967295 and not ctx.x64 then imm = imm-4294967296 end
530
+ ctx.imm = imm
531
+ if sz == "W" then
532
+ x = format("word 0x%04x", imm%65536)
533
+ elseif ctx.x64 then
534
+ local lo = imm % 0x1000000
535
+ x = format("0x%02x%06x", (imm-lo) / 0x1000000, lo)
536
+ else
537
+ x = "0x"..tohex(imm)
538
+ end
539
+ elseif p == "R" then
540
+ local r = byte(code, pos-1, pos-1)%8
541
+ if ctx.rexb then r = r + 8; ctx.rexb = false end
542
+ x = regs[r+1]
543
+ elseif p == "a" then x = regs[1]
544
+ elseif p == "c" then x = "cl"
545
+ elseif p == "d" then x = "dx"
546
+ elseif p == "1" then x = "1"
547
+ else
548
+ if not mode then
549
+ mode = ctx.mrm
550
+ if not mode then
551
+ if pos > stop then return incomplete(ctx) end
552
+ mode = byte(code, pos, pos)
553
+ pos = pos+1
554
+ end
555
+ rm = mode%8; mode = (mode-rm)/8
556
+ sp = mode%8; mode = (mode-sp)/8
557
+ sdisp = ""
558
+ if mode < 3 then
559
+ if rm == 4 then
560
+ if pos > stop then return incomplete(ctx) end
561
+ sc = byte(code, pos, pos)
562
+ pos = pos+1
563
+ rm = sc%8; sc = (sc-rm)/8
564
+ rx = sc%8; sc = (sc-rx)/8
565
+ if ctx.rexx then rx = rx + 8; ctx.rexx = false end
566
+ if rx == 4 then rx = nil end
567
+ end
568
+ if mode > 0 or rm == 5 then
569
+ local dsz = mode
570
+ if dsz ~= 1 then dsz = 4 end
571
+ local disp = getimm(ctx, pos, dsz); if not disp then return end
572
+ if mode == 0 then rm = nil end
573
+ if rm or rx or (not sc and ctx.x64 and not ctx.a32) then
574
+ if dsz == 1 and disp > 127 then
575
+ sdisp = format("-0x%x", 256-disp)
576
+ elseif disp >= 0 and disp <= 0x7fffffff then
577
+ sdisp = format("+0x%x", disp)
578
+ else
579
+ sdisp = format("-0x%x", (0xffffffff+1)-disp)
580
+ end
581
+ else
582
+ sdisp = format(ctx.x64 and not ctx.a32 and
583
+ not (disp >= 0 and disp <= 0x7fffffff)
584
+ and "0xffffffff%08x" or "0x%08x", disp)
585
+ end
586
+ pos = pos+dsz
587
+ end
588
+ end
589
+ if rm and ctx.rexb then rm = rm + 8; ctx.rexb = false end
590
+ if ctx.rexr then sp = sp + 8; ctx.rexr = false end
591
+ end
592
+ if p == "m" then
593
+ if mode == 3 then x = regs[rm+1]
594
+ else
595
+ local aregs = ctx.a32 and map_regs.D or ctx.aregs
596
+ local srm, srx = "", ""
597
+ if rm then srm = aregs[rm+1]
598
+ elseif not sc and ctx.x64 and not ctx.a32 then srm = "rip" end
599
+ ctx.a32 = false
600
+ if rx then
601
+ if rm then srm = srm.."+" end
602
+ srx = aregs[rx+1]
603
+ if sc > 0 then srx = srx.."*"..(2^sc) end
604
+ end
605
+ x = format("[%s%s%s]", srm, srx, sdisp)
606
+ end
607
+ if mode < 3 and
608
+ (not match(pat, "[aRrgp]") or match(pat, "t")) then -- Yuck.
609
+ x = map_sz2prefix[sz].." "..x
610
+ end
611
+ elseif p == "r" then x = regs[sp+1]
612
+ elseif p == "g" then x = map_segregs[sp+1]
613
+ elseif p == "p" then -- Suppress prefix.
614
+ elseif p == "f" then x = "st"..rm
615
+ elseif p == "x" then
616
+ if sp == 0 and ctx.lock and not ctx.x64 then
617
+ x = "CR8"; ctx.lock = false
618
+ else
619
+ x = "CR"..sp
620
+ end
621
+ elseif p == "y" then x = "DR"..sp
622
+ elseif p == "z" then x = "TR"..sp
623
+ elseif p == "t" then
624
+ else
625
+ error("bad pattern `"..pat.."'")
626
+ end
627
+ end
628
+ if x then operands = operands and operands..", "..x or x end
629
+ end
630
+ ctx.pos = pos
631
+ return putop(ctx, name, operands)
632
+ end
633
+
634
+ -- Forward declaration.
635
+ local map_act
636
+
637
+ -- Fetch and cache MRM byte.
638
+ local function getmrm(ctx)
639
+ local mrm = ctx.mrm
640
+ if not mrm then
641
+ local pos = ctx.pos
642
+ if pos > ctx.stop then return nil end
643
+ mrm = byte(ctx.code, pos, pos)
644
+ ctx.pos = pos+1
645
+ ctx.mrm = mrm
646
+ end
647
+ return mrm
648
+ end
649
+
650
+ -- Dispatch to handler depending on pattern.
651
+ local function dispatch(ctx, opat, patgrp)
652
+ if not opat then return unknown(ctx) end
653
+ if match(opat, "%|") then -- MMX/SSE variants depending on prefix.
654
+ local p
655
+ if ctx.rep then
656
+ p = ctx.rep=="rep" and "%|([^%|]*)" or "%|[^%|]*%|[^%|]*%|([^%|]*)"
657
+ ctx.rep = false
658
+ elseif ctx.o16 then p = "%|[^%|]*%|([^%|]*)"; ctx.o16 = false
659
+ else p = "^[^%|]*" end
660
+ opat = match(opat, p)
661
+ if not opat then return unknown(ctx) end
662
+ -- ctx.rep = false; ctx.o16 = false
663
+ --XXX fails for 66 f2 0f 38 f1 06 crc32 eax,WORD PTR [esi]
664
+ --XXX remove in branches?
665
+ end
666
+ if match(opat, "%$") then -- reg$mem variants.
667
+ local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end
668
+ opat = match(opat, mrm >= 192 and "^[^%$]*" or "%$(.*)")
669
+ if opat == "" then return unknown(ctx) end
670
+ end
671
+ if opat == "" then return unknown(ctx) end
672
+ local name, pat = match(opat, "^([a-z0-9 ]*)(.*)")
673
+ if pat == "" and patgrp then pat = patgrp end
674
+ return map_act[sub(pat, 1, 1)](ctx, name, pat)
675
+ end
676
+
677
+ -- Get a pattern from an opcode map and dispatch to handler.
678
+ local function dispatchmap(ctx, opcmap)
679
+ local pos = ctx.pos
680
+ local opat = opcmap[byte(ctx.code, pos, pos)]
681
+ pos = pos + 1
682
+ ctx.pos = pos
683
+ return dispatch(ctx, opat)
684
+ end
685
+
686
+ -- Map for action codes. The key is the first char after the name.
687
+ map_act = {
688
+ -- Simple opcodes without operands.
689
+ [""] = function(ctx, name, pat)
690
+ return putop(ctx, name)
691
+ end,
692
+
693
+ -- Operand size chars fall right through.
694
+ B = putpat, W = putpat, D = putpat, Q = putpat,
695
+ V = putpat, U = putpat, T = putpat,
696
+ M = putpat, X = putpat, P = putpat,
697
+ F = putpat, G = putpat,
698
+
699
+ -- Collect prefixes.
700
+ [":"] = function(ctx, name, pat)
701
+ ctx[pat == ":" and name or sub(pat, 2)] = name
702
+ if ctx.pos - ctx.start > 5 then return unknown(ctx) end -- Limit #prefixes.
703
+ end,
704
+
705
+ -- Chain to special handler specified by name.
706
+ ["*"] = function(ctx, name, pat)
707
+ return map_act[name](ctx, name, sub(pat, 2))
708
+ end,
709
+
710
+ -- Use named subtable for opcode group.
711
+ ["!"] = function(ctx, name, pat)
712
+ local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end
713
+ return dispatch(ctx, map_opcgroup[name][((mrm-(mrm%8))/8)%8+1], sub(pat, 2))
714
+ end,
715
+
716
+ -- o16,o32[,o64] variants.
717
+ sz = function(ctx, name, pat)
718
+ if ctx.o16 then ctx.o16 = false
719
+ else
720
+ pat = match(pat, ",(.*)")
721
+ if ctx.rexw then
722
+ local p = match(pat, ",(.*)")
723
+ if p then pat = p; ctx.rexw = false end
724
+ end
725
+ end
726
+ pat = match(pat, "^[^,]*")
727
+ return dispatch(ctx, pat)
728
+ end,
729
+
730
+ -- Two-byte opcode dispatch.
731
+ opc2 = function(ctx, name, pat)
732
+ return dispatchmap(ctx, map_opc2)
733
+ end,
734
+
735
+ -- Three-byte opcode dispatch.
736
+ opc3 = function(ctx, name, pat)
737
+ return dispatchmap(ctx, map_opc3[pat])
738
+ end,
739
+
740
+ -- VMX/SVM dispatch.
741
+ vm = function(ctx, name, pat)
742
+ return dispatch(ctx, map_opcvm[ctx.mrm])
743
+ end,
744
+
745
+ -- Floating point opcode dispatch.
746
+ fp = function(ctx, name, pat)
747
+ local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end
748
+ local rm = mrm%8
749
+ local idx = pat*8 + ((mrm-rm)/8)%8
750
+ if mrm >= 192 then idx = idx + 64 end
751
+ local opat = map_opcfp[idx]
752
+ if type(opat) == "table" then opat = opat[rm+1] end
753
+ return dispatch(ctx, opat)
754
+ end,
755
+
756
+ -- REX prefix.
757
+ rex = function(ctx, name, pat)
758
+ if ctx.rex then return unknown(ctx) end -- Only 1 REX prefix allowed.
759
+ for p in gmatch(pat, ".") do ctx["rex"..p] = true end
760
+ ctx.rex = true
761
+ end,
762
+
763
+ -- Special case for nop with REX prefix.
764
+ nop = function(ctx, name, pat)
765
+ return dispatch(ctx, ctx.rex and pat or "nop")
766
+ end,
767
+ }
768
+
769
+ ------------------------------------------------------------------------------
770
+
771
+ -- Disassemble a block of code.
772
+ local function disass_block(ctx, ofs, len)
773
+ if not ofs then ofs = 0 end
774
+ local stop = len and ofs+len or #ctx.code
775
+ ofs = ofs + 1
776
+ ctx.start = ofs
777
+ ctx.pos = ofs
778
+ ctx.stop = stop
779
+ ctx.imm = nil
780
+ ctx.mrm = false
781
+ clearprefixes(ctx)
782
+ while ctx.pos <= stop do dispatchmap(ctx, ctx.map1) end
783
+ if ctx.pos ~= ctx.start then incomplete(ctx) end
784
+ end
785
+
786
+ -- Extended API: create a disassembler context. Then call ctx:disass(ofs, len).
787
+ local function create(code, addr, out)
788
+ local ctx = {}
789
+ ctx.code = code
790
+ ctx.addr = (addr or 0) - 1
791
+ ctx.out = out or io.write
792
+ ctx.symtab = {}
793
+ ctx.disass = disass_block
794
+ ctx.hexdump = 16
795
+ ctx.x64 = false
796
+ ctx.map1 = map_opc1_32
797
+ ctx.aregs = map_regs.D
798
+ return ctx
799
+ end
800
+
801
+ local function create64(code, addr, out)
802
+ local ctx = create(code, addr, out)
803
+ ctx.x64 = true
804
+ ctx.map1 = map_opc1_64
805
+ ctx.aregs = map_regs.Q
806
+ return ctx
807
+ end
808
+
809
+ -- Simple API: disassemble code (a string) at address and output via out.
810
+ local function disass(code, addr, out)
811
+ create(code, addr, out):disass()
812
+ end
813
+
814
+ local function disass64(code, addr, out)
815
+ create64(code, addr, out):disass()
816
+ end
817
+
818
+ -- Return register name for RID.
819
+ local function regname(r)
820
+ if r < 8 then return map_regs.D[r+1] end
821
+ return map_regs.X[r-7]
822
+ end
823
+
824
+ local function regname64(r)
825
+ if r < 16 then return map_regs.Q[r+1] end
826
+ return map_regs.X[r-15]
827
+ end
828
+
829
+ -- Public module functions.
830
+ return {
831
+ create = create,
832
+ create64 = create64,
833
+ disass = disass,
834
+ disass64 = disass64,
835
+ regname = regname,
836
+ regname64 = regname64
837
+ }
838
+