Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Kaxperday

#561
Hola a todos no encuentro la manera de traducir este código en C++ a C#:

Código (cpp) [Seleccionar]
/* Print all the available information on the given interface */
void ifprint(pcap_if_t *d)
{
 pcap_addr_t *a;
 char ip6str[128];

 /* Name */
 printf("%s\n",d->name);

 /* Description */
 if (d->description)
   printf("\tDescription: %s\n",d->description);

 /* Loopback Address*/
 printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");

 /* IP addresses */
 for(a=d->addresses;a;a=a->next) {
   printf("\tAddress Family: #%d\n",a->addr->sa_family);
 
   switch(a->addr->sa_family)
   {
     case AF_INET:
       printf("\tAddress Family Name: AF_INET\n");
       if (a->addr)
         printf("\tAddress: %s\n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));
       if (a->netmask)
         printf("\tNetmask: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));
       if (a->broadaddr)
         printf("\tBroadcast Address: %s\n",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));
       if (a->dstaddr)
         printf("\tDestination Address: %s\n",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));
       break;

     case AF_INET6:
       printf("\tAddress Family Name: AF_INET6\n");
       if (a->addr)
         printf("\tAddress: %s\n", ip6tos(a->addr, ip6str, sizeof(ip6str)));
      break;

     default:
       printf("\tAddress Family Name: Unknown\n");
       break;
   }
 }
 printf("\n");
}


Lo que he conseguido traducir a C#:

Código (csharp) [Seleccionar]
public void GetDeviceInf(pcap_if dev)
       {
           String inf="";
           pcap_addr addresses;
           IntPtr ip6str;//char ip6str[128];
           sockaddr addr;

           inf += "Nombre de la interfaz: " + dev.name + Environment.NewLine;

           if (dev.description!=null)
            inf += "Descripción de la interfaz: " + dev.description + Environment.NewLine;

           //inf += "Loopback: " + dev.flags + PCAP_IF_LOOPBACK ",(d.flags & PCAP_IF_LOOPBACK)?"yes":"no");

           do
           {
               addresses=dev.addresses;
               addr = (sockaddr)Marshal.PtrToStructure(addresses.addr, typeof(sockaddr));
               inf += "ADDR.SA_DATA: " + addr.sa_data + Environment.NewLine;
               inf += "Address Family:: " + addr.sa_family + Environment.NewLine;
               Console.WriteLine(inf);
               switch(addr.sa_family)
               {
                   //case AF_INET:
                     //  Console.WriteLine("Address Family Name: AF_INET\n");
                   /*//if (addresses)
                       
                       Console.WriteLine("Address: %s\n",iptos((addr.sin_addr.s_addr));
                   if (addresses.netmask!=null)
                       //Console.WriteLine("Netmask: %s\n",((struct sockaddr_in *)addresses.netmask).sin_addr.s_addr);
                   if (addresses.broadaddr!=null)
                       //Console.WriteLine("Broadcast Address: %s\n",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));
                   if (addresses.dstaddr!=null)
                       Console.WriteLine("Destination Address: %s\n",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));
                   break;

                   case AF_INET6:
                       Console.WriteLine("\tAddress Family Name: AF_INET6\n");
                   if (a->addr)
                       Console.WriteLine("\tAddress: %s\n", ip6tos(a->addr, ip6str, sizeof(ip6str)));
                   break;

                   default:
                   printf("\tAddress Family Name: Unknown\n");
                   break;*/
               }
               Console.WriteLine(inf);
               inf="";
           }while(addresses.next!=IntPtr.Zero);
       }


Addresses.addr es de tipo IntPtr y apunta a una estructura de tipo pcap_addr hasta ahí todo bien pues lo igualo sin problemas. Luego el puntero addresses.addr que es un puntero de tipo IntPtr que apunta a una estructura de tipo sockaddr trato de pasarlo a estrcutura con la siguiente linea de codigo:

Código (csharp) [Seleccionar]
addr = (sockaddr)Marshal.PtrToStructure(addresses.addr, typeof(sockaddr));

Y esto falla, ¿porque se produce este error?

Pues el objetivo final no es mas que sacar datos de la interfaz de red.

He leído esto y he buscado pero no consigo superarlo, ayuda y gracias de antemano.

Edito: me estoy mirando esto a ver si me lo saben resolver o al menos lo entiendo xD y funciona.

