A continuación puede encontrar el contenido de los dos archivos de texto de ejemplo que usaré, example1.txt y obf_example1.txt. El último contiene la cadena de example1.txt al final del archivo pero tiene algunas cadenas ofuscadas antes.

example1.txt:

adasdkasdaksdasdkjlasdjasndjasd.

obf_example1.txt:

ŠxpÃÒ²Ø-Gêÿ ój"f>ïí   H€À(ø4$/+#6Ni9Pvü¶ |CF CÀ¾ý~ª-°à9ÉOÿ V[o¦.E…-Š  ƒ9Ú\žê*D´ß()^“£¹ìÅjXÑÍ¥â(¨µ×d'«P|I*èSººº&)Ø|̉ òÔ®¥Ô$LÁ:9ŠLá{¶nZÒبNÙÀØŒ‹0õ´Sék›áÇÉîÆbËF§BЄƒöZKaÒR ²°ÅšDn?+¶()IªP›$ÇEv©¡k€[ßè¨×q-Ëk!µTóPA²—: A ?ÉEEEGÐJúÌ©ÒWµHB¡aäXû|ÓË BPÁwr„Ûi¥åܺÈQ÷ORàSb,Šv¢D ,Žb’(2 öb¢wtKzíĦ#ï¯u©²Ù  aîR隬ëÌTbà÷¥3ÄtSGì´R$)X   Šù
'¹¨D³ÞeOK3!{·‹¦cäиNÅô:Na1žAÇ1ø8 &Fuôë %¸T¯_òMå†C"ý¤F   ™º„Iµºí4Ü¡ˆc!ì•+3 ‰‹M K@JÁ«8¢bsL†!Ù“à­šn·öMå•Œ&ýèvÀ}¨?¦hùÊò(É@Žf~5‰‘qØçþƒ‰Å²ÓÖÊJU•âNWÁ«L¼Y”$G¢ßè&§ÖÉØŒS‘WàË„°SØW Ð¨´_è%‚Å¢ø.ãÃð”#X^þ*1þ‚q85¡lÒ‚Ò>‘¸ÿ £ôQôz#ø¤ÎõÚªï|Xö%;åÍËûGú+îUƒö³‰›p    U±Ò ðtÜGÜÿ  ð,åXÿ k8È I”ÿ “½¿Ð`¨u5=SÓqyFÈ É8ôã¨ð£è6’H@lÄI10‚Ö§ÑdµÖ?t¡]D†9Zj,¥EɺÜEq¤@,ìn—¢º‚´€bc·ú¨Lû£ÿ Ó×ÿÙ||adasdkasdaksdasdkjlasdjasndjasd.

Cuando ejecuté el siguiente comando powershell para example.txt en un archivo por lotes, funciona y obtengo el resultado de example.txt:

@echo off
for /f "delims=" %%a in ('powershell Get-Content .\example.txt') do set _output=%%a
echo %_output%

adasdkasdaksdasdkjlasdjasndjasd

Bien hasta ahora.

Sin embargo, cuando ejecuté el comando powershell anterior para obf_example1.txt, no funciona y recibo el siguiente mensaje de error:

'¹¨D³ÃzeOK3!{·â?¹Â¦cäÃ?Â?¸Â?NÃ.ô:Na1žAÃ╬1ø8 
The command "FuôëÂ" is either misspelled or could not be found.
The command "ýèvÃ?}¨?¦hùÃSÂ?ò" is either misspelled or could not be found.

¿Por qué? No importa, pensé: como solo estoy interesado en los últimos n caracteres tanto en example1.txt como en obf_example1.txt en consecuencia, mi idea era extraer los últimos n caracteres y verificar si Puedo ver la salida de obf_example1.txt entonces. Para verificar si mi idea funciona, ejecuto el siguiente comando para example1.txt para obtener los últimos 4 caracteres como ejemplo:

@echo off
for /f "delims=" %%a in ('powershell $a=Get-Content .\example.txt; $a.substring^(0,$a.length-4^)') do set _output=%%a
echo.%_output%

Sin embargo, no me muestra nada. %_output% parece estar vacío. ¿Cómo arreglar eso? ¿Y la versión fija funcionará también para obf_example1.txt para que obtenga una salida allí en lugar del mensaje de error anterior?

0
Ferit 29 abr. 2020 a las 20:16

3 respuestas

La mejor respuesta

Podría intentar leer los últimos 4 bytes, si realmente está tomando caracteres de texto de lo que claramente no es un archivo de texto. (Supongo que es texto oculto dentro de un archivo binario, probablemente un archivo gráfico) .

@For /F Delims^=^ EOL^= %%G In (
 '%__AppDir__%WindowsPowerShell\v1.0\powershell.exe  -NoP^
 "$f=[IO.File]::OpenRead('C:\Users\Ferit\Desktop\obf_example1.txt');"^
 "$f.Seek(-4,[System.IO.SeekOrigin]::End)|Out-Null;$buffer=new-object Byte[] 4;"^
 "$f.Read($buffer,0,4)|Out-Null;$f.Close();"^
 "[System.Text.Encoding]::UTF8.GetString($buffer)"')Do @Set "_output=%%G"
@Set _output 2>NUL&&Pause

No olvide modificar la ruta del archivo de texto, (en la línea 3) , y las tres instancias de 4 si desea más o menos bytes. La última línea se incluye solo para mostrarle el resultado, (obviamente lo reemplazaría con su propio código) .

2
Compo 29 abr. 2020 a las 21:10

Aparentemente, el texto que busca está detrás de ||.

Con PowerShell puede obtenerlo fácilmente usando

((Get-Content 'D:\Test\obf_example1.txt' -Raw) -split '\|\|')[-1]

Devuelve

adasdkasdaksdasdkjlasdjasndjasd

¿No es esto lo que quieres?

3
Theo 29 abr. 2020 a las 18:32

Lo siguiente funciona para mí para obtener la parte de "texto claro" después de || (de su ejemplo):

for /f "delims=" %%a in (.\obf_example1.txt) do set "_output=%%a"
set _output
echo testing last 10: %_output:~-10%
set "_output=%_output:*||=%"
set _output
echo %_output%

(puede que no funcione con diferentes codificaciones del archivo de texto)

(Considere Powershell: cmd tiene un límite en la longitud de la línea y puede ser abrumado fácilmente)

1
Stephan 29 abr. 2020 a las 18:48