[BATCH] Extraer adjunto de EML

Iniciado por Afkael, 25 Julio 2012, 16:22 PM

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

Afkael

#10
Ok, ya te envié el mensaje..

De todos modos lo planteo nuevamente porque al principio creo que no supe explicar bien cómo creo que tiene que funcionar..

Primer Paso...

Pasar todos los .eml de la carpeta a un único .txt (eso se consigue fácil)

type *.eml > destino.txt

Segundo paso..

Eliminar del archivo destino.txt todo lo que NO sea código base64 (ésto es lo que no se hacer, aunque estimo que splitter.exe de EleKtro H@cker lo podría hacer)

Tercer paso..

descifrar el código base64 del archivo destino.txt (con la aplicación de b64dec o con Decrypter.exe de EleKtro H@cker)

b64dec destino.txt destino-decodificado.txt

y listo. Puse los códigos más simples o al menos los que entiendo que hacen. La idea tambien es que no crear archivos intermedios como destino.txt sino que los datos estén limpios y decodificados (destino-decodificado.txt).

Saludos!

Eleкtro

#11
hmmm No te preocupes, El último script que puse hacia eso.




Cita de: EleKtro H@cker en 26 Julio 2012, 20:53 PM
El code sigue las siguientes condiciones (Si esto no es como lo he tenido en cuenta, Especifícalo para corregirlo):
- El principio del code en base64 empieza SIEMPRE después de la cadena "X-Attachment-Id: ......."

El problema en los eml reales es que esa condición no se cumple, La cadena es distinta:
Content-Disposition: attachment; filename=........

Así que es suficiente con cambiar la cadena que el script tiene que buscar...:
Código (ruby) [Seleccionar]
if line.include?('Attachment-Id')
Por esta:
Código (ruby) [Seleccionar]
if line.include?('attachment')

(EDITO: DEBES ASEGURARTE DE QUE EN TODOS LOS ARCHIVOS EML SÉA IGUAL LA CONDICIÓN ANTES DE USAR EL SCRIPT, SINÓ NO SE DESENCRIPTARAN TODOS LOS EMAILS. SUPONGO QUE SI TODOS LO HAN MANDADO CON EL MISMO CLIENTE DE CORREO PUES LA CONDICIÓN NO CAMBIARÁ, PERO ASEGURATE TÚ MISMO MEJOR. SI HAY MÁS CADENAS DISTINTAS AGREGALAS A ESTE ÚLTIMO SCRIPT COMO VES QUE HE HECHO)

Aquí tienes una versión mejorada:

EML-Decrypter.RB
Código (ruby) [Seleccionar]
# -*- coding: UTF-8 -*-
require 'base64'

# Este es el archivo de destino que contendrá todos los base64 descifrados.
DestFile = '.\Todo.txt'

# Cambia el directorio de trabajo actual si se indica la ruta desde la consola.
if not ARGV[0] == nil
Dir.chdir(ARGV[0])
end

# Cambia el archivo de destino si se indica desde la consola.
if not ARGV[1] == nil
DestFile = ARGV[1]
end

# Procesa cada archivo EML del directorio actual, descifrando los codes en Base64 que contenga cada archivo, Y los guarda en el archivo de destino.
for file in Dir.glob('*.eml') do
puts "\n[+] #{file}"
File.open(file).each_line do |line|
if line.include?('attachment') or line.include?('X-Attachment-Id')
puts "Adjunto: #{line.split('=').last.to_s}"
File.open(DestFile, 'a+') do |newfile|
  newfile.puts Base64.decode64(File.read(file).split(line.to_s).last.split('--').first.split(' ').to_s)
  end # newfile
end # split
end # line
end # for *.eml

__END__


PD: No es necesario que copies todos los EML en un solo archivo, El code va procesando archivo por archivo, Y va guardando los base64 descifrados en el archivo de destino.

Código (dos) [Seleccionar]
@Echo OFF
Ruby.exe EML-Decrypter.rb "Carpeta donde tengas los EML" "Archivo de destino"
REM Ejemplo:
REM EML-Decrypter.rb "C:\Test\emails" "C:\destino-descifrado.txt"
Exit


Con esto creo que ya está más que solucionado jeje xD.

Saludos.








Afkael

#12
Si señor, es exactamente lo que necesitaba, usted es groooooosso  ;-) y estoy eternamente agradecido de su buena voluntad. Los eml tienen todos la misma cadena.

Solo me queda resolver una cosilla que no he encontrado en la inet, es una pavada, pero la ruta a la carpeta que tiene los eml tiene espacios, también la ruta donde quiero poner el archivo de salida y por ello no he podido hacerlo funcionar con esas rutas..

