ragweed 0.2.0-java

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 (54) hide show
  1. data/History.txt +32 -0
  2. data/README.rdoc +60 -0
  3. data/README.txt +9 -0
  4. data/Rakefile +86 -0
  5. data/VERSION +1 -0
  6. data/examples/hittracertux.rb +45 -0
  7. data/examples/hittracerx.rb +63 -0
  8. data/examples/hook_notepad.rb +9 -0
  9. data/examples/snicker.rb +183 -0
  10. data/examples/tux-example.rb +24 -0
  11. data/lib/ragweed/arena.rb +55 -0
  12. data/lib/ragweed/blocks.rb +128 -0
  13. data/lib/ragweed/debugger32.rb +400 -0
  14. data/lib/ragweed/debuggerosx.rb +456 -0
  15. data/lib/ragweed/debuggertux.rb +502 -0
  16. data/lib/ragweed/detour.rb +223 -0
  17. data/lib/ragweed/ptr.rb +48 -0
  18. data/lib/ragweed/rasm/bblock.rb +73 -0
  19. data/lib/ragweed/rasm/isa.rb +1115 -0
  20. data/lib/ragweed/rasm.rb +59 -0
  21. data/lib/ragweed/sbuf.rb +197 -0
  22. data/lib/ragweed/trampoline.rb +103 -0
  23. data/lib/ragweed/utils.rb +182 -0
  24. data/lib/ragweed/wrap32/debugging.rb +401 -0
  25. data/lib/ragweed/wrap32/device.rb +49 -0
  26. data/lib/ragweed/wrap32/event.rb +50 -0
  27. data/lib/ragweed/wrap32/hooks.rb +39 -0
  28. data/lib/ragweed/wrap32/overlapped.rb +46 -0
  29. data/lib/ragweed/wrap32/process.rb +613 -0
  30. data/lib/ragweed/wrap32/process_token.rb +75 -0
  31. data/lib/ragweed/wrap32/thread_context.rb +142 -0
  32. data/lib/ragweed/wrap32/winx.rb +16 -0
  33. data/lib/ragweed/wrap32/wrap32.rb +583 -0
  34. data/lib/ragweed/wrap32.rb +59 -0
  35. data/lib/ragweed/wraposx/constants.rb +114 -0
  36. data/lib/ragweed/wraposx/kernelerrorx.rb +147 -0
  37. data/lib/ragweed/wraposx/region_info.rb +275 -0
  38. data/lib/ragweed/wraposx/structs.rb +102 -0
  39. data/lib/ragweed/wraposx/thread_context.rb +902 -0
  40. data/lib/ragweed/wraposx/thread_info.rb +160 -0
  41. data/lib/ragweed/wraposx/thread_info.rb.old +121 -0
  42. data/lib/ragweed/wraposx/wraposx.rb +356 -0
  43. data/lib/ragweed/wraposx.rb +60 -0
  44. data/lib/ragweed/wraptux/constants.rb +101 -0
  45. data/lib/ragweed/wraptux/process.rb +35 -0
  46. data/lib/ragweed/wraptux/threads.rb +7 -0
  47. data/lib/ragweed/wraptux/wraptux.rb +72 -0
  48. data/lib/ragweed/wraptux.rb +57 -0
  49. data/lib/ragweed.rb +112 -0
  50. data/ragweed.gemspec +102 -0
  51. data/spec/ragweed_spec.rb +7 -0
  52. data/spec/spec_helper.rb +16 -0
  53. data/test/test_ragweed.rb +0 -0
  54. metadata +121 -0
@@ -0,0 +1,142 @@
1
+ require 'ffi'
2
+
3
+ module Ragweed::Wrap32
4
+ module EFlags
5
+ CARRY = (1 << 0)
6
+ X0 = (1 << 1)
7
+ PARITY = (1 << 2)
8
+ X1 = (1 << 3)
9
+ ADJUST = (1 << 4)
10
+ X2 = (1 << 5)
11
+ ZERO = (1 << 6)
12
+ SIGN = (1 << 7)
13
+ TRAP = (1 << 8)
14
+ INTERRUPT = (1 << 9)
15
+ DIRECTION = (1 << 10)
16
+ OVERFLOW = (1 << 11)
17
+ IOPL1 = (1 << 12)
18
+ IOPL2 = (1 << 13)
19
+ NESTEDTASK = (1 << 14)
20
+ X3 = (1 << 15)
21
+ RESUME = (1 << 16)
22
+ V86MODE = (1 << 17)
23
+ ALIGNCHECK = (1 << 18)
24
+ VINT = (1 << 19)
25
+ VINTPENDING = (1 << 20)
26
+ CPUID = (1 << 21)
27
+ end
28
+
29
+ module ContextFlags
30
+ I386 = 0x10000
31
+ CONTROL = 1
32
+ INTEGER = 2
33
+ SEGMENTS = 4
34
+ FLOATING_POINT = 8
35
+ DEBUG_REGISTERS = 0x10
36
+
37
+ FULL = (I386|CONTROL|INTEGER|SEGMENTS)
38
+ DEBUG = (FULL|DEBUG_REGISTERS)
39
+ end
40
+ end
41
+
42
+ class Ragweed::Wrap32::ThreadContext < FFI::Struct
43
+ include Ragweed::FFIStructInclude
44
+
45
+ ## This is defined in WinNt.h
46
+ layout :context_flags, :long,
47
+ :dr0, :long,
48
+ :dr1, :long,
49
+ :dr2, :long,
50
+ :dr3, :long,
51
+ :dr6, :long,
52
+ :dr7, :long,
53
+ :floating_save, [:uint8, 112], ## XXX need a structure for this
54
+ :seg_gs, :long,
55
+ :seg_fs, :long,
56
+ :seg_es, :long,
57
+ :seg_ds, :long,
58
+ :edi, :long,
59
+ :esi, :long,
60
+ :ebx, :long,
61
+ :edx, :long,
62
+ :ecx, :long,
63
+ :eax, :long,
64
+ :ebp, :long,
65
+ :eip, :long,
66
+ :seg_cs, :long,
67
+ :eflags, :long,
68
+ :esp, :long,
69
+ :seg_ss, :long,
70
+ :spill, [:uint8, 512 ] ## MAXIMUM_SUPPORTED_EXTENSION
71
+
72
+ ## XXX more helper methods here are needed
73
+
74
+ def inspect
75
+ body = lambda do
76
+ self.members.each_with_index do |m,i|
77
+ "#{self.members[i].to_s(16)} #{self.values[i].to_s.hexify}"
78
+ end.join(", ")
79
+ end
80
+ end
81
+
82
+ def dump(&block)
83
+ maybe_hex = lambda {|a| begin; "\n" + (" " * 9) + block.call(a, 16).hexdump(true)[10..-2]; rescue; ""; end }
84
+ #maybe_dis = lambda {|a| begin; "\n" + block.call(a, 16).distorm.map {|i| " " + i.mnem}.join("\n"); rescue; ""; end }
85
+
86
+ string =<<EOM
87
+ -----------------------------------------------------------------------
88
+ CONTEXT:
89
+ EIP: #{self.eip.to_s(16).rjust(8, "0")}
90
+ EAX: #{self.eax.to_s(16).rjust(8, "0")}
91
+ EBX: #{self.ebx.to_s(16).rjust(8, "0")}
92
+ ECX: #{self.ecx.to_s(16).rjust(8, "0")}
93
+ EDX: #{self.edx.to_s(16).rjust(8, "0")}
94
+ EDI: #{self.edi.to_s(16).rjust(8, "0")}
95
+ ESI: #{self.esi.to_s(16).rjust(8, "0")}
96
+ EBP: #{self.ebp.to_s(16).rjust(8, "0")}
97
+ ESP: #{self.esp.to_s(16).rjust(8, "0")}
98
+ EFL: #{self.eflags.to_s(2).rjust(32, "0")} #{Ragweed::Wrap32::EFlags.flag_dump(self.eflags)}
99
+ EOM
100
+ end
101
+
102
+ def single_step(v=true)
103
+ if v
104
+ self.eflags |= Ragweed::Wrap32::EFlags::TRAP
105
+ else
106
+ self.eflags &= ~(Ragweed::Wrap32::EFlags::TRAP)
107
+ end
108
+ end
109
+ end
110
+
111
+ module Ragweed::Wrap32
112
+ module Win
113
+ extend FFI::Library
114
+
115
+ ffi_lib 'kernel32'
116
+ ffi_convention :stdcall
117
+ attach_function 'SetThreadContext', [ :long, :pointer ], :long
118
+ attach_function 'GetThreadContext', [ :long, :pointer ], :long
119
+ end
120
+
121
+ class << self
122
+ def get_thread_context(h)
123
+ c = FFI::MemoryPointer.new(Ragweed::Wrap32::ThreadContext, 1)
124
+ ctx = Ragweed::Wrap32::ThreadContext.new c
125
+ ctx.context_flags = Ragweed::Wrap32::ContextFlags::DEBUG
126
+ #suspend_thread(h)
127
+ ret = Win.GetThreadContext(h, ctx)
128
+ #resume_thread(h)
129
+ if ret != 0
130
+ return ctx
131
+ else
132
+ raise WinX.new(:get_thread_context)
133
+ end
134
+ end
135
+
136
+ def set_thread_context(h, ctx)
137
+ ret = Win.SetThreadContext(h, ctx)
138
+ raise WinX.new(:set_thread_context) if ret == 0
139
+ return ret
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,16 @@
1
+ %w[ostruct Win32API pp].each {|x| require x}
2
+
3
+ module Ragweed;end
4
+ module Ragweed::Wrap32
5
+ class WinX < StandardError
6
+ attr_reader :code
7
+ attr_reader :msg
8
+ attr_reader :call
9
+ def initialize(sym=nil)
10
+ @call = sym
11
+ @code = Ragweed::Wrap32::get_last_error()
12
+ @msg = "#{(@call ? @call.to_s + ": " : "")}(#{@code}) #{ Ragweed::Wrap32::format_message(@code) }"
13
+ super @msg
14
+ end
15
+ end
16
+ end