Saludos socios.
#562
Cita de: xxxposeidonxxx en 12 Mayo 2015, 00:57 AM
@scott_  Ese archivo es indetectable Scantime, Al ejecutarlo lo detectaria seguro 100%. A no ser que tu mismo lo programases con 2 cojones.  ;)

Vaya, ¿entonces si tengo un troyano famoso, y uso la ultima versión del themida para encriptarlo "proteger el codigo", quiere eso decir que no valdria para nada la encriptacion?

Es decir, al analizarlo con el antivirus no detecta nada, pero al ejecutar ¿el programa el antivirus lo detectaría no?.

Entonces ¿como conseguir un crypter que funcione en Runtime? Acaso existen xD, ¿entonces para que valen los crypter scantime? si al ejecutarlo te lo detecta el AV.
#563
Hola Kub0x, mira he estado probando primero a recibir los paquetes con el programa C#:

Me estoy ayudando con este link: winpcap C#

Utiliza la librería winpcap de /system32/ para extraer las funciones que permiten extraer los paquetes de la red con facilidad, como usa más adelante en el código que está en el link.

Simplemente hay que importarlas así:

Código (csharp) [Seleccionar]
const int PCAP_ERRBUF_SIZE = 256;
       const int PCAP_OPENFLAG_PROMISCUOUS = 1;
       const string PCAP_SRC_IF_STRING = "rpcap://";

       [DllImport("wpcap.dll")]
       static extern IntPtr pcap_open(string source, int snaplen, int flags, int read_timeout, IntPtr auth, ref IntPtr errbuff);
       [DllImport("wpcap.dll")]
       static extern void pcap_freealldevs(IntPtr alldevs);
       //auth is a managed pointer to a structure of type pcap_rmtauth
       [DllImport("wpcap.dll")]
       static extern int pcap_findalldevs_ex(string source, IntPtr auth, ref IntPtr alldevs, ref IntPtr errbuff);
       [DllImport("wpcap.dll")]
       static extern int pcap_next_ex(IntPtr conn, ref IntPtr header, ref IntPtr packetdata);
       [DllImport("wpcap.dll")]
       static extern void pcap_close(IntPtr conn);


No da error, en caso de que no estaría en ese directorio bastaría con incluirla al proyecto, que no es el caso ya que es la librería estándar "para ver paquetes de red" de windows.

Tras leer y buscar, se recomienda usar esta librería antes que tratar de crear un programa que obtenga los paquetes, básicamente por el filtrado que hacen ya sus funciones de los mismos.

Por lo que creo que es recomendable usarla, al código le faltan algunas funciones que "nos deja como tarea".

Sin embargo, el problema de como conseguir los paquetes de red queda resuelto con la librería wpcap, y en el código ya podemos hacer uso de sus funciones. (queda saberlas llamar con los datos necesarios).

Entonces tendremos acceso a los paquetes de la red, si realizamos un MITM inyectando paquetes dhcp a los usuarios de la red, winpcap nos debería de devolver sus paquetes es allí donde los modificariamos y conectariamos con el servidor (puerta de enlace).

Pasaríamos los paquetes por el sslstrip, pasandolos a su puerto de escucha con la ejecución del comando para windows netsh.

Poco a poco, saludos.

Edito: estaría bien mirar esto ante de usar winpcap.

Os dejo el código que debería mostrarme las interfaces de red, los drivers:

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
using System.ComponentModel;