@Echo OFF
Ruby.exe EML-Decrypter.rbw "C:\Users\Dardo\AppData\Local\Microsoft\Windows Live Mail\Live.com (d a3d\Liquidación df1" "C:\Users\Dardo\Dropbox\AJYJA Redolfi\Plantillas\Acreditaciones POS\Acreditaciones.txt"
REM Ejemplo:
REM EML-Decrypter.rb "C:\Test\emails" "C:\destino-descifrado.txt"
Exit


Bien.. la cuestion es que el script funcionaasi que pongo que está solucionado.

Gracias de nuevo!!

Eleкtro

#13
Es extraño que no funcione por los espacios :-/

EDITO: El problema es que estás usando el caracter expecial latino "ó" (Liquidación)

Prueba asi:

Código (dos) [Seleccionar]
@Echo OFF
CHCP 1252
Ruby.exe EML-Decrypter.rbw "C:\Users\Dardo\AppData\Local\Microsoft\Windows Live Mail\Live.com (d a3d\Liquidación df1" "C:\Users\Dardo\Dropbox\AJYJA Redolfi\Plantillas\Acreditaciones POS\Acreditaciones.txt"
Exit


EDITO 2: Y guarda el bat desde el bloc de notas, en codificación ANSI.

Saludos








Afkael

Cita de: EleKtro H@cker en 28 Julio 2012, 16:38 PM
Es extraño que no funcione por los espacios :-/

En realidad es una supocición mia, ya que el script funciona si copio todos los .eml a la carpeta c:/test/email como venia en el ejemplo.

En fin.. tampoco éstos código funciona.. voy a revisar la ruta, yo crei que podían ser los espacios.

Afkael

#15
Cita de: EleKtro H@cker en 28 Julio 2012, 16:38 PM
Es extraño que no funcione por los espacios :-/

EDITO: El problema es que estás usando el caracter expecial latino "ó" (Liquidación)

Prueba asi:

Código (dos) [Seleccionar]
@Echo OFF
CHCP 1252
Ruby.exe EML-Decrypter.rbw "C:\Users\Dardo\AppData\Local\Microsoft\Windows Live Mail\Live.com (d a3d\Liquidación df1" "C:\Users\Dardo\Dropbox\AJYJA Redolfi\Plantillas\Acreditaciones POS\Acreditaciones.txt"
Exit



EDITO 2: Y guarda el bat desde el bloc de notas, en codificación ANSI.

Saludos

Sip.. listo!!

Gracias!

Eleкtro

Solo te dí la solución para que Batch reconozca el caracter "Ó", Pero me faltó darte la solución para que Ruby reconozca el caracter.

EML-Decrypter.rb
Código (ruby) [Seleccionar]
# -*- coding: IBM437 -*-
require 'base64'

# Este es el archivo de destino que contendrá todos los base64 descifrados.
DestFile = '.\Todo.txt'

# Cambia el directorio de trabajo actual si se indica la ruta desde la consola.
if not ARGV[0] == nil
puts Dir.chdir(ARGV[0].gsub('ó','¢'))
end

# Cambia el archivo de destino si se indica desde la consola.
if not ARGV[1] == nil
DestFile = ARGV[1]
end

# Procesa cada archivo EML del directorio actual, descifrando los codes en Base64 que contenga cada archivo, Y los guarda en el archivo de destino.
for file in Dir.glob('*.eml') do
puts "\n[+] #{file}"
File.open(file).each_line do |line|
if line.include?('attachment')
puts "Adjunto: #{line.split('=').last.to_s}"
File.open(DestFile, 'a+') do |newfile|
  newfile.puts Base64.decode64(File.read(file).split(line.to_s).last.split('--').first.split(' ').to_s)
  end # newfile
end # split
end # line
end # for *.eml

__END__


Lo he testeado con las rutas de tu ejemplo.

PD: Sería mucho más fácil si le cambiases la maldita Ó a la carpeta xD

Saludos.








Afkael

#17
Mirá que el anterior funciona y éste último no..

No te se decir cuál es el problema, pero el último código no funciona pero el primero si :)

Edtito: Además agregué una linea al archivo batch para eliminar el archivo Agreditaciones.txt antes de extraer la información de los .eml porque duplicaba los datos que ya contenía. Osea, si el archivo tenia 500 datos, al ejecutarlo nuevamente empezaba a tener 1000, 1500, 2000 y asi sucesivamente..

Nuevo Batch
Código (dos) [Seleccionar]
@Echo OFF
del Acreditaciones.txt
CHCP 1252
Ruby.exe EML-Decrypter.rbw "C:\Mails" "C:\Acreditaciones.txt"
Exit




Saludos!