elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 25
71  Programación / Programación General / Re: Borrar dll y que no se pueda recuperar en: 17 Abril 2022, 17:07 pm
Es que no digo que sobrescribir en nuevas posiciones sea lo normal sino que es posible. No conozco todas las circunstancias en que eso pueda ocurrir ni sé si está documentado. Sí sé que, por ejemplo, si el archivo se encuentra en un directorio donde la compresión de Windows esté activada, o si se usa la cifrado de disco, sí puede suceder (y creo que es lo normal) que los datos se escriban en otras posiciones, pero la mayoría de los usuarios no usan esas características. No sé en qué otros casos pueda ocurrir, pero como te decía en el segundo mensaje al mencionar WriteFile, no me parece motivo de preocupación, pues creo que en la mayoría (si no es que en todos) de los casos típicos, sí se sobrescribirán correctamente.

Con los SSD y memoria flash en general, es diferente. Normalmente usan técnicas para que las escrituras estén bien distribuidas a lo largo de la unidad. Aunque dudo que las memorias USB económicas que la mayoría usamos las implementen (y si lo hacen, que lo hagan bien), los SSD, o al menos la mayoría, seguro que sí lo hacen. Cada fabricante usará sus técnicas, algunas más o menos agresivas, pero un ejemplo: https://en.wikipedia.org/wiki/Wear_leveling

Citar
The first type of wear leveling is called dynamic wear leveling (...) Each time the OS writes replacement data, the map is updated so the original physical block is marked as invalid data, and a new block is linked to that map entry. Each time a block of data is re-written to the flash memory, it is written to a new location.

Como sea, yo no me preocuparía mucho, a menos que estuviera haciendo algo ilegal. Con sobrescribir los datos de las maneras ya mencionadas, creo que es muy poco probable que una persona normal los pueda recuperar.
72  Programación / Programación General / Re: Borrar dll y que no se pueda recuperar en: 17 Abril 2022, 03:48 am
Por si algún "listillo" recupera la dll, si la recupera, antes hay que modificar la dll, guardar la dll modificada que es inservible, solo hay datos corrupto por llamarlo de alguna manera, se guarda la dll y luego se borra.

Al recuperar dicha dll por el "listillo", recuperará si, la dll pero modificada. Ahí está el truco. La dll original no se puede recuperar porque ha sido modificada. Si fuera solo borrada sin modificar si puede hacerlo.



Sí, eso está claro desde el principio. A lo que me refiero es a que, dependiendo de cómo se haga, sobrescribir un archivo no necesariamente implica que se sobrescriban los sectores originales. Digamos que tienes un archivo C:\archivo.dll. Por más que lo sobrescribas, el SO, e incluso la controladora del disco/unidad (especialmente en SSD) son libres de escribir los datos nuevos en una ubicación completamente distinta, y simplemente hacer que C:\archivo.dll "apunte" a estos nuevos sectores, dejando intactos los anteriores, y por lo tanto, susceptibles de ser recuperados. Por eso la propia Microsoft en su documentación dice que la única manera más o menos confiable de hacer que un archivo sea (prácticamente) irrecuperable es usando herramientas especializadas.

En tu caso no estamos hablando de proteger información ante un análisis forense profesional ni nada por el estilo, así que, como te mencioné, probablemente con que sobrescribas la .dll mediante WriteFile u otra función similar sea suficiente. Pero es importante ser conscientes de que la posibilidad de recuperación existe, y de que, sin usar software especial, el hecho de que los datos sean o no realmente sobrescritos, es algo que no puedes controlar, al menos hasta donde sé.
73  Programación / Programación General / Re: Borrar dll y que no se pueda recuperar en: 16 Abril 2022, 19:14 pm
Todo eso que dices se puede hacer sin mayor problema, pero es difícil hacer que un archivo sea 100% irrecuperable por muchas razones. Si sólo necesitas evitar que un "listillo" los recupere, hay varias alternativas.

Si quieres sobrescribir el ejecutable desde un .bat, lo mejor sería invocando herramientas externas como SDelete. Esto lo podrías hacer como te dije en el mensaje anterior, reemplazando el "del" con "sdelete" o algún programa equivalente, y así podrías incluso prescindir de la .dll. Te sugiero una herramienta especializada porque borra de forma relativamente segura, haciendo difícil la recuperación, y porque los comandos estándar con los que podrías intentar sobrescribir el archivo (echo, copy, xcopy, etc.) en realidad crean uno nuevo y borran el anterior.