[StructLayout(LayoutKind.Sequential)]
       struct pcap_if
       {
           public IntPtr next;
           public string name; //name of device
           public string description; //description of device
           public pcap_addr addresses;
           public int flags;
       }

       [StructLayout(LayoutKind.Sequential)]
       struct pcap_addr
       {
           public IntPtr next;
           public IntPtr addr;
           public IntPtr netmask;
           public IntPtr broadaddr;
           public IntPtr dstaddr;
       }

       [StructLayout(LayoutKind.Sequential)]
       struct sockaddr
       {
           public Int16 sa_family;
           public string sa_data;
       }

       [StructLayout(LayoutKind.Sequential)]
       struct pcap_pkthdr
       {
           public timeval ts;
           public int caplen; //captured length
           public int len; //packet length
       }

       [StructLayout(LayoutKind.Sequential)]
       struct timeval
       {
           public int tv_sec;
           public int tv_usec;
       }

       //some credentials if we want to capture packets remotely
       //CAN BE VERY USEFUL!!
       [StructLayout(LayoutKind.Sequential)]
       struct pcap_rmtauth
       {
           public int type;
           public string username;
           public string password;
       };



       static class Program
       {
           const int PCAP_ERRBUF_SIZE = 256;
           const int PCAP_OPENFLAG_PROMISCUOUS = 1;
           const string PCAP_SRC_IF_STRING = "rpcap://";

           [DllImport("wpcap.dll")]
           static extern IntPtr pcap_open(string source, int snaplen, int flags, int read_timeout, IntPtr auth, ref IntPtr errbuff);
           [DllImport("wpcap.dll")]
           static extern void pcap_freealldevs(IntPtr alldevs);
           //auth is a managed pointer to a structure of type pcap_rmtauth
           [DllImport("wpcap.dll")]
           static extern int pcap_findalldevs_ex(string source, IntPtr auth, ref IntPtr alldevs, ref IntPtr errbuff);
           [DllImport("wpcap.dll")]
           static extern int pcap_next_ex(IntPtr conn, ref IntPtr header, ref IntPtr packetdata);
           [DllImport("wpcap.dll")]
           static extern void pcap_close(IntPtr conn);
           static void Main()
           {
               MessageBox.Show("hola");
               pcap_if d;
               IntPtr alldevs=IntPtr.Zero;
               //IntPtr d;
               int i=0;
               //char errbuf[PCAP_ERRBUF_SIZE];
               IntPtr errbuf = IntPtr.Zero;
   
               /* Retrieve the device list from the local machine */
               if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, IntPtr.Zero /* IntPtr.Zero auth is not needed */, ref alldevs, ref errbuf) == -1)
               {
                   Console.WriteLine("Error in pcap_findalldevs_ex: {0}\n", errbuf);
                   Application.Exit();
               }
               /* Print the list */

               while(alldevs!=IntPtr.Zero)
               {
                   d=(pcap_if)Marshal.PtrToStructure(alldevs, typeof(pcap_if));
                   MessageBox.Show(d.name + d.description);
                   Console.WriteLine("%d. %s", ++i, d.name);
                   if (d.description!="")
                       Console.WriteLine(" (%s)\n", d.description);
                   else
                       Console.WriteLine(" (No description available)\n");
                   alldevs=d.next;
               }
   
               if (i == 0)
               {
                   MessageBox.Show("\nNo interfaces found! Make sure WinPcap is installed.\n");
                   return;
               }

               /* We don't need any more the device list. Free it */
               //pcap_freealldevs(alldevs);
           }
       }


Sin embargo no sale nada, ¿alguien sabe porque? Me dice que no encuentra ninguna interfaz que me asegure de que tengo winpcap instalado??, vamos a ver yo uso wpcap.dll de windows para cargar esas funciones, porque necesitaria el winpacap? y no viene intalado?, raro.

Edito:Olvidad lo anterior, FUNCIONA!!!! necesitaba permisos de admin claro!!!!

Ya he listado los "devices", ahora a seguir con lo demás, aunque despues de esto haré un descanso, no estuvo mal por hoy.




Hola de nuevo, he conseguido listar las interfaces de red en mi caso son 4, una es la de realtek (la del wifi), es en ella donde quiero escuchar y obtener el trafico.

Pero no obtengo los paquetes con éxito, ¿qué puede fallar? Lo corrí como admin y tampoco funcionaba.

Código (csharp) [Seleccionar]
public IntPtr openDevice(pcap_if dev)
       {
           IntPtr fp = IntPtr.Zero;
           IntPtr referrbuff = IntPtr.Zero;
           fp = pcap_open(dev.name, 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, IntPtr.Zero, ref referrbuff);
           if (fp == IntPtr.Zero)
           {
               return IntPtr.Zero;
           }
           return fp;
       }

       public void startCapture(IntPtr fp, AsyncOperation async)
       {
           try
           {
               IntPtr hdr = IntPtr.Zero;
               IntPtr data = IntPtr.Zero;
               int res;
               pcap_pkthdr header = new pcap_pkthdr();
               while ((res = pcap_next_ex(fp, ref hdr, ref data)) >= 0)
               {
                   if (res == 0)
                       continue;
                   header = (pcap_pkthdr)Marshal.PtrToStructure(hdr, typeof(pcap_pkthdr));
                   Console.WriteLine(data.ToString());
                   //asynchronously calls the function OnPacketCaptured with the arguments: data (the captured data) and header.caplen (the length of the data).
                   async.Post(
                       delegate(object e)
                       {
                           object[] inputdata = (object[])e;
                           //OnPacketCapturedEvent((int)inputdata[0], PtrToString((IntPtr)inputdata[1], (int)inputdata[0]));
                       },
                       (object)(new object[] { header.caplen, data }
                   ));
                   hdr = IntPtr.Zero;
                   data = IntPtr.Zero;
               }
           }
           catch (Exception ex)
           {
               pcap_close(fp);
           }
       }


