[BATCH/RUBY] [APORTE] REG2BAT (Convierte archivos REG a BAT)

Iniciado por Eleкtro, 30 Marzo 2012, 01:28 AM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro



Un simple programa por línea de comandos que convierte archivos de registro (.REG) a archivos por lotes (.BAT)

Modo de empleo:
REG2BAT.exe [Archivo]

Ejemplos:
REG2BAT.exe Archivo.reg
REG2BAT.exe *.reg
REG2BAT.exe *


Ahora con un sencillo instalador!
Convierte archivos con un solo click del ratón! ::)


(Hecho especialmente para aquellos Batcheros que no disponen del intérprete de Ruby  :-[)



Nota:
Esta version solamente es compatible con archivos de registro en codificación Unicode, debido a las mejoras para evitar los bugs corregidos.




Test.reg
(Un simple archivo de registro para que puedan testear el programa.)

Windows Registry Editor Version 5.00

# Delete test:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
"my key"=-
[-HKEY_CURRENT_USER\test]

# Add Test
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
"Binary Test"=hex:da,da,d2,dd,d0
"Dword Test"=dword:23523626
"Expand SZ Test"=hex(2):25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,00,00,00
"Multi SZ Test"=hex(7):22,00,63,00,3a,00,5c,00,70,00,72,00,6f,00,67,00,72,00,\
 61,00,6d,00,20,00,66,00,69,00,6c,00,65,00,73,00,5c,00,74,00,65,00,73,00,74,\
 00,2e,00,65,00,78,00,65,00,22,00,00,00,00,00
"Qword Test"=hex(b):2f,3b,00,00,00,00,00,00
"SZ Test"="Wscript.exe \"C:\\Program Files (x86)\\RUN.vbs\""


La conversión del test.reg:

Código (dos) [Seleccionar]
REG DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /V "my key" /F
REG DELETE "HKCU\test" /F
REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /V "Binary Test" /T "REG_BINARY" /D dadad2ddd0 /F
REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /V "Dword Test" /T "REG_DWORD" /D 0x23523626 /F
REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /V "Expand SZ Test" /T "REG_EXPAND_SZ" /D "%%windir%%" /F
REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /V "Qword Test" /T "REG_QWORD" /D "0x0000000000003b2f" /F
REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /V "Multi SZ Test" /T "REG_MULTI_SZ" /D "\"c:\program files\test.exe\"" /F
REG ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /V "SZ Test" /T "REG_SZ" /D "Wscript.exe \"C:\Program Files (x86)\RUN.vbs\"" /F





REG2BAT.rb

Versión 0.3

Soporte para convertir lineas de comentario a comentario de Batch
Se ha mejorado la eficacia de conversión para evitar al 100% problemas con claves de varias lineas.

Bugs corregidos:
- Error al intentar convertir una clave binaria de varias lineas
- Error al convertir claves predeterminadas

Versión 0.2
Ahora soporta el uso del comodín *
REG2BAT *
REG2BAT *.reg


# -*- coding: UTF-8 -*-


# # # # # # # # # # # # # # # # # # #

#           REG2BAT v0.3            #          

#         By Elektro H@cker         #

#  Tested with REGEDIT 5.0 version  #

# # # # # # # # # # # # # # # # # # #


require 'tmpdir'
exit if Object.const_defined?(:Ocra)

def logo
 puts "
_  .-')     ('-.                              .-. .-')     ('-.     .-') _    
( \\( -O )  _(  OO)                             \\  ( OO )   ( OO ).-.(  OO) )  
,------. (,------. ,----.         .-----.      ;-----.\\   / . --. //     '._  
|   /`. ' |  .---''  .-./-')     / ,-.   \\     | .-.  |   | \\-.  \\ |'--...__)
|  /  | | |  |    |  |_( O- )    '-'  |  |     | '-' /_).-'-'  |  |'--.  .--'
|  |_.' |(|  '--. |  | .--, \\       .'  /      | .-. `.  \\| |_.'  |   |  |    
|  .  '.' |  .--'(|  | '. (_/     .'  /__      | |  \\  |  |  .-.  |   |  |    
|  |\\  \\  |  `---.|  '--'  |     |       |     | '--'  /  |  | |  |   |  |    
`--' '--' `------' `------'      `-------'     `------'   `--' `--'   `--'    
 "

 puts "

                         Coded by Elektro H@cker

                     ▄                        ▄█████  
                     ███▄▄        ▄▄▄▄▄▄▄▄█████████▀  
                     ██████▀ ▄▄████████████████████  
                     ▀████ ▄███████████████████████▄  
                      ███ ▄███████████████████████████
                      ▀█ █████████████████▀▀   ██ ████
                     ▄▄█████████████████▀      ██ ████
                     ███▀▀████████████▀       ▄█  ████
                     ███▄    ▀▀█████▀ ▄▀▄    ▄█  ▄████
                      ███▄▄  ▄▀▄ ▀███▄▀▀  ▄▄▀█▀  █████
                     ▄▄█▄▀█▄▄ ▀▀████████▀███  ▄ ██████
                     ▀████▄▀▀▀██▀▀██▀▀██  ▀█  █▄█████
                       ▀▀███▄ ▀█  ▀█   ▀ █   ▄██████ ▄
                     ████▄▄▀██▄ █  ▄  █▄ ███ ████▀▀ ▄█
                     █▀▀▀▀▀▀ █████▄█▄▄████████▀ ▄▄ ▄██
                      ▄▄█▀▀   ▀█▀██████████▀ ▄███  █▀
                     ██▀   ▄▄▀  ▄ ▀▀▀████▀ ▄████      
                     █ ▄██  ▄██      ▀█  ████  ▄███▄
                       ▄███ ▄███            ▀▀  ▄   ▀▀
 "
 sleep 0.5
end

def help()
 print "\n How to use:\n\n"
 print "  " + __FILE__.split('/').last + " [File]\n\n"
 print "\n Examples:\n\n"
 print "  " + __FILE__.split('/').last + " File.reg\n\n"
 print "  " + __FILE__.split('/').last + " *.reg\n\n"
 print "  " + __FILE__.split('/').last + " *\n\n"
 Process.exit
end

def expand(string)

# Comment line
 if string[0].eql? (';')
     $key = string
     print "[COMMENT] #{string}\n"
     write_comment()
     $key = ''
 end # Comment line

# Key to delete
 if string[0..1].eql? ('[-')
   $key = string[2..-2]
   $key = $key.gsub('HKEY_CLASSES_ROOT', 'HKCR').gsub('HKEY_CURRENT_USER', 'HKCU').gsub('HKEY_LOCAL_MACHINE', 'HKLM').gsub('HKEY_USERS', 'HKU')
   $subkey = ''
   print "IN: [-#{$key}]\n\n"
   write_delete()
   $key = ''

# Key to add
 elsif string[0..0].eql? ('[') and string[-1].eql? (']')
   $key = string[1..-2]
   $key = $key.gsub('HKEY_CLASSES_ROOT', 'HKCR').gsub('HKEY_CURRENT_USER', 'HKCU').gsub('HKEY_LOCAL_MACHINE', 'HKLM').gsub('HKEY_USERS', 'HKU')
   print "IN: #{string}\n\n"

#Subkey to delete
 elsif string[-1].eql? ('-')
   $subkey = string
   $subkey = $subkey[0..-3]
   print "[REG] #{string}\n"
   write_delete
   $key = ''

#Subkey to add
 elsif string.include? '"'
   if not $key.eql? ''

     $subkey = string
     $subkey = $subkey.gsub('\\\\', '\\')
     $subkey = $subkey.gsub(      '@=' , ' "" /D '                )
     $subkey = $subkey.gsub(   '=hex:' , ' /T "REG_BINARY" /D '   )
     $subkey = $subkey.gsub('=hex(2):' , ' /T "REG_EXPAND_SZ" /D ')
     $subkey = $subkey.gsub('=hex(7):' , ' /T "REG_MULTI_SZ" /D ' )
     $subkey = $subkey.gsub('=hex(b):' , ' /T "REG_QWORD" /D '    )
     $subkey = $subkey.gsub( '=dword:' , ' /T "REG_DWORD" /D '    )
     $subkey = $subkey.gsub(     '"="' ,'" /T "REG_SZ" /D "'      )

     # BIANRY
       if $subkey.include? 'REG_BINARY'
          $subkey = $subkey.gsub(',' , '')
       end # BINARY

     # DWORD
       if $subkey.include? 'REG_DWORD'
          $DWORD_data = $subkey.split('/D').last
          $New_DWORD_data =  ' 0x' + $DWORD_data[1..-1]
          $subkey = $subkey.gsub($DWORD_data, $New_DWORD_data)
       end # DWORD

     # QWORD
       if $subkey.include? 'REG_QWORD'
          $QWORD_data = $subkey.split('/D').last.gsub(',','').gsub(' ', '')
          hex_string_len = $QWORD_data.length
          $New_QWORD_data = ''
          min = -2
          until min < -hex_string_len
            hex_string_block = $QWORD_data[min,2]
            $New_QWORD_data << hex_string_block
            min -= 2
          end # until
          $subkey = $subkey.split('/D').first + '/D "0x' + $New_QWORD_data + '"'
       end # QWORD

     # EXPAND
     #   &
     # MULTI
       if $subkey.include? 'REG_EXPAND_SZ' or $subkey.include? 'REG_MULTI_SZ'
          hex_string = $subkey.split('/D').last.gsub(' ', '').gsub('\\', '').gsub(',00', '').gsub('00,', '').gsub(',', '')
          hex_string_len = hex_string.length
          $New_hex_data = ''
          min = 0
          until min == hex_string_len
            $New_hex_data << hex_string[min,2].hex.chr
            min += 2
          end # until
          $New_hex_data = $New_hex_data.gsub('"', '\"').gsub('%', '%%')
          $subkey = $subkey.split('/D').first + '/D "' + $New_hex_data + '"'
       end # EXPAND & MULTI

     print "[REG] #{string}\n"
     write_add()
     $subkey = ''
   end # if not $key.eql? ''
 end # if & elsifs
end

def write_delete()
 if not $subkey.eql? ""
   File.open(ARGV[$num][0..-4] + "bat", 'a+') do |file|
     file.print "REG DELETE \"#{$key}\" /V #{$subkey} /F \n"
     print "[BAT] REG DELETE \"#{$key}\" /V #{$subkey} /F \n\n"
   end # file (1)
 elsif
   File.open(ARGV[$num][0..-4] + "bat", 'a+') do |file|  
     file.print "REG DELETE \"#{$key}\" /F \n"
     print "[BAT] REG DELETE \"#{$key}\" /F \n\n"
   end # file (2)
 end # if & elsifs
end

def write_add()
 File.open(ARGV[$num][0..-4] + "bat", 'a+') do |file|  
   file.print "REG ADD \"#{$key}\" /V #{$subkey} /F \n"
   print "[BAT] REG ADD \"#{$key}\" /V #{$subkey} /F \n\n"
 end # file
end

def write_comment()
 File.open(ARGV[$num][0..-4] + "bat", 'a+') do |file|  
   file.print "REM #{$key}\n"
 end # file
end

def args()
 if ARGV.empty? or ARGV[$num] == "/?"
   help()
 elsif ARGV[$num] == nil
   print "Finished.\n"
   Process.exit
 elsif not File.exist? (ARGV[$num])
   print "\n ERROR.               File doesn't exist...\n\n"
   help()
 elsif not ARGV[$num].split('.').last.eql? "reg" and not ARGV[$num].split('.').last.eql? "REG"
   print "\n ERROR.               File " + ARGV[$num] + " is not a valid registry...\n\n"
   $num += 1
   if ARGV.length == 1
     print "Finished.\n"
     Process.exit
   end # ARGV.length
 args()
 end # if & elsifs
end

########################################################################################################

string = ''
$string_hex = ''
$num = 0
$regcode = ''

logo()
args()

while not $num == ARGV.length or $num < ARGV.length
 args()
 File.open(ARGV[$num], "r:utf-16le:UTF-8").each_line { |line|
   if line[0..1].eql?   "  "  then line = line[2..-1] end
   if line[-3..-2].eql? ",\\" then line = line[0..-3] end
   $regcode = $regcode + line
 }
 File.open("#{Dir.tmpdir}/#{ARGV[$num].split('\\').last}", 'a+') { |file| file.puts $regcode }
 File.open("#{Dir.tmpdir}/#{ARGV[$num].split('\\').last}", "r").each_line { |string| expand(string[0..-2]) and string = ''}
 File.open("#{Dir.tmpdir}/#{ARGV[$num].split('\\').last}", "w") { |delete| delete.print "" }
 $regcode = ''
 $num += 1
end # while

puts "Finished.\n"
__END__





Saludos  :D








Eleкtro