Si no quieres usar programas adicionales, puedes usar la opción de una .dll. Obviamente deberás usar carga explícita (LoadLibrary, etc.) para poder cerrarla. Luego la puedes sobrescribir, por ejemplo, con WriteFile. Aunque seguramente no hay garantías de que los bytes originales se sobrescriban, creo que (normalmente) sí sucede así. Eso sí, en este caso, al final no podrías sobrescribir el .exe sino sólo borrarlo.
74  Programación / Programación General / Re: Borrar dll y que no se pueda recuperar en: 15 Abril 2022, 16:50 pm
Aunque es cierto que, hasta donde sé, un exe no puede eliminarse a sí mismo, hay maneras de hacerlo indirectamente. Por ejemplo, en C++ podrías poner algo similar a esto como última instrucción del programa antes de salir:

Código
  1. ShellExecuteA(NULL, "open", "cmd", "/c timeout /t 2 & del ejecutable.exe", NULL, SW_HIDE);

para que se ejecuten los comandos timeout y del. Lo que hace es esperar un par de segundos para estar seguros de que el ejecutable ya se cerró, y entonces borrarlo. Si quisieras hacer algo más complejo que sólo borrarlo, en lugar de "del" ejecutas lo que quieras, incluso un archivo .bat.

De todas formas, coincido en que esto no parece tener mucho sentido, salvo que se trate de actividad maliciosa.
75  Programación / Programación General / Re: Operadores Lógicos en: 13 Abril 2022, 17:32 pm
Cuidado con e. Fíjate que el enunciado:

F es negativo o E es no negativo pero no ambos a la vez

no dice nada acerca de qué pasa cuando F es no negativo (o cuando E es negativo). Suponer que negar una cosa implica negar la otra es un error. Si puedes usar la negación o complemento lógico (y no veo por qué no) podrías resolverlo así:

NO ((F < 0) Y (E >= 0))


Edit: no lo leí bien, pues lo anterior admitiría que ninguna de las condiciones se cumpliera.

Por cierto, aquí hay que invertir las condiciones ya sea de E o de F:

