metasm 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (192) hide show
  1. data/BUGS +11 -0
  2. data/CREDITS +17 -0
  3. data/README +270 -0
  4. data/TODO +114 -0
  5. data/doc/code_organisation.txt +146 -0
  6. data/doc/const_missing.txt +16 -0
  7. data/doc/core_classes.txt +75 -0
  8. data/doc/feature_list.txt +53 -0
  9. data/doc/index.txt +59 -0
  10. data/doc/install_notes.txt +170 -0
  11. data/doc/style.css +3 -0
  12. data/doc/use_cases.txt +18 -0
  13. data/lib/metasm.rb +80 -0
  14. data/lib/metasm/arm.rb +12 -0
  15. data/lib/metasm/arm/debug.rb +39 -0
  16. data/lib/metasm/arm/decode.rb +167 -0
  17. data/lib/metasm/arm/encode.rb +77 -0
  18. data/lib/metasm/arm/main.rb +75 -0
  19. data/lib/metasm/arm/opcodes.rb +177 -0
  20. data/lib/metasm/arm/parse.rb +130 -0
  21. data/lib/metasm/arm/render.rb +55 -0
  22. data/lib/metasm/compile_c.rb +1457 -0
  23. data/lib/metasm/dalvik.rb +8 -0
  24. data/lib/metasm/dalvik/decode.rb +196 -0
  25. data/lib/metasm/dalvik/main.rb +60 -0
  26. data/lib/metasm/dalvik/opcodes.rb +366 -0
  27. data/lib/metasm/decode.rb +213 -0
  28. data/lib/metasm/decompile.rb +2659 -0
  29. data/lib/metasm/disassemble.rb +2068 -0
  30. data/lib/metasm/disassemble_api.rb +1280 -0
  31. data/lib/metasm/dynldr.rb +1329 -0
  32. data/lib/metasm/encode.rb +333 -0
  33. data/lib/metasm/exe_format/a_out.rb +194 -0
  34. data/lib/metasm/exe_format/autoexe.rb +82 -0
  35. data/lib/metasm/exe_format/bflt.rb +189 -0
  36. data/lib/metasm/exe_format/coff.rb +455 -0
  37. data/lib/metasm/exe_format/coff_decode.rb +901 -0
  38. data/lib/metasm/exe_format/coff_encode.rb +1078 -0
  39. data/lib/metasm/exe_format/dex.rb +457 -0
  40. data/lib/metasm/exe_format/dol.rb +145 -0
  41. data/lib/metasm/exe_format/elf.rb +923 -0
  42. data/lib/metasm/exe_format/elf_decode.rb +979 -0
  43. data/lib/metasm/exe_format/elf_encode.rb +1375 -0
  44. data/lib/metasm/exe_format/macho.rb +827 -0
  45. data/lib/metasm/exe_format/main.rb +228 -0
  46. data/lib/metasm/exe_format/mz.rb +164 -0
  47. data/lib/metasm/exe_format/nds.rb +172 -0
  48. data/lib/metasm/exe_format/pe.rb +437 -0
  49. data/lib/metasm/exe_format/serialstruct.rb +246 -0
  50. data/lib/metasm/exe_format/shellcode.rb +114 -0
  51. data/lib/metasm/exe_format/xcoff.rb +167 -0
  52. data/lib/metasm/gui.rb +23 -0
  53. data/lib/metasm/gui/cstruct.rb +373 -0
  54. data/lib/metasm/gui/dasm_coverage.rb +199 -0
  55. data/lib/metasm/gui/dasm_decomp.rb +369 -0
  56. data/lib/metasm/gui/dasm_funcgraph.rb +103 -0
  57. data/lib/metasm/gui/dasm_graph.rb +1354 -0
  58. data/lib/metasm/gui/dasm_hex.rb +543 -0
  59. data/lib/metasm/gui/dasm_listing.rb +599 -0
  60. data/lib/metasm/gui/dasm_main.rb +906 -0
  61. data/lib/metasm/gui/dasm_opcodes.rb +291 -0
  62. data/lib/metasm/gui/debug.rb +1228 -0
  63. data/lib/metasm/gui/gtk.rb +884 -0
  64. data/lib/metasm/gui/qt.rb +495 -0
  65. data/lib/metasm/gui/win32.rb +3004 -0
  66. data/lib/metasm/gui/x11.rb +621 -0
  67. data/lib/metasm/ia32.rb +14 -0
  68. data/lib/metasm/ia32/compile_c.rb +1523 -0
  69. data/lib/metasm/ia32/debug.rb +193 -0
  70. data/lib/metasm/ia32/decode.rb +1167 -0
  71. data/lib/metasm/ia32/decompile.rb +564 -0
  72. data/lib/metasm/ia32/encode.rb +314 -0
  73. data/lib/metasm/ia32/main.rb +233 -0
  74. data/lib/metasm/ia32/opcodes.rb +872 -0
  75. data/lib/metasm/ia32/parse.rb +327 -0
  76. data/lib/metasm/ia32/render.rb +91 -0
  77. data/lib/metasm/main.rb +1193 -0
  78. data/lib/metasm/mips.rb +11 -0
  79. data/lib/metasm/mips/compile_c.rb +7 -0
  80. data/lib/metasm/mips/decode.rb +253 -0
  81. data/lib/metasm/mips/encode.rb +51 -0
  82. data/lib/metasm/mips/main.rb +72 -0
  83. data/lib/metasm/mips/opcodes.rb +443 -0
  84. data/lib/metasm/mips/parse.rb +51 -0
  85. data/lib/metasm/mips/render.rb +43 -0
  86. data/lib/metasm/os/gnu_exports.rb +270 -0
  87. data/lib/metasm/os/linux.rb +1112 -0
  88. data/lib/metasm/os/main.rb +1686 -0
  89. data/lib/metasm/os/remote.rb +527 -0
  90. data/lib/metasm/os/windows.rb +2027 -0
  91. data/lib/metasm/os/windows_exports.rb +745 -0
  92. data/lib/metasm/parse.rb +876 -0
  93. data/lib/metasm/parse_c.rb +3938 -0
  94. data/lib/metasm/pic16c/decode.rb +42 -0
  95. data/lib/metasm/pic16c/main.rb +17 -0
  96. data/lib/metasm/pic16c/opcodes.rb +68 -0
  97. data/lib/metasm/ppc.rb +11 -0
  98. data/lib/metasm/ppc/decode.rb +264 -0
  99. data/lib/metasm/ppc/decompile.rb +251 -0
  100. data/lib/metasm/ppc/encode.rb +51 -0
  101. data/lib/metasm/ppc/main.rb +129 -0
  102. data/lib/metasm/ppc/opcodes.rb +410 -0
  103. data/lib/metasm/ppc/parse.rb +52 -0
  104. data/lib/metasm/preprocessor.rb +1277 -0
  105. data/lib/metasm/render.rb +130 -0
  106. data/lib/metasm/sh4.rb +8 -0
  107. data/lib/metasm/sh4/decode.rb +336 -0
  108. data/lib/metasm/sh4/main.rb +292 -0
  109. data/lib/metasm/sh4/opcodes.rb +381 -0
  110. data/lib/metasm/x86_64.rb +12 -0
  111. data/lib/metasm/x86_64/compile_c.rb +1025 -0
  112. data/lib/metasm/x86_64/debug.rb +59 -0
  113. data/lib/metasm/x86_64/decode.rb +268 -0
  114. data/lib/metasm/x86_64/encode.rb +264 -0
  115. data/lib/metasm/x86_64/main.rb +135 -0
  116. data/lib/metasm/x86_64/opcodes.rb +118 -0
  117. data/lib/metasm/x86_64/parse.rb +68 -0
  118. data/misc/bottleneck.rb +61 -0
  119. data/misc/cheader-findpppath.rb +58 -0
  120. data/misc/hexdiff.rb +74 -0
  121. data/misc/hexdump.rb +55 -0
  122. data/misc/metasm-all.rb +13 -0
  123. data/misc/objdiff.rb +47 -0
  124. data/misc/objscan.rb +40 -0
  125. data/misc/pdfparse.rb +661 -0
  126. data/misc/ppc_pdf2oplist.rb +192 -0
  127. data/misc/tcp_proxy_hex.rb +84 -0
  128. data/misc/txt2html.rb +440 -0
  129. data/samples/a.out.rb +31 -0
  130. data/samples/asmsyntax.rb +77 -0
  131. data/samples/bindiff.rb +555 -0
  132. data/samples/compilation-steps.rb +49 -0
  133. data/samples/cparser_makestackoffset.rb +55 -0
  134. data/samples/dasm-backtrack.rb +38 -0
  135. data/samples/dasmnavig.rb +318 -0
  136. data/samples/dbg-apihook.rb +228 -0
  137. data/samples/dbghelp.rb +143 -0
  138. data/samples/disassemble-gui.rb +102 -0
  139. data/samples/disassemble.rb +133 -0
  140. data/samples/dump_upx.rb +95 -0
  141. data/samples/dynamic_ruby.rb +1929 -0
  142. data/samples/elf_list_needed.rb +46 -0
  143. data/samples/elf_listexports.rb +33 -0
  144. data/samples/elfencode.rb +25 -0
  145. data/samples/exeencode.rb +128 -0
  146. data/samples/factorize-headers-elfimports.rb +77 -0
  147. data/samples/factorize-headers-peimports.rb +109 -0
  148. data/samples/factorize-headers.rb +43 -0
  149. data/samples/gdbclient.rb +583 -0
  150. data/samples/generate_libsigs.rb +102 -0
  151. data/samples/hotfix_gtk_dbg.rb +59 -0
  152. data/samples/install_win_env.rb +78 -0
  153. data/samples/lindebug.rb +924 -0
  154. data/samples/linux_injectsyscall.rb +95 -0
  155. data/samples/machoencode.rb +31 -0
  156. data/samples/metasm-shell.rb +91 -0
  157. data/samples/pe-hook.rb +69 -0
  158. data/samples/pe-ia32-cpuid.rb +203 -0
  159. data/samples/pe-mips.rb +35 -0
  160. data/samples/pe-shutdown.rb +78 -0
  161. data/samples/pe-testrelocs.rb +51 -0
  162. data/samples/pe-testrsrc.rb +24 -0
  163. data/samples/pe_listexports.rb +31 -0
  164. data/samples/peencode.rb +19 -0
  165. data/samples/peldr.rb +494 -0
  166. data/samples/preprocess-flatten.rb +19 -0
  167. data/samples/r0trace.rb +308 -0
  168. data/samples/rubstop.rb +399 -0
  169. data/samples/scan_pt_gnu_stack.rb +54 -0
  170. data/samples/scanpeexports.rb +62 -0
  171. data/samples/shellcode-c.rb +40 -0
  172. data/samples/shellcode-dynlink.rb +146 -0
  173. data/samples/source.asm +34 -0
  174. data/samples/struct_offset.rb +47 -0
  175. data/samples/testpe.rb +32 -0
  176. data/samples/testraw.rb +45 -0
  177. data/samples/win32genloader.rb +132 -0
  178. data/samples/win32hooker-advanced.rb +169 -0
  179. data/samples/win32hooker.rb +96 -0
  180. data/samples/win32livedasm.rb +33 -0
  181. data/samples/win32remotescan.rb +133 -0
  182. data/samples/wintrace.rb +92 -0
  183. data/tests/all.rb +8 -0
  184. data/tests/dasm.rb +39 -0
  185. data/tests/dynldr.rb +35 -0
  186. data/tests/encodeddata.rb +132 -0
  187. data/tests/ia32.rb +82 -0
  188. data/tests/mips.rb +116 -0
  189. data/tests/parse_c.rb +239 -0
  190. data/tests/preprocessor.rb +269 -0
  191. data/tests/x86_64.rb +62 -0
  192. metadata +255 -0
@@ -0,0 +1,16 @@
1
+ The const_missing trick
2
+ =======================
3
+
4
+ Metasm uses a ruby trick to load most of the framework on demand, so that
5
+ *e.g.* the `MIPS`-related classes are never loaded in the ruby interpreter
6
+ unless you use them.
7
+
8
+ It is setup by the top-level `metasm.rb` file, by using the ruby mechanism of
9
+ `Module.autoload`. This mechanism will automatically load the specified metasm
10
+ components whenever a reference is made to one of the constants listed here.
11
+
12
+ Metasm provides a replacement top-level file, `misc/metasm-all.rb`,
13
+ which will unconditionally load all metasm files.
14
+ This will not however load mutually exclusive files, like the Gui subsystems ;
15
+ in this case it will load only the autodetected gui module (win32 or gtk).
16
+
@@ -0,0 +1,75 @@
1
+ Core classes
2
+ ============
3
+
4
+ Core
5
+ ----
6
+
7
+ * <core/Expression.txt>
8
+ * <core/EncodedData.txt>
9
+ * <core/VirtualString.txt>
10
+ * <core/Opcode.txt>
11
+ * <core/Instruction.txt>
12
+
13
+ CPUs
14
+ ----
15
+
16
+ * <core/CPU.txt>
17
+ * <core/Ia32.txt>
18
+ * <core/X86_64.txt>
19
+ * <core/MIPS.txt>
20
+ * <core/PowerPC.txt>
21
+ * <core/Sh4.txt>
22
+
23
+ ExeFormats
24
+ ----------
25
+
26
+ * <core/ExeFormat.txt>
27
+ * <core/SerialStruct.txt>
28
+ * <core/AutoExe.txt>
29
+
30
+ * <core/Shellcode.txt>
31
+ * <core/PE.txt>
32
+ * <core/COFF.txt>
33
+ * <core/ELF.txt>
34
+
35
+ C
36
+ ----
37
+
38
+ * <core/Preprocessor.txt>
39
+ * <core/CParser.txt>
40
+ * <core/CCompiler.txt>
41
+
42
+ Debugger
43
+ --------
44
+
45
+ * <core/OS.txt>
46
+ * <core/Debugger.txt>
47
+ * <core/LinDebugger.txt>
48
+ * <core/WinDebugger.txt>
49
+ * <core/PTrace.txt>
50
+ * <core/GdbClient.txt>
51
+ * <core/WinDbgAPI.txt>
52
+
53
+ Disassembler
54
+ ------------
55
+
56
+ * <core/Disassembler.txt>
57
+ * <core/DecodedFunction.txt>
58
+ * <core/DecodedInstruction.txt>
59
+ * <core/InstructionBlock.txt>
60
+ * <core/Decompiler.txt>
61
+
62
+ GUI
63
+ ----
64
+
65
+ * <core/Gui.txt>
66
+ * <core/Gui_Drawable.txt>
67
+ * <core/Gui_Window.txt>
68
+
69
+ * <core/Gui_DasmWidget.txt>
70
+ * <core/Gui_DebugWidget.txt>
71
+
72
+ Others
73
+ ------
74
+
75
+ * <core/DynLdr.txt>
@@ -0,0 +1,53 @@
1
+ Metasm feature list
2
+ ===================
3
+
4
+ Metasm is a cross-architecture assembler, disassembler, compiler, linker and debugger.
5
+
6
+ See <use_cases.txt>
7
+
8
+ Architectures
9
+ -------------
10
+
11
+ It is written in such a way that it is easy to add support for new architectures.
12
+ For now, the following architectures are in:
13
+
14
+ * Intel <core/Ia32.txt> (16 and 32bits)
15
+ * Intel <core/X86_64.txt> (*aka* Ia32 64bits, X64, AMD64)
16
+ * MIPS
17
+ * PowerPC
18
+ * Sh4
19
+
20
+ The developpement is generally more focused on Ia32 and X86_64.
21
+
22
+
23
+ File formats
24
+ ------------
25
+
26
+ The following executable file formats are supported:
27
+
28
+ * <core/Shellcode.txt> (raw binary)
29
+ * <core/PE.txt>/<core/COFF.txt> (32/64bits)
30
+ * <core/ELF.txt> (32/64bits)
31
+
32
+ Those are supported in a more limited way:
33
+
34
+ * Mach-O, UniversalBinary
35
+ * MZ
36
+ * A.out
37
+ * XCoff
38
+ * NDS
39
+
40
+
41
+ Features
42
+ --------
43
+
44
+ The framework includes
45
+
46
+ * a graphical <usage/disassembler.txt>
47
+ * a graphical <usage/debugger.txt>
48
+ * low and high-level debugging support (Ia32 only for now) under Windows, Linux and remote (via a GdbServer)
49
+ * an advanced disassembler engine, with limited emulation support
50
+ * a full <usage/C_parser.txt> (with preprocessor)
51
+ * an experimental <usage/C_compiler.txt> (Ia32 only)
52
+ * an experimental <usage/decompiler.txt> (Ia32 only)
53
+
@@ -0,0 +1,59 @@
1
+ The Metasm framework documentation
2
+ ==================================
3
+
4
+ Metasm
5
+ ------
6
+
7
+ The Metasm framework is an opensource software designed to interact with
8
+ the various forms of binary code. It is written in pure Ruby
9
+ (<http://ruby-lang.org/>).
10
+
11
+ More detailed informations can be found in the <feature_list.txt>.
12
+
13
+ It is distributed freely under the terms of the LGPL.
14
+
15
+ Documentation organisation
16
+ --------------------------
17
+
18
+ This documentation is split in different parts :
19
+
20
+ * the <core_classes.txt>
21
+ * the major <use_cases.txt>
22
+ * <code_organisation.txt>
23
+
24
+ The first part describes the internal structure of the framework, the
25
+ second part is a higher level overview of the software and shows how
26
+ the various parts are used and can interract. The last part explains
27
+ the role of the source files and directories.
28
+
29
+
30
+ Documentation progress
31
+ ----------------------
32
+
33
+ The documentation is written here and there in my free time, and is **very**
34
+ **incomplete** as of now. Specifically, all internal links you'll find
35
+ ending in `.txt` are link to pages that have not been written yet.
36
+
37
+
38
+ Install notes
39
+ -------------
40
+
41
+ See the <install_notes.txt>
42
+
43
+ Authors
44
+ -------
45
+
46
+ Metasm is mostly written by Yoann Guillot.
47
+
48
+ Some parts were added by various contributors, including :
49
+ * Julien Tinnès
50
+ * Raphaël Rigo
51
+ * Arnaud Cornet
52
+ * Alexandre Gazet
53
+
54
+ Contact
55
+ -------
56
+
57
+ The latest version of this documentation can be found on the Metasm site: <http://metasm.cr0.org/doc>
58
+
59
+ Patches, bug reports, feature requests should be sent to metasm@cr0.org
@@ -0,0 +1,170 @@
1
+ Metasm installation notes
2
+ =========================
3
+
4
+ Metasm is a pure ruby lib, and the core (`metasm/` subdir) does not depend on any
5
+ ruby library (except the `metasm/gui`, which may use `gtk2`).
6
+
7
+ So the install is quite simple.
8
+
9
+
10
+ Download
11
+ --------
12
+
13
+ Metasm is distributed using the `mercurial` source control system.
14
+
15
+ The recommanded way to install is to use that tool, so you can always be
16
+ up-to-date with the latest developpements.
17
+
18
+ You will also need the Ruby interpreter (version 1.8 and 1.9 are supported).
19
+
20
+ Linux
21
+ #####
22
+
23
+ Issue the following commands to install the `mercurial` and `ruby` software
24
+
25
+ sudo apt-get install ruby
26
+ sudo apt-get install mercurial
27
+
28
+ Then download metasm with
29
+
30
+ hg clone http://metasm.cr0.org/hg/metasm/
31
+
32
+ This will create a new directory `metasm/` with the latest version of the
33
+ framework.
34
+
35
+
36
+ Windows
37
+ #######
38
+
39
+ The ruby website offers many ruby packages. The *RubyInstaller* should
40
+ work fine. Go to <http://www.ruby-lang.org/en/downloads/>, under the
41
+ `Ruby on Windows` section.
42
+
43
+ The `mercurial` website has links to various installers:
44
+ <http://mercurial.selenic.com/wiki/BinaryPackages>
45
+ Choose one, then use the `clone repository` command with the following
46
+ url:
47
+
48
+ http://metasm.cr0.org/hg/metasm/
49
+
50
+ This will create a new subdirectory `metasm/` with the latest version of
51
+ the framework.
52
+
53
+
54
+ Upgrading
55
+ ---------
56
+
57
+ To upgrade to the latest and greatest version, launch a shell prompt and
58
+ navigate to the metasm directory, then issue:
59
+
60
+ hg pull -u
61
+
62
+ which will upgrade your installation to the latest available version.
63
+
64
+ With `TortoiseHG`, simply issue the `upgrade` command on the `metasm`
65
+ directory.
66
+
67
+
68
+ Local installation
69
+ ------------------
70
+
71
+ If you simply want to install metasm for your personnal usage (VS a
72
+ system-wide installation), follow these steps.
73
+
74
+ Download the metasm source files under any directory, then update the
75
+ environment variable `RUBYLIB` to include this path. The path you add
76
+ should be the directory containing the `metasm.rb` script and the `metasm/`,
77
+ `samples/`, `doc/` subdirectories.
78
+
79
+ If `RUBYLIB` is empty or non-existant, simply set its value to the directory,
80
+ otherwise you can append the path to an existing list by separating the values
81
+ with a `:` such as:
82
+
83
+ RUBYLIB='/foo/bar:/home/jj/metasm'
84
+
85
+ Linux
86
+ #####
87
+
88
+ Under linux or cygwin, this is done by modifying your shell profile, e.g.
89
+ `~/.bash_profile`, by adding a line such as:
90
+
91
+ export RUBYLIB='/home/jj/metasm'
92
+
93
+ You may need to restart your session or start a new shell for the changes
94
+ to take effect.
95
+
96
+ Windows
97
+ #######
98
+
99
+ The environment variables can be set through :
100
+
101
+ * rightclick on `my computer`
102
+ * select tab `advanced`
103
+ * click `environment variables`
104
+
105
+ If a line RUBYLIB exists, add `;C:\path\to\metasm` at the end, otherwise
106
+ create a new variable `RUBYLIB` with the path as value.
107
+
108
+ You may need to restart your session for the changes to take effect.
109
+
110
+
111
+ Systemwide installation
112
+ -----------------------
113
+
114
+ For a systemwide installation, you should create a `metasm.rb` file in the `site_ruby`
115
+ directory (that would be `/usr/lib/ruby/1.8/` under linux, or `C:\apps\ruby\lib\ruby\1.8\`
116
+ for windows users) with the content
117
+
118
+ # if metasm.rb can be found in /home/jj/metasm/metasm.rb
119
+ require '/home/jj/metasm/metasm'
120
+
121
+
122
+ Testing
123
+ -------
124
+
125
+ Open a new shell session and type
126
+
127
+ ruby -r metasm -e "p Metasm::VERSION"
128
+
129
+ It should print a single line with a (meaningless) number in it.
130
+
131
+
132
+ Gui
133
+ ----
134
+
135
+ If you intend to use the graphical user-interface (debugger/disassembler),
136
+ if you are under Windows with a 32bit x86 ruby, this should work out of the
137
+ box. In any other case, you'll need the `ruby-gtk2` library.
138
+
139
+ Linux
140
+ #####
141
+
142
+ Under linux, use your package manager to install `ruby-gtk2`, e.g. for
143
+ Debian/Ubuntu, type:
144
+
145
+ sudo apt-get install libgtk2-ruby
146
+
147
+
148
+ Windows
149
+ #######
150
+
151
+ If you run a 32bit Ia32 ruby interpreter (check that `ruby -v` returns
152
+ something like `[i386-mswin32]`), the Gui should work right away without
153
+ `gtk2`, so go directly to the `Testing` part.
154
+
155
+ Otherwise, you'll need to install the `gtk2` libs and the ruby bindings
156
+ manually. Please follow the instructions at
157
+ <http://ruby-gnome2.sourceforge.jp/hiki.cgi?Install+Guide+for+Windows>
158
+
159
+
160
+ Testing
161
+ #######
162
+
163
+ To test the correct working of the Gui, simply launch the
164
+ `samples/disassemble-gui.rb` script found in the metasm directory
165
+ (double-click on the script, or type `ruby samples/disassemble-gui.rb` at
166
+ a command prompt). It should display a window with a menu, and should
167
+ answer to a `ctrl-o` keystroke with an `open binary file` dialog.
168
+
169
+ See the <usage/disassembler_gui.txt> for more information.
170
+
@@ -0,0 +1,3 @@
1
+ span.quote {
2
+ font-family: monospace;
3
+ }
@@ -0,0 +1,18 @@
1
+ Metasm use cases
2
+ ================
3
+
4
+ Metasm is intended to be a binary manipulation toolbox.
5
+ There are quite a lot of possible usages that can be derived from the
6
+ <feature_list.txt>.
7
+
8
+ The major would be related to:
9
+
10
+ * the scriptable <usage/debugger.txt>
11
+ * the <usage/disassembler.txt> (with the optionnal <usage/disassembler_gui.txt>)
12
+ * the <usage/assembler.txt>
13
+ * the <usage/C_parser.txt>
14
+ * the <usage/C_compiler.txt>
15
+ * the <usage/exe_manipulation.txt> facilities
16
+
17
+ and various interaction between those.
18
+
@@ -0,0 +1,80 @@
1
+ # This file is part of Metasm, the Ruby assembly manipulation suite
2
+ # Copyright (C) 2006-2009 Yoann GUILLOT
3
+ #
4
+ # Licence is LGPL, see LICENCE in the top-level directory
5
+
6
+
7
+ module Metasm
8
+ # root directory for metasm files
9
+ # used by some scripts, eg to find samples/dasm-plugin directory
10
+ Metasmdir = File.dirname(__FILE__)
11
+ # add it to the ruby library path
12
+ $: << Metasmdir
13
+
14
+ # constants defined in the same file as another
15
+ Const_autorequire_equiv = {
16
+ 'X86' => 'Ia32', 'PPC' => 'PowerPC',
17
+ 'X64' => 'X86_64', 'AMD64' => 'X86_64',
18
+ 'UniversalBinary' => 'MachO', 'COFFArchive' => 'COFF',
19
+ 'DEY' => 'DEX',
20
+ 'PTrace' => 'LinOS', 'FatELF' => 'ELF',
21
+ 'LoadedELF' => 'ELF', 'LoadedPE' => 'PE',
22
+ 'LoadedAutoExe' => 'AutoExe',
23
+ 'LinuxRemoteString' => 'LinOS',
24
+ 'LinDebugger' => 'LinOS',
25
+ 'WinAPI' => 'WinOS',
26
+ 'WindowsRemoteString' => 'WinOS', 'WinDbgAPI' => 'WinOS',
27
+ 'WinDebugger' => 'WinOS',
28
+ 'GdbRemoteString' => 'GdbClient', 'GdbRemoteDebugger' => 'GdbClient',
29
+ 'DecodedInstruction' => 'Disassembler', 'DecodedFunction' => 'Disassembler',
30
+ 'InstructionBlock' => 'Disassembler',
31
+ }
32
+
33
+ # files to require to get the definition of those constants
34
+ Const_autorequire = {
35
+ 'Ia32' => 'ia32', 'MIPS' => 'mips', 'PowerPC' => 'ppc', 'ARM' => 'arm',
36
+ 'X86_64' => 'x86_64', 'Sh4' => 'sh4', 'Dalvik' => 'dalvik',
37
+ 'C' => 'compile_c',
38
+ 'MZ' => 'exe_format/mz', 'PE' => 'exe_format/pe',
39
+ 'ELF' => 'exe_format/elf', 'COFF' => 'exe_format/coff',
40
+ 'Shellcode' => 'exe_format/shellcode', 'AutoExe' => 'exe_format/autoexe',
41
+ 'AOut' => 'exe_format/a_out', 'MachO' => 'exe_format/macho',
42
+ 'DEX' => 'exe_format/dex',
43
+ 'NDS' => 'exe_format/nds', 'XCoff' => 'exe_format/xcoff',
44
+ 'Bflt' => 'exe_format/bflt', 'Dol' => 'exe_format/dol',
45
+ 'Gui' => 'gui',
46
+ 'WindowsExports' => 'os/windows_exports',
47
+ 'GNUExports' => 'os/gnu_exports',
48
+ 'LinOS' => 'os/linux', 'WinOS' => 'os/windows',
49
+ 'GdbClient' => 'os/remote',
50
+ 'Disassembler' => 'disassemble',
51
+ 'Decompiler' => 'decompile',
52
+ 'DynLdr' => 'dynldr',
53
+ }
54
+
55
+ # use the Module.autoload ruby functionnality to load framework components on demand
56
+ Const_autorequire.each { |cst, file|
57
+ autoload cst, File.join('metasm', file)
58
+ }
59
+
60
+ Const_autorequire_equiv.each { |cst, eqv|
61
+ file = Const_autorequire[eqv]
62
+ autoload cst, File.join('metasm', file)
63
+ }
64
+ end
65
+
66
+ # load Metasm core files
67
+ %w[main encode decode render exe_format/main os/main].each { |f|
68
+ require File.join('metasm', f)
69
+ }
70
+
71
+
72
+ # remove an 1.9 warning, couldn't find a compatible way...
73
+ if Hash.new.respond_to?(:key)
74
+ puts "using ruby1.9 workaround for Hash#index warning" if $DEBUG
75
+ class Hash
76
+ alias index_premetasm index rescue nil
77
+ undef index rescue nil
78
+ alias index key
79
+ end
80
+ end