2010-09-09 18:19:35 +00:00
|
|
|
#
|
|
|
|
# This file is part of Metasm, the Ruby assembly manipulation suite
|
|
|
|
# Copyright (C) 2006-2009 Yoann GUILLOT
|
|
|
|
#
|
|
|
|
# Licence is LGPL, see LICENCE in the top-level directory
|
|
|
|
|
|
|
|
# this file sets up the RUBYLIB environment variable for windows hosts
|
|
|
|
# the variable is set for the current user only
|
|
|
|
# the user session may need to be restarted so that the changes take effect
|
|
|
|
|
|
|
|
# the path to the framework
|
|
|
|
metasmpath = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
|
|
|
|
|
|
|
$: << metasmpath
|
|
|
|
require 'metasm'
|
|
|
|
|
|
|
|
d = Metasm::DynLdr
|
|
|
|
|
|
|
|
d.new_api_c <<EOS, 'advapi32'
|
|
|
|
__stdcall int RegCreateKeyExA(
|
2013-08-30 21:28:33 +00:00
|
|
|
void *key,
|
|
|
|
char *subkey,
|
|
|
|
int resvd,
|
|
|
|
char *class,
|
|
|
|
int options,
|
|
|
|
int access,
|
|
|
|
void *security,
|
|
|
|
void **keyout,
|
|
|
|
void *dispos);
|
2010-09-09 18:19:35 +00:00
|
|
|
|
|
|
|
__stdcall int RegQueryValueExA(
|
2013-08-30 21:28:33 +00:00
|
|
|
void *key,
|
|
|
|
char *value,
|
|
|
|
int resvd,
|
|
|
|
int type,
|
|
|
|
void *data,
|
|
|
|
int *datalen);
|
2010-09-09 18:19:35 +00:00
|
|
|
|
|
|
|
__stdcall int RegSetValueExA(
|
2013-08-30 21:28:33 +00:00
|
|
|
void *key,
|
|
|
|
char *value,
|
|
|
|
int resvd,
|
|
|
|
int type,
|
|
|
|
void *data,
|
|
|
|
int datalen);
|
2010-09-09 18:19:35 +00:00
|
|
|
|
|
|
|
__stdcall int RegCloseKey(
|
2013-08-30 21:28:33 +00:00
|
|
|
void *key);
|
2010-09-09 18:19:35 +00:00
|
|
|
|
|
|
|
#define KEY_ALL_ACCESS 0xf003f
|
|
|
|
#define KEY_CURRENT_USER 0x80000001
|
|
|
|
#define REG_EXPAND_SZ 2
|
|
|
|
EOS
|
|
|
|
|
|
|
|
key = [0].pack('L')
|
|
|
|
ret = d.regcreatekeyexa(d::KEY_CURRENT_USER, 'Environment', 0, 0, 0, d::KEY_ALL_ACCESS, 0, key, 0)
|
|
|
|
key = key.unpack('L').first
|
|
|
|
abort 'cannot open env key' if ret != 0
|
|
|
|
|
|
|
|
buf = 0.chr*4096
|
|
|
|
buflen = [buf.length].pack('L')
|
|
|
|
ret = d.regqueryvalueexa(key, 'RUBYLIB', 0, 0, buf, buflen)
|
|
|
|
data = ret == 0 ? buf[0, buflen.unpack('L').first-1] : ''
|
|
|
|
|
|
|
|
if data.split(';').include? metasmpath
|
2013-08-30 21:28:33 +00:00
|
|
|
puts 'already registered'
|
2010-09-09 18:19:35 +00:00
|
|
|
else
|
2013-08-30 21:28:33 +00:00
|
|
|
data << ';' if not data.empty?
|
|
|
|
data << metasmpath << 0
|
|
|
|
ret = d.regsetvalueexa(key, 'RUBYLIB', 0, d::REG_EXPAND_SZ, data, data.length)
|
|
|
|
if ret == 0
|
|
|
|
puts "success - restart your session"
|
|
|
|
else
|
|
|
|
puts "failed :( - #{Metasm::WinAPI.last_error_msg(ret)}"
|
|
|
|
end
|
2010-09-09 18:19:35 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
d.regclosekey(key)
|