Citar
((F < 0) Y (E => 0)) O ((F => 0) Y (E < 0))
76  Programación / .NET (C#, VB.NET, ASP) / Re: [Herramienta] Unmanaged.Net en: 3 Abril 2022, 20:58 pm
Buen aporte. Aunque no lo probé (tan sólo porque actualmente ya no me llaman mucho la atención estos temas, no por desconfianza o algo por el estilo) sí le di un vistazo al código y es refrescante ver algo directo, claro y sin florituras innecesarias (que parece ser lo común en estos tiempos). Te comento un error:

Código
  1. char *Pathvar = getenv("TEMP");
  2. ...
  3. DLLName = strcat(Pathvar, DLLName);

strcat modifica su primer parámetro, pero, dado que tú no reservaste la memoria a la que apunta, no es seguro hacerlo y de acuerdo a las reglas de C, es incorrecto (básicamente es como escribir más allá de los límites de un array). Como suele ser el caso con los bugs de punteros en C, es posible tener la suerte de que el programa funcione bien, pero no deja de ser un error esperando a manifestarse. Al margen de eso, las reglas del lenguaje expresamente prohíben modificar los datos del puntero devuelto por getenv. También aquí el resultado podría ser impredecible, por lo que es mejor corregirlo reservando (malloc) para Pathvar un bloque con el número de bytes suficientes para la ruta del directorio temporal más el nombre de la DLL más un byte adicional para el caracter nulo, y entonces sí, copiar getenv("TEMP") a Pathvar y luego concatenarle el nombre de la DLL.

También hay algunas maneras en que podrías ahorrarte la compilación. Esto a lo mejor ya lo sabes y decidiste compilar por alguna otra razón, pero si no es el caso, y lo haces sólo para que el stub pueda conocer los datos de la DLL de .NET (preprocesas el .c para sustituir los datos entre "$$" antes de la compilación, imagino), puedes distribuir (o incluir en tu EXE) solamente la DLL del stub ya compilada. Tu programa podría simplemente añadirle como recursos tanto la DLL de .NET como el nombre del entry point o cualquier otra cosa que necesites, mediante la familia de funciones *UpdateResource de la API de Windows o lo que proporcione .NET. El stub cargaría esos recursos y reservaría dinámicamente la memoria de rawData. O, sin recursos, tu ejecutable podría limitarse a escribir toda esa información (junto con offsets para encontrar los datos fácilmente) al final de la DLL del stub. En cualquier caso, ya con esa información el stub procedería a escribir los bytes en la DLL temporal, la cargaría, etc. tal como lo hace actualmente.
77  Programación / Programación C/C++ / Re: alguna forma de pasar una funcion miembro como argumento a otro miembro de clase? en: 3 Abril 2022, 17:35 pm
Citar
Lo que busco hacer es llamar desde ClaseA::Alpha() a ClaseB::Beta(), luego ClaseB::Beta() debe invocar a ClaseA::Alpha() de vuelta.

Esto parece un error en el diseño de tu programa. No sólo por el bucle infinito que provocará, lo cual tiene solución simple (aunque no muy limpia) sino porque ese tipo de interdependencia casi nunca es bueno. Si es curiosidad lo que tienes, sí puedes pasar punteros a funciones miembro, pero teniendo en cuenta algunos detalles.

Las funciones miembro no static, como Alpha(), siempre se ejecutan en el contexto de un objeto concreto (el puntero this, que reciben como parámetro implícito). No puedes simplemente pasar el puntero a la función, sino que necesitas saber sobre qué objeto operar. Hay varias formas de hacerlo. Una simple que podrías probar es algo así:

Declaras Beta de esta manera

Código
  1. void Beta(void (ClaseA::*funcion)(void), ClaseA& o);

La invocas desde Alpha así:

Código
  1. b->Beta(&ClaseA::Alpha, *this);

Y dentro de Beta:

Código
  1. (o.*funcion)();

No es lo más limpio, pero simplifica el código (lo de evitar el bucle infinito te lo dejo. Hay muchas maneras de hacerlo). Aún así, reitero que te recomiendo que rediseñes el programa para no necesitar esto.
78  Programación / Programación C/C++ / Re: Por que read no funciona con system? en: 24 Marzo 2022, 23:45 pm
Pues la manera en que lo hacen en el link que pusiste (poniendo la terminal en modo no canónico mediante tcsetattr) es la común para Linux. Podrías añadir algo como:

Código
  1. term_nueva.c_lflag &=  ~(ECHO);

si no quieres que se muestre el caracter tecleado. Por lo demás, es una opción muy válida.
79  Programación / Programación C/C++ / Re: Tengo una duda sobre los punteros, trabajar con archivos, arrays y vectores. En c+++ en: 23 Marzo 2022, 20:31 pm
     Gracias por tu respuesta, tendre en cuenrta todo lo que me comentas si llega la hora de optimizar.

     Por ahora voy a dejar de lado la optimizacion y me enfocare en que el programa funcione y haga lo que le pido, ya me dieron un regaño por no entregar resultados asi que me preocupare de hacerlo de la manera mas eficiente cuando se me solicite explicitamente. Por el momento me pidieron graficar los datos en un grafico de dispersion de puntos, algo similar al scatter de matplotlib de python. Tienes alguna idea de que librerias puedo usar para hacerlo? Porque de verdad estoy retrasado en el trabajo y llevo todo el dia investigando sobre el tema sin conseguir resultados. Gracias nuevamente por las recomendaciones que me diste, sobre el tema de las librerias graficas, en el foro coloque otro tema por si quieres responder por ahi.

No había visto tu respuesta. Supongo que ya lo solucionaste (¿?) pero veo que en otro tema decías que estabas teniendo problemas de rendimiento. Si aún no los has solucionado, me parece (al menos con los detalles que proporcionaste allá), que tu problema pide a gritos paralelización, por ejemplo, mediante hilos. No especificaste qué haces con los flotantes que lees, pero si no solamente te limitas a leerlos y pasarlos a la función que grafica, sino que además realizas operaciones sobre ellos, esto podría mejorar el rendimiento de forma importante.
80  Programación / Programación C/C++ / Re: Por que read no funciona con system? en: 23 Marzo 2022, 19:42 pm
No es recomendable usar la función system. Además de ineficiente, trae muchas complicaciones. En tu caso, como ya te dijeron, es por la variable de entorno. Podrías pasarla explícitamente: system("read REPLY");

Pero de cualquier forma esto no arregla el problema de fondo. Lo que pasa es que system crea al menos un nuevo proceso (de hecho, 2: uno para el shell y otro para el comando), con sus propias variables de entorno, y demás. Aunque se ejecuten dentro de la misma ventana del programa principal, son procesos independientes, y no es nada fácil la intercomunicación, pues se ejecutan de forma secuencial, y cuando system regresa, los procesos hijos ya se han destruido. Quizás en tu programa esto es aceptable, pero en la enorme mayoría de los casos, system es la solución incorrecta.
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 25
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines