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.
- data/History.txt +32 -0
- data/README.rdoc +60 -0
- data/README.txt +9 -0
- data/Rakefile +86 -0
- data/VERSION +1 -0
- data/examples/hittracertux.rb +45 -0
- data/examples/hittracerx.rb +63 -0
- data/examples/hook_notepad.rb +9 -0
- data/examples/snicker.rb +183 -0
- data/examples/tux-example.rb +24 -0
- data/lib/ragweed/arena.rb +55 -0
- data/lib/ragweed/blocks.rb +128 -0
- data/lib/ragweed/debugger32.rb +400 -0
- data/lib/ragweed/debuggerosx.rb +456 -0
- data/lib/ragweed/debuggertux.rb +502 -0
- data/lib/ragweed/detour.rb +223 -0
- data/lib/ragweed/ptr.rb +48 -0
- data/lib/ragweed/rasm/bblock.rb +73 -0
- data/lib/ragweed/rasm/isa.rb +1115 -0
- data/lib/ragweed/rasm.rb +59 -0
- data/lib/ragweed/sbuf.rb +197 -0
- data/lib/ragweed/trampoline.rb +103 -0
- data/lib/ragweed/utils.rb +182 -0
- data/lib/ragweed/wrap32/debugging.rb +401 -0
- data/lib/ragweed/wrap32/device.rb +49 -0
- data/lib/ragweed/wrap32/event.rb +50 -0
- data/lib/ragweed/wrap32/hooks.rb +39 -0
- data/lib/ragweed/wrap32/overlapped.rb +46 -0
- data/lib/ragweed/wrap32/process.rb +613 -0
- data/lib/ragweed/wrap32/process_token.rb +75 -0
- data/lib/ragweed/wrap32/thread_context.rb +142 -0
- data/lib/ragweed/wrap32/winx.rb +16 -0
- data/lib/ragweed/wrap32/wrap32.rb +583 -0
- data/lib/ragweed/wrap32.rb +59 -0
- data/lib/ragweed/wraposx/constants.rb +114 -0
- data/lib/ragweed/wraposx/kernelerrorx.rb +147 -0
- data/lib/ragweed/wraposx/region_info.rb +275 -0
- data/lib/ragweed/wraposx/structs.rb +102 -0
- data/lib/ragweed/wraposx/thread_context.rb +902 -0
- data/lib/ragweed/wraposx/thread_info.rb +160 -0
- data/lib/ragweed/wraposx/thread_info.rb.old +121 -0
- data/lib/ragweed/wraposx/wraposx.rb +356 -0
- data/lib/ragweed/wraposx.rb +60 -0
- data/lib/ragweed/wraptux/constants.rb +101 -0
- data/lib/ragweed/wraptux/process.rb +35 -0
- data/lib/ragweed/wraptux/threads.rb +7 -0
- data/lib/ragweed/wraptux/wraptux.rb +72 -0
- data/lib/ragweed/wraptux.rb +57 -0
- data/lib/ragweed.rb +112 -0
- data/ragweed.gemspec +102 -0
- data/spec/ragweed_spec.rb +7 -0
- data/spec/spec_helper.rb +16 -0
- data/test/test_ragweed.rb +0 -0
- metadata +121 -0
data/lib/ragweed/ptr.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# TODO: make read/write work for other oses
|
2
|
+
|
3
|
+
class Ragweed::Ptr
|
4
|
+
# A dubious achievement. Wrap Integers in a pointer class, which,
|
5
|
+
# when you call to_s, returns the marshalled type, and which exports
|
6
|
+
# read/write methods.
|
7
|
+
attr_accessor :p
|
8
|
+
attr_reader :val
|
9
|
+
|
10
|
+
# ptr-to-zero?
|
11
|
+
def null?
|
12
|
+
@val == 0
|
13
|
+
end
|
14
|
+
|
15
|
+
# initialize with a number or another pointer (implements copy-ctor)
|
16
|
+
def initialize(i)
|
17
|
+
if i.kind_of? self.class
|
18
|
+
@val = i.val
|
19
|
+
@p = i.p
|
20
|
+
elsif not i
|
21
|
+
@val = 0
|
22
|
+
else
|
23
|
+
@val = i
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# return the raw pointer bits
|
28
|
+
def to_s; @val.to_l32; end
|
29
|
+
|
30
|
+
# return the underlying number
|
31
|
+
def to_i; @val; end
|
32
|
+
|
33
|
+
# only works if you attach a process
|
34
|
+
def write(arg); p.write(self, arg); end
|
35
|
+
def read(sz); p.read(self, sz); end
|
36
|
+
|
37
|
+
# everything else: work like an integer --- also, where these
|
38
|
+
# calls return numbers, turn them back into pointers, so pointer
|
39
|
+
# math doesn't shed the class wrapper
|
40
|
+
def method_missing(meth, *args)
|
41
|
+
ret = @val.send meth, *args
|
42
|
+
if ret.kind_of? Numeric
|
43
|
+
ret = Ragweed::Ptr.new(ret)
|
44
|
+
ret.p = self.p
|
45
|
+
end
|
46
|
+
ret
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Ragweed; end
|
2
|
+
module Ragweed::Rasm
|
3
|
+
# Ruby inline assembler.
|
4
|
+
class Bblock
|
5
|
+
# Don't call this directly; use Bblock#make
|
6
|
+
def initialize
|
7
|
+
@insns = Ragweed::Rasm::Subprogram.new
|
8
|
+
end
|
9
|
+
|
10
|
+
# Wrap the methods of Rasm::Subprogram we care about:
|
11
|
+
|
12
|
+
# Assemble the instructions, which also calculates appropriate
|
13
|
+
# jump labels.
|
14
|
+
def assemble; @insns.assemble; end
|
15
|
+
|
16
|
+
# Disassemble the block (after it's been assembled) into
|
17
|
+
# Frasm objects.
|
18
|
+
def disassemble; @insns.disassemble; end
|
19
|
+
|
20
|
+
# Generate a human-readable assembly listing.
|
21
|
+
def listing; @insns.dump_disassembly; end
|
22
|
+
|
23
|
+
# Append more instructions to a previously created block;
|
24
|
+
# see Bblock#make
|
25
|
+
def append(&block)
|
26
|
+
instance_eval(&block)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Takes a block argument, containing (mostly) assembly
|
30
|
+
# instructions, as interpreted by Rasm. For example:
|
31
|
+
#
|
32
|
+
# Bblock.make {
|
33
|
+
# push ebp
|
34
|
+
# mov ebp, esp
|
35
|
+
# push ebx
|
36
|
+
# xor ebx, ebx
|
37
|
+
# addl esp, 4
|
38
|
+
# pop ebp
|
39
|
+
# ret
|
40
|
+
# }
|
41
|
+
#
|
42
|
+
# Each of those instructions is in fact the name of a class
|
43
|
+
# in Rasm, lowercased; Bblock has a method_missing that catches
|
44
|
+
# and instantiates them.
|
45
|
+
#
|
46
|
+
# Your block can contain arbitrary Ruby, but remember that it
|
47
|
+
# runs in the scope of an anonymous class and so cannot directly
|
48
|
+
# reference instance variables.
|
49
|
+
def self.make(&block)
|
50
|
+
c = Bblock.new
|
51
|
+
c.instance_eval(&block)
|
52
|
+
c
|
53
|
+
end
|
54
|
+
|
55
|
+
# method to fix collision with Kernel#sub properly
|
56
|
+
def sub(*args)
|
57
|
+
Ragweed::Rasm::Sub.new(*args)
|
58
|
+
end
|
59
|
+
|
60
|
+
def method_missing(meth, *args)
|
61
|
+
k = Ragweed::Rasm.const_get(meth.to_s.capitalize)
|
62
|
+
|
63
|
+
# If it's a class, it's an assembly opcode; otherwise,
|
64
|
+
# it's a register or operand.
|
65
|
+
if k.class == Class
|
66
|
+
@insns << (k = k.new(*args))
|
67
|
+
else
|
68
|
+
k
|
69
|
+
end
|
70
|
+
k
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|