pcap_next_ex(fp, ref hdr, ref data)) siempre devuelve 0, porque no recojo paquetes?

SI FUNCIONA!!!!!! TENGO LOS PAQUETES! ERA OTRA INTERFAZ!!




Hola de nuevo, ya tengo los paquetes, abri wireshark y vi que el wifi correspondia al primer servicio de windows y no al de realtek como pensaba (donde no pasaban paquetes).

Este es la funcion que muestra los paquetes:

Código (csharp) [Seleccionar]
public void startCapture(IntPtr fp, AsyncOperation async)
       {
           try
           {
               String paquete;
               IntPtr hdr = IntPtr.Zero;
               IntPtr data = IntPtr.Zero;
               int res;
               pcap_pkthdr header = new pcap_pkthdr();
               pcap_addr datos = new pcap_addr();
               while ((res = pcap_next_ex(fp, ref hdr, ref data)) >= 0)
               {
                   paquete = "";
                   if (res == 0)
                       continue;
                   header = (pcap_pkthdr)Marshal.PtrToStructure(hdr, typeof(pcap_pkthdr));
                   paquete += "tamaño paquete teorico: " + header.len + Environment.NewLine;
                   paquete += "tamaño paquete practico: " + header.caplen + Environment.NewLine;
                   paquete += "tiempo recojer paquete (s): " + header.ts.tv_sec + Environment.NewLine;
                   paquete += "tiempo recojer paquete (us): " + header.ts.tv_usec + Environment.NewLine;
                   string merda = (string)Marshal.PtrToStringAnsi(data, header.caplen);
                   paquete += "datos del paquete: " + merda + Environment.NewLine + Environment.NewLine;
                   Console.WriteLine(paquete);
                   hdr = IntPtr.Zero;
                   data = IntPtr.Zero;
               }
           }
           catch { }
           /*try
           {
               IntPtr hdr = IntPtr.Zero;
               IntPtr data = IntPtr.Zero;
               int res;
               pcap_pkthdr header = new pcap_pkthdr();
               pcap_addr datos = new pcap_addr();
               while ((res = pcap_next_ex(fp, ref hdr, ref data)) >= 0)
               {
                   if (res == 0)
                       continue;

                   header = (pcap_pkthdr)Marshal.PtrToStructure(hdr, typeof(pcap_pkthdr));
                   datos = (pcap_addr)Marshal.PtrToStructure(data, typeof(pcap_addr));
                   Console.WriteLine(datos.addr.ToString());
                   Console.WriteLine(datos.broadaddr.ToString());
                   Console.WriteLine(datos.netmask.ToString());
                   //asynchronously calls the function OnPacketCaptured with the arguments: data (the captured data) and header.caplen (the length of the data).
                   async.Post(
                       delegate(object e)
                       {
                           object[] inputdata = (object[])e;
                           //OnPacketCapturedEvent((int)inputdata[0], PtrToString((IntPtr)inputdata[1], (int)inputdata[0]));
                       },
                       (object)(new object[] { header.caplen, data }
                   ));
                   hdr = IntPtr.Zero;
                   data = IntPtr.Zero;
               }
           }
           catch (Exception ex)
           {
               pcap_close(fp);
           }*/
       }


Ahora debería de filtrarlos ... el programa parece mostrarme todos los paquetes de la interfaz, alguien sabe como obtener solo los de un puerto?? de todas formas voy progresando gracias a los tutoriales de winpcap y un poco de google (para pasar de c++ a c#).

Esto es un ejemplo de los paquetes que recojo, como estos aparecen decenas diría por segundo si produzco el trafico:

Citar
tamaño paquete teorico: 85
tamaño paquete practico: 85
tiempo recojer paquete (s): 1431904982
tiempo recojer paquete (us): 800752
datos del paquete: <G◄6~↔p↑<Ã' E  G♫*  ?◄¾´À¨☺♥Ø:ÓáÍ«☺» 3µ+♀Ó∟wôóT,Þ♂Ü∟♫õuðTûSFÊ
B7wë6;~▼s8◄eò ♦àæ¦Í↨­É


tamaño paquete teorico: 1392
tamaño paquete practico: 1392
tiempo recojer paquete (s): 1431904982
tiempo recojer paquete (us): 883303
b}òü╬×Q024♣­AÖL½TÛG<G◄6~↔p↑<Ã' E ♣b.¸  ?◄~þÀ¨☺♥Ø:ÓîÍ$☺»♣NCã
ÈÓ☻  ☺ ♦CHLO↨   PAD '☺  SNI ¤☺  STK Þ☺  VER ☺  CCS ò☺  NONC↕☻  MSPC▬☻  AEAD→☻
UAID0☻  SCID@☻  TCIDD☻  PDMDH☻  ICSLL☻  PUBSl☻  SCLSp☻  KEXSt☻  COPTt☻  CCRTO☻
CGST?☻  IRTT"☻  CETV8♥  CFCW<♥  SFCW@♥  ----------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-----------------------------------------clients1.google.com<G♥ÇD↔å¾♣¥¶u♂´?ì↕½¢3
ÁÈ.CDJ1L<þ^ÒÖjQ0249YùS@÷þÉ{&éçä\qÿUY"ÖQZ¤ï,-7ªÚ
<a°?«®§hBFÊ☻XÃ{L►bd   AESGm Chrome/42.0.2311.1529'%/?ß¿[ãmª¥÷P\£    X509▲   DIæ♥
¡bu¶ßÀèsë♂-äªå"çltBgÚÄ?H☺   C255'N^»8ò☺²↕GýMB'@♂{?©®yëQBIC?õ  B╬éOÈ?╬-r'¶'Ü->¾2½
J?c½,'Õ↔âo~µåç'O/N♠K·▼@Ç'Oò÷Òsd©¸ƒRÈj×ùplaÓ%à}Ã/ní¥♀cÀ/♀å¤-tXË↔¥TIø6♠íu±ÍL6Þh"¨"
Q<kBÚ\~$e♀w"ö'³¡",±°↕`-}♦º▼Å%<s©ÙÍÛé½Ql¬¸§Ds½1⌂?i*>á→TT?Êûä%
hXO_X      

::) ::) ::)

Ahora a ver si alguien me ayuda me gustaría filtrarlos, luego quiero hacer ARP POISONING para obtener los paquetes de los demas ordenadores de la red, tengo que saber cuales filtrar y cuales enciar al sslstrip y hacer la inet.

Poco a poco, pero con mas ayuda y codigo sería mas facil (aunque bien que aprendo asi..) no hay mal que por bien no venga, compartir es vivir!!

Saludos!!
#564
Hola a todos, quizas me podáis guiar un poco con todo esto. Mis propósitos son educacionales, si quisiera usar SSLstrip con malas intenciones, no sería necesario crear este tema.

Me gustaría poderlo emular en windows, para ello usaré C#, el comando netsh para pasar los datos al puerto donde escuchará el sslstrip, y me he descargado el winpcap, lo que quiero es redirigir los paquetes a el puerto donde escucha el sslstrip, ¿como puedo hacerlo? También tenia pensado usar py2exe para pasar el programa de Moxie a .exe, y no complicarme la vida intentandolo emular en C#, ¿nadie lo ha intentado antes? ¿alguna idea?

Según me ponga a ello iré subiendo actualizaciones y mis avances.

Si alguien quiere ayudarme a alcanzar este objetivo y poderlo compilar, le invito a comentar en este tema, a ver si entre todos podemos hacer algo, yo cuando me ponga a ello actualizaré mis avances en este tema.

Saludos.

#565
Lo primero muchas gracias a elektro, eres un autentico crack de veras gracias por la ayuda.

Lo de settigs es muy atractivo, pero no deja de ser un archivo mas junto a la app, y si podria cargar variables y ponerlas en binario etc, pero ya en el punto que estaba no iba a cambiarlo todo la proxima vez lo tendré en cuenta.

Ya tengo la clase archivo con metodos get y set que me escriben en el archivo los datos en cada apartado guiándose por los indexof(), y cadenas separadoras. Y funciona bien.

Tengo que meter un control de errores para comprobar si el archivo esta corrompido y restaurarlo en el caso.

En lo del método setAutentificación, puedo decirte que en clase siempre hemos usado Camel-Case para Java y de ahí lo lleve a C#, aunque no siempre me han gustado

Y por lo de indexof() muchas gracias, pensaba que ambos eran para la primera coincidencia, y que uno se situaba al principio de la coincidencia indexof y otro al inal lastindexof.

Ahora lo que me pasa no se si tendrá remedio, quiero trabajar sobre un solo archivo, tengo que abrirlo leerlo y sobreescribirlo, es decir leer su contenido y escribir lo que quiero cambiar en el solo. No sé si es posible, antes hice 2 archivos distintos un StreamWriter y un StreamReader.

Código (csharp) [Seleccionar]
private FileStream lectura;
       private FileStream escritura;

       public Archivo(String directorio)
       {
           this.lectura = new FileStream(directorio + "\\app1.txt", FileMode.Open);
           this.escritura = new FileStream(directorio + "\\app2.txt", FileMode.Create);
       }


¿No se puede hacer de alguna manera con un solo FileStream leer el archivo y a la vez escribirlo?
Antes de nada voy a probar a hacerlo con un solo FileStream archivo.

Creo que así es posible, fuera StreamReader y StreamWriter. Un solo FileStream tiene métodos de lectura y escritura, creo que ahí estará lo que busco, de todas formas trabaja con bytes y me costará un poco, si creéis que hay otro camino mejor no estaría demás comentarlo.

Gracias estoy con ello socios.

Edito: Luego tengo pensado  cifrar todo el archivo y puede quedar bastante elegante. Saludos.

Ya encontre la respuesta :
http://stackoverflow.com/questions/605685/how-to-both-read-and-write-a-file-in-c-sharp

Se olvidan de FileStream, StreamReader y StreamWriter, una maravilla. Aunque habrá que controlar excepciones. gg.

Código (csharp) [Seleccionar]
static void Main(string[] args)
   {
       var text = File.ReadAllText(@"C:\words.txt");
       File.WriteAllText(@"C:\words.txt", text + "DERP");
   }


Simplemente leo todo en una cadena, la modifico y escribo la nueva cadena en el mismo archivo sobreescribiendo los datos anteriores :))

Por cierto elektro tienes razón con los metodos, pues los metodos por defecto de las clases salen ambas palabras comenando en mayuscula.

He avanzado bastante con el proyecto, asi da gusto, espero seguir dándole caña, siempre mejorando.
#566
Hola elektro me ha parecido muy interesante tu respuesta. No sabía que se podía hacer eso, probaré a ver que tal se me da eso del settings, aunque no se si se podrá hacer para variables string muy largas, porque tengo pensado meter links de temas de foros en esas variables y pueden ser cientos de lineas incluso quizas miles. Es por eso que ahí ya dudo para eso, aunque para user/pas me parece mejor asi, la idea mia tambien era que si lo hago todo en un archivo encriptarlo todo.

Cuando vuelva con esto te comento, gracias.

Edito: Me costará comprenderlo, siempre hablas con un nivel experto y yo que soy un aprendiz me lleva tiempo analizar tus códigos, pero me ayudas mucho aun asi.

Aquí vuelvo, la idea tuya es bastante buena pero ya te dije que trabajo con cadenas muy largas y prefiero crear un archivo con toda la información y encriptarlo.

Tengo esto:

Código (csharp) [Seleccionar]
public bool setAutentificacion(String certificado)
       {
           int index;
           bool correcto = false;;
           StreamWriter escritor = new StreamWriter(escritura);//intentar escritura sobremismo archivo
           StreamReader lector = new StreamReader(lectura);
           String contenido = lector.ReadToEnd();
           lector.Close();
           if (contenido.Contains(vector[0].ToString()))
           {
               index = contenido.IndexOf(vector[0].ToString());
               if (index != -1)
               {
                   correcto = true;
                   contenido = contenido.Insert(contenido.IndexOf(vector[0].ToString()), certificado);
                   int entrada = contenido.LastIndexOf(vector[0].ToString()+certificado);
                   int salida = contenido.IndexOf(vector[1].ToString());
                   contenido.Remove(entrada, salida-entrada);
                   escritor.Write(contenido);
               }
               else
               {
                   correcto = false;
               }
           }
           else
               correcto = false;
           return correcto;
       }


Ahí ando, aunque como alguien toque el archivo adios, aunque pondre algo para comprobar si esta corrupto y que genere uno nuevo y ya esta, aunque sera dificil.

Me parece buena manera con los indexof() imaginaba que ahi estaria la clave ahora que se usarlos ya veo que es buen camino para identifica lugares intracatenarios.

Por cierto, no entiendo porque esto:

Código (csharp) [Seleccionar]
contenido.LastIndexOf(vector[0].ToString())

Vale cero cuando la cadena contenido contiene:

CitarENTRADA_AUTH_SALIDA
ENTRADA_LOGI_SALIDA
ENTRADA_CALC_SALIDA
ENTRADA_HOLA_SALIDA
ENTRADA_MENS_SALIDA
ENTRADA_ENTR_SALIDA
ENTRADA_PARA_SALIDA
#567
Hola a todos ustedes, miren estoy usando un archivo en el que guardo los datos de una aplicación todos sus datos (login, información, autentificacion, entradas, configuración...), cada tipo de datos está delimitado por una linea única en el archivo.

Cuando se realiza un cambio sobre algo por pequeño que sea debo sobreescribir el archivo. Antes trabajaba con un archivo para cada cosa, pero no era el camino correcto tener 10 archivos a la vez.

Es por ello que decidí meterlo en uno y poder lineas delimitadoras, que se crean de la siguiente manera, y se generan al llamar al constructor de archivo:

Código (csharp) [Seleccionar]
public Archivo(String directorio)
        {
            this.lectura = new FileStream(directorio + "\\app.dat", FileMode.Open);
            this.escritura = new FileStream(directorio + "\\app.tmp", FileMode.Create);
            vector.Add("ENTRADA_AUTH_SALIDA");//0
            vector.Add("ENTRADA_LOGI_SALIDA");//1
            vector.Add("ENTRADA_CALC_SALIDA");//2
            vector.Add("ENTRADA_HOLA_SALIDA");//3
            vector.Add("ENTRADA_MENS_SALIDA");//4
            vector.Add("ENTRADA_ENTR_SALIDA");//5
            vector.Add("ENTRADA_PARA_SALIDA");//6
        }


Bien, ahora para sobreescribir el archivo llega mi duda. El archivo app.dat tiene los datos actuales, lo que pense era en leer todo su contenido y pasarlo a una cadena. Y sobreescibir esa cadena añadiendo los datos en el campo correspondiente y escribirla en otro archivo de salida.

Pero creo que es preferible utilizar solo un archivo ya puestos.

Es por ello que quiero leer el contenido del archivo, luego modificar la cadena leída y sobreescribirla en el mismo archivo. He probado esto:

Código (csharp) [Seleccionar]
public bool setAutentificacion(String certificado)
        {
            StreamWriter escritor = new StreamWriter(escritura);//intentar escritura sobremismo archivo
            StreamReader lector = new StreamReader(lectura);
            String contenido = lector.ReadToEnd();
            lector.Close();
            if(contenido.Contains(vector[0].ToString())
            {
                contenido.//aqui quiero saber el puntero de la cadena donde esta esa subcadena
            }
}


Podría hacerlo leyendo caracter a caracter hasta los \n o NewLine, pero tardaría mucho para archivos grandes. Además de la forma de hacerlo no me parece adecuada asi, no se si se podría hacer con algún metodo el identificar la subcadena y obtener el indice donde se encuentra para poder cortarla alli e introducir los nuevos datos.

Luego tengo también la duda del archivo, si puedo hacer de un FileStream un StreamReader y un StreamWriter a la vez, para leerlo todo con uno, y luego usar el otro para sobreescribir el mismo, no se si será posible.

Saludos y gracias por estar ahí de veras. Podéis contar conmigo.
#568
Hola elektro gracias por la respuesta, de acuerdo seré más preciso.

En FileStream no hay un método llamado StartupPath, el problema es quiero abrir un directorio que tenga el handle pasado al constructor apra crear la clase archivo. Al recibir esa direccion (handle), el constructor creará un archivo de tipo FileStream y quiero que lo inicialice con esa dirección, funcionaría sin problemas si dejase usar GetCurrentDirectory(), pero no es el caso solo deja usarlo en el form, no en las demás clases, es por ello que se lo paso como argumento al constructor para que trate de crear el archivo con esa dirección, alguna idea?

No puedo ser mas preciso, no es que me de errores mira, entre otras cosas probé con estas soluciones:

Código (csharp) [Seleccionar]
public void inicializacion()
        {
            datos.Handle(directorio + "\\app.dat");
        }


pero no funcionaba porue Handle esta en deshuso, ponía una excepción de system security pero no me funcionaba tampoco.

Escribiendo esto parezco haber solucionado el problema:

Código (csharp) [Seleccionar]
this.datos=new FileStream(directorio,FileMode.OpenOrCreate);

Poniendo eso en el constructor es suficiente (meme de beso(que lo pongan ya))

saludos, gracias por responder de todas formas. Ahora ya tengo el archivo inicializado para el directorio y pudo trabajar sobre el
#569
Código (csharp) [Seleccionar]
public partial class Interfaz : Form
   {
       private string directorio = Directory.GetCurrentDirectory();
       private volatile Archivo configuracion = new Archivo(directorio);
...}




Código (csharp) [Seleccionar]
class Archivo
   {
       private String directorio;
       private FileStream datos;// = new FileStream(); //directorio + "\\app.dat", FileMode.Create

       public Archivo(String directorio)
       {
           //Aqui quiero inicialiar el archivo con el handle del directorio que le paso al consructor pero no me deja.
       }


Para obtener el directorio actual debo de hacerlo desde el form o obtengo error, entonces, lo que hago es sacar el directorio del archivo en el form y pasarsele al constructor, entonces quiero que me cree un archivo con ese handle, además quiero que ese archivo poder usarle para lectura y escritura, sin crear más.

Es decir meter un Streamwriter y Streamreader.

Alguna ayuda pls, la idea es crear una clase de archivo para trabajar con un solo archivo con todo, y no crear 20 de estos, necesito el handle del directorio actual y poder escribir en el y leerle con un solo FileStream, ¿es posible? ayuda y gracias gente.
#570
Bueno gracias por las respuestas, si antes lo tenia asi con el EndOfStream, estuve cambiando bastante código y pensé que era fallo del bucle por eso lo cambie.

Mirad!!! Me pasa una cosa muy curiosa, como pensaba que el fallo que os voy a explicar ahora era tema del StreamReader hice el siguiente code:

Código (csharp) [Seleccionar]

FileStream readerTemas = new FileStream(directorio + "\\Temas.txt", FileMode.Open, FileAccess.Read);
           FileStream readerRespuestas = new FileStream(directorio + "\\Respuestas.txt", FileMode.Open, FileAccess.Read);do
               {
                   Random r = new Random(DateTime.Now.Millisecond);
                   URL = ""; respuesta = "";
                   do
                   {
                       caracter = (char)(byte)readerTemas.ReadByte();
                       if (caracter == '\n')
                           break;
                       URL += caracter;
                   } while (caracter != '\n');
                   do
                   {
                       caracter = (char)(byte)readerRespuestas.ReadByte();
                       if (caracter == '\n')
                           break;
                       respuesta += caracter;
                   } while (caracter != '\n');

                   MessageBox.Show("url: " + URL + Environment.NewLine + "respuesta:" + respuesta);


Y bien es gracioso, funciona igual que lo hacía el streamreader, con el fallo igual.

La primera ejecucion muestra la primera linea de cada archivo, la segunda muestra nada en URL, y en respuesta si hay contenido, la tercera muestra contenido en URL (el de la segunda linea) y hay contenido en respuesta respectivo a su iteracion del bucle, la cuarta URL no muestra nada, y respuesta sigue mostrandose de acuerdo a su linea.

En fin Temas.txt recoge el contenido de la linea solo en las interacciones impares, y en Respuestas.txt funciona con normalidad WTF, este error lo llevaba arrastrando de tiempo y no sabia como solucionarlo, por eso deje de lado el StreamReader y pase a filestream pero ocurre igual.

El archivo solo se usa ahi para lectura, las demas veces que se una se cierra bien y su contenido con lineas con urls, pero al leer solo le lee en impares no se porque  :rolleyes: :rolleyes: :-*

Con el streamreader para solucionar ese error hice lo siguiente:

Código (csharp) [Seleccionar]

while (!reader.EndOfStream)
                {
                    j++;
                    if (j % 2 == 0)
                    {
                        linea = reader.ReadLine();
                        linea = reader.ReadLine();
                    }
                    else
                    {
                        linea = reader.ReadLine();
                    }
                    mensaje = readel.ReadLine();
                    if (linea == "" || mensaje == "")
                    {
                        break;
                    }


edito: en lo de C# que es dificil y tal que es mejor C, pues que queréis que os diga mirad como se abre un fichero en C 2 lineas, y en C# tambien 2 lineas pero otros tantas opciones y instancias para abrirlos que lo hacen muy engorroso todo, si fuese C no tendría estos probleas, puede que sea por desconocimiento, pero eso de using, buffers.... en fin para mi lo hace muy complejo aunque mas completo.

Gracias por estar ayudando gente <3