Nuevas NORMAS para el foro
Bienvenido(a),
Visitante
. Favor de
ingresar
o
registrarse
.
¿Perdiste tu
email de activación?
- Julio 24, 2008, 05:57:41
Boton Buscar
Visita:
Articulos
-
Juegos Gratis
-
Da Foros
Comunidad Underground Hispana
|
Programacion
|
Programación
|
Carbide C/C#/C++
| Tema:
"aqui les" presento a Aquiles
0 Usuarios y 1 Visitante están viendo este tema.
« anterior
próximo »
Páginas:
[
1
]
Autor
Tema: "aqui les" presento a Aquiles (Leído 168 veces)
Ni0
Gran Colaborador
Desconectado
Mensajes: 1357
Ni0-inside the source code
"aqui les" presento a Aquiles
«
en:
ſeptiembre 10, 2007, 06:45:36 »
Hola, bueh, hice esto, son 470 lineas, lei en no se donde que se calculan 15 bugs por cada 100 lineas, digamos que lo baje a 10 por cada 100 linas
, asi que tienen que encontrar los 47 bugs, jeje
bueh, para que se den una idea, todos los programas que no estan en una lista los va a finalizar, y los que esten en otra lista, los va a finalizar pero le dice al usuario que no esta permitido el uso del programa (...)
la imagen de fondo es todo azul, con aquiles al costado y a la derecha hay unos dibujitos de unos botones... igual se van a dar cuenta cuando lean los comentarios.
Les presento a..... Aquiles:
Código:
#include <windows.h>
#include <Tlhelp32.h>
#include <Ni0.h>//funciones y constantes creados por mi
//SI, NO, y la funcion comparch(char *a) que comprueba si existe el archivo(devuelve SI o NO)
//esta claro que si existe devuelve SI, y sino NO xD
//si no ponen a Ni0.h en la carpeta donde estan las demas cabezeras, tienen que poner #include "Ni0.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "aquiles.h"//define a MATAR como 1 y a ACTUALIZAR como 2, tambien esta
//la cadena informacion
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
HWND hwnd;
FILE* f;
FILE* s;
int estado = NO;//si hay un carte de que no esta permitido el uso del programa
//se pone en SI
char permitidos[2000][100];
char nopermitidos[2000][100];
char szClassName[ ] = "WindowsApp";
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
MSG messages;
WNDCLASSEX wincl;
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (hThisInstance, "icon");
wincl.hIconSm = LoadIcon (hThisInstance, "icon");
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
if (!RegisterClassEx (&wincl))
return 0;
hwnd = CreateWindowEx (
0,
szClassName,
"Aquiles",
WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_CAPTION
,
CW_USEDEFAULT,
CW_USEDEFAULT,
500,
380,
HWND_DESKTOP,
NULL,
hThisInstance,
NULL
);
if(MatarProceso("Aquiles.exe", NO) == SI){//se fija si ya se habia ejecutado, si es asi, se muestra la ventana
cargar();
ShowWindow (hwnd, nFunsterStil);
}
else{
cargar();
SetTimer(hwnd, MATAR, 100, NULL);
SetTimer(hwnd, ACTUALIZAR, 1000, NULL);
}
InvalidateRect(hwnd, NULL, TRUE);
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int i = 0;
int ihwnd = 0;
HDC hDC;
HDC hcDC;
PAINTSTRUCT ps;
static HINSTANCE hInstance;
static HBITMAP fondo;
switch (message)
{
case WM_CREATE:
hInstance = ((LPCREATESTRUCT) lParam)->hInstance;
InvalidateRect(hwnd, NULL, TRUE);
fondo = LoadBitmap(hInstance, "fondo");
break;
case WM_PAINT:
hDC = BeginPaint(hwnd, &ps);
hcDC = CreateCompatibleDC(hDC);
SelectObject(hcDC, fondo);
BitBlt(hDC, 0, 0, 500, 350, hcDC, 0, 0, SRCCOPY);
ReleaseDC(hwnd, hcDC);
DeleteDC(hcDC);
break;
case WM_LBUTTONUP:
if(dentro_cuadrado(302, 27, 402, 67, LOWORD(lParam), HIWORD(lParam)) == SI){//si se hizo click sobre lista permitidos
MessageBox(hwnd, informacion, "leer", MB_OK | MB_ICONEXCLAMATION);
system("notepad permitidos.lst");
sacariguales();
}
else if(dentro_cuadrado(304, 89, 404, 129, LOWORD(lParam), HIWORD(lParam)) == SI){//si se hizo click sobre lista no permitidos
MessageBox(hwnd, informacion, "leer", MB_OK | MB_ICONEXCLAMATION);
system("notepad nopermi.lst");
sacariguales();
}
else if(dentro_cuadrado(305, 146, 405, 186, LOWORD(lParam), HIWORD(lParam)) == SI){//si se hizo click sobre actualizar
MatarProceso(NULL, ACTUALIZAR);
save();
MessageBox(hwnd, "Se ha actualizado la lista", "Listo!", MB_OK);
}
else if(dentro_cuadrado(304, 205, 404, 245, LOWORD(lParam), HIWORD(lParam)) == SI){//si se hizo click sobre ocultar
PostQuitMessage(0);
}
else if(dentro_cuadrado(305, 262, 405, 302, LOWORD(lParam), HIWORD(lParam)) == SI){//si se hizo click sobre salir
s = fopen("salir", "w");
fclose(s);
PostQuitMessage(0);
}
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
case WM_TIMER:
if(wParam == MATAR){
while(i < 2000){
if(nopermitidos[i][0] != '\0')//mata los no permitidos
MatarProceso(nopermitidos[i], SI);
i++;
}
i = 0;
MatarProceso(NULL, MATAR);//mata los que no esten en la lista de permitidoss
}
else if(wParam == ACTUALIZAR){
cargar();
if(comparch("salir") == SI){
remove("salir");
PostQuitMessage(0);
}
}
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
MatarProceso(const char *kill_proc, int a)
{
char mensage[100];
int ia = 0, i = 0, ic = 0, c = 0, m = 0;
char error[100];
int actualiza = 0;
HANDLE laris;
PROCESSENTRY32 process;
process.dwSize = sizeof(PROCESSENTRY32);
void* photo = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Process32First(photo, &process);
switch(a)
{
case MATAR:
while(photo != NULL)
{
Process32Next(photo, &process);
laris = OpenProcess(PROCESS_TERMINATE, FALSE, process.th32ProcessID);
while(i < 2000){
if(!strcmpi(process.szExeFile, permitidos[i]))
break;
else if(!strcmpi(process.szExeFile, "notepad.exe"))//todos estos los toma como permitidos
break;
else if(!strcmpi(process.szExeFile, "Aquiles.exe"))
break;
else if(!strcmpi(process.szExeFile, "rundll32.exe"))
break;
else if(!strcmpi(process.szExeFile, "MSConfig.exe"))
break;
else if(!strcmpi(process.szExeFile, "rundll32.exe"))
break;
else if(!strcmpi(process.szExeFile, "regedit.exe"))
break;
else if(!strcmpi(process.szExeFile, "explorer.exe"))
break;
else if(!strcmpi(process.szExeFile, "taskmgr.exe"))
break;
else
i++;
if(permitidos[i - 1][0] == '\0')
ic++;
}
if(i == 2000 && ic < 2000){//si comprobo y ninguno era igual (i = 2000) y por lo menos habia uno en la lista
TerminateProcess(laris, 0);
break;//tendria que funcionar mejor
}
if(GetLastError() == ERROR_NO_MORE_FILES)
break;
i = 0;
ic = 0;
CloseHandle(laris);
}
break;
case SI:
case NO:
while(photo != NULL)
{
Process32Next(photo, &process);
laris = OpenProcess(PROCESS_TERMINATE, FALSE, process.th32ProcessID);
if(!strcmpi(process.szExeFile, kill_proc))
{
switch(a)
{
case SI:
TerminateProcess(laris, 0);
if(estado == NO){//si no se habia puesto el cartel...
estado = SI;
sprintf(mensage, "no esta permitido el uso del programa %s", kill_proc);
MessageBox(hwnd, mensage, "Aviso", MB_OK | MB_ICONEXCLAMATION);
estado = NO;
}//esto es para que no se llene la pantalla de cartelitos hasta
//que aquiles logre finalizar el proceso
break;
case NO://esto es para cuando se comprueba si ya se estaba ejecutando
c++;
if(c > 2)
return SI;
}
}
if(GetLastError() == ERROR_NO_MORE_FILES)
{
break;
}
CloseHandle(laris);
}
break;
case ACTUALIZAR:
while(photo != NULL)
{
Process32Next(photo, &process);
laris = OpenProcess(PROCESS_TERMINATE, FALSE, process.th32ProcessID);
while(ia < 2000){//busca un espacio vacio
if(permitidos[ia][0] != '\0')
ia++;
else
goto copy;
}
MessageBox(hwnd, "ERROR: se lleno la lista de permitidos", "error", MB_OK | MB_ICONERROR);
return;
copy:
strncpy(permitidos[ia], process.szExeFile, 100);//copia en el espacio vacio
while(m < 100){//para saver si el archivo es demaciado largo
if(permitidos[ia][m] != '\0'){
m++;
}
else
break;
}
if(m == 100){
permitidos[ia][0] = '\0';
sprintf(error, "ERROR: el archivo %s es demasiado largo (mas de 100 caracteres)", process.szExeFile);
MessageBox(hwnd, error, "ERROR", MB_OK | MB_ICONERROR);
}
else{//si ya estaba en la lista borra uno de los 2
while(actualiza < 2000){
if(actualiza == ia)
actualiza++;
if(!strcmpi(permitidos[actualiza], permitidos[ia]))
permitidos[actualiza][0] = '\0';
actualiza++;
}
actualiza = 0;
}
if(GetLastError() == ERROR_NO_MORE_FILES)
break;
m = 0;
CloseHandle(laris);
}
break;
}
return NO;
}
cargar(void)
{
char c;
int i = 0, m = 0, flagp = NO, flagn = NO;
if((f = fopen("nopermi.lst", "r")) == NULL){//si no esta crea uno y pone en 0 la lista
f = fopen("nopermi.lst", "w");
fclose(f);
while(i < 2000){
nopermitidos[i][0] = '\0';
i++;
}
flagn = SI;
}
fclose(f);
i = 0;
if((f = fopen("permitidos.lst", "r")) == NULL){//lo mismo
f = fopen("permitidos.lst", "w");
fclose(f);
while(i < 2000){
permitidos[i][0] = '\0';
i++;
}
flagp = SI;
}
fclose(f);
i = 0;
if(flagp == NO){
f = fopen("permitidos.lst", "r");
i = 0;
m = 0;
while((c = getc(f)) != EOF){
if(m >= 99 && c != '\n'){//si el archivo tiene mas de 100 caracteres...
if(m == 99){
MessageBox(hwnd, "Error en el archivo\nun archivo de la lista de permitidos es demasiado largo\ncompruebe que todos tienen meno de 100 caracteres", "Advertencia", MB_OK | MB_ICONEXCLAMATION);
m++;
}//cuando el archivo es lago, no hace nada hasta que no encuentre \n
}
else if(m == 100 && c == '\n'){//cuando lo encuentra...
m = 0;
permitidos[i][m] = '\0';
i++;
if(i == 2000)
break;
}
else if(c == '\n'){
permitidos[i][m] = '\0';
i++;
m = 0;
if(i == 2000)
break;
}
else{
permitidos[i][m] = c;
m++;
}
}
fclose(f);
}
if(permitidos[i][m] != '\0' && m != 0){//si no termina con nueva linea...
if(m == 100)
permitidos[i][0] = '\0';
if(m < 99)
permitidos[i][m + 1] = '\0';
else
permitidos[i][99] = '\0';
}
i++;
while(i < 2000){
permitidos[i][0] = '\0';
i++;
}
i = 0;
m = 0;
if(flagn == NO){
f = fopen("nopermi.lst", "r");
i = 0;
m = 0;
while((c = getc(f)) != EOF){
if(m >= 99 && c != '\n'){
if(m == 99){
MessageBox(hwnd, "Error en el archivo\nun archivo de la lista de nopermitidos es demasiado largo\ncompruebe que todos tienen meno de 20 caracteres", "Advertencia", MB_OK | MB_ICONEXCLAMATION);
m++;
}
}
else if(m == 100 && c == '\n'){
m = 0;
nopermitidos[i][m] == '\0';
i++;
if(i == 2000){
break;
}
}
else if(c == '\n'){
nopermitidos[i][m] = '\0';
i++;
m = 0;
if(i == 2000)
break;
}
else{
nopermitidos[i][m] = c;
m++;
}
}
fclose(f);
}
if(nopermitidos[i][m] != '\0' && m != 0){
if(m == 100)
nopermitidos[i][0] = '\0';
if(m < 99)
nopermitidos[i][m + 1] = '\0';
else
nopermitidos[i][99] = '\0';
}
i++;
while(i < 2000){
nopermitidos[i][0] = '\0';
i++;
}
}
save(void)
{
int i = 0, m = 0;
if((f = fopen("permitidos.lst", "a")) == NULL){
MessageBox(hwnd, "ERROR: El archivo permitidos.lst no se puede abrir para escritura", "ERROR", MB_OK | MB_ICONERROR);
return;
}
fclose(f);
f = fopen("permitidos.lst", "w");
while(i < 2000){
while(m < 100){
if(permitidos[i][m] == '\0'){
putc('\n', f);
break;
}
else
putc(permitidos[i][m], f);
m++;
}
i++;
m = 0;
}
fclose(f);
if((f = fopen("nopermi.lst", "a")) == NULL){
MessageBox(hwnd, "ERROR: El archivo nopermi.lst no se puede abrir para escritura", "ERROR", MB_OK | MB_ICONERROR);
return;
}
i = m = 0;
fclose(f);
f = fopen("nopermi.lst", "w");
while(i < 2000){
while(m < 100){
if(nopermitidos[i][m] == '\0'){
putc('\n', f);
break;
}
else
putc(nopermitidos[i][m], f);
m++;
}
i++;
m = 0;
}
fclose(f);
}
sacariguales(void)//si esta dos veces el mismo programa saca uno
{
int i = 0, d = 0;;
cargar();
while(i < 2000){
while(d < 2000){
if(!strcmpi(permitidos[i], permitidos[d]) && d != i)
permitidos[d][0] = '\0';
d++;
}
d = 0;
i++;
}
i = d = 0;
while(i < 2000){
while(d < 2000){
if(!strcmpi(nopermitidos[i], nopermitidos[d]) && d != i)
nopermitidos[d][0] = '\0';
d++;
}
d = 0;
i++;
}
save();
}
«
Última modificación: ſeptiembre 22, 2007, 04:35:48 por Ni0
»
En línea
Inside The Source Code
Linux Registred User #460377
Ni0
Gran Colaborador
Desconectado
Mensajes: 1357
Ni0-inside the source code
Re: "aqui les" presento a Aquiles
«
Respuesta #1 en:
ſeptiembre 10, 2007, 01:00:30 »
otra cosa, cuando postie estaba apurado, no se si se entiende bien, pero explico de nuevo que hace
Código:
Aquiles -> por Ni0
Aquiles es un programa que va a cerrar todos
los programas que no esten en una lista y va
a cerrar los programas que esten en una lista
informandole al usuario que no se permite el
uso del programa (como cuando no queremos que
otas personas usen un programa, entonces no lo
va a poder usar y se le va a informar que no
esta permitido el uso)
Con solo ejecutar una vez el programa, este ya
esta actuando, pero para poder ver o cambiar
las listas o cerrar el programa, hay que ejecutarlo
otra vez.
Si apretamos sobre Lista de admitidos, vamos a ver
un cartel que nos recomienda que pongamos en Buscar
actualmente en ejecucion, esto lo que hace es agregar
automaticamente a la lista de permitidos los programas
que actualmente se esten ejecutando (lo recomiendo
porque es rapido, asi no tenemos que ir al administrador
de procesos y copiar proceso por proceso, porque recueden
que los que no esten en la lista se van a cerrar, y puede
que se cierre el windows), cuando termine, pongan
"lista de admitidos", se les va a abrir el block de notas
y van a ver algunos programas ya escritos (por lo hecho
anteriormente), los programas que agregemos los tenemos
que escribir con la extencion y en un espacio vacio,
por ejemplo si tenemos esto:
////////////////////////estas barritas no aparecen
explorer.exe
iexplore.exe
svchost.exe
...
///////////////////////
los que agregemos los vamos a poner aca:
///////////////////////
explorer.exe
notepad.exe (<----aca)
iexplore.exe
svchost.exe
...
///////////
si no tenemos espacio libre, hay que ponerlo al final
de la lista, poniendo una nueva linea, si tenemos esto:
//////////////
...
explorer.exe
iexplore.exe
svchost.exe
///////////// aca se acaba y parra arriba no hay mas lugar
hay que hacer esto:
///////////////////
...
explorer.exe
iexplore.exe
svchost.exe
//////////// pusimos una nueva linea precionando enter
y despues ponemos en ese lugar el programa
//////////////////
...
explorer.exe
iexplore.exe
svchost.exe
notepad.exe
/////////////////
asegurence que despues de los programas no haya espacios,
tiene que pasar directamente a la otra linea.
Traten de que haya una linea vacia al final, que nos quede
asi:
//////////////////
...
explorer.exe
iexplore.exe
svchost.exe
notepad.exe
/////////////////
es para mas seguridad, no es necesario, pero por si las dudas.
En resumen, los programas tienen que estar escritos con su
extencio y tienen que terminar e ir directamente a la nueva
linea.
Despues de modificar, guardan (archivo->guardar) y cierran el
bloc de notas.
Lo mismo se aplica a la lista de no permitidos, solo que esta
no se auto completa.
Si ponen ocultar solo se va a ir la ventanita, pero el programa
se sigue ejecutando, osea, va a seguir cerrando los programas...
Si ponen Salir, ahi si que se cierra todo por completo y el
programa va a dejar de actuar.
Si en la lista de permitidos no hay nada, la funcion de cerrar
los que no esten en esa lista, no va a actuar (sino se cerraria
todo)
Recuerden esto: LOS PROGRAMAS QUE NO ESTEN EN LA LISTA DE PERMITIDOS
SE VAN A CERRAR, por lo que si no agregan, por ejemplo, al paint y
aquiles esta actuando, no lo van a poder abrir.
Yo lo recomiendo usar asi:
se conectan a internet, abren lo que usan mientas estan conectados
a internet, abren el aquiles, lo vuelven a abrir para ver la ventana
y ponene buscar actualmente en ejecucion, ocultan y entonces mientras
esten conectados a internet, ningun programa "extraño" se va a
ejecutar, cuando se desconectan de internet abren de nuevo el aquiles
y ponen salir.
Tambien pueden dejar la lista de permitidos vacia y en la de no
permitidos ponen programas que no quieren que las otras personas
que usan la pc usen los programas (por ejemplo, supongamos que
tenemos un hijo, este se porta mal y como penitencia no le dejamos
usar los juegos de la pc, pero para asegurarnos de que no lo haga
ponen en la lista de no permitidos los juegos, tienen que poner
el nombre del ejecutable con su extencion (.exe), despues ocultan
y listo).
En línea
Inside The Source Code
Linux Registred User #460377
Ni0
Gran Colaborador
Desconectado
Mensajes: 1357
Ni0-inside the source code
Re: "aqui les" presento a Aquiles
«
Respuesta #2 en:
ſeptiembre 16, 2007, 04:20:24 »
aca les dejo el programa con el codigo fuente:
http://www.badongo.com/file/4384762
salu2
En línea
Inside The Source Code
Linux Registred User #460377
Ni0
Gran Colaborador
Desconectado
Mensajes: 1357
Ni0-inside the source code
Re: "aqui les" presento a Aquiles
«
Respuesta #3 en:
ſeptiembre 22, 2007, 04:42:20 »
agrege un break para que funcione mejor, ya que aveces cuando un proceso es "caprichoso" porque tarda en finalizarce o porque se quiere volver a ejecutar, aquiles quedaba en el bucle, y si intentamos cerrarlo (por el medio adecuado, abriendo de nuevo el aquiles y poniendo salir), no se cerraba, porque se quedaba en el bucle, creo que con el break va a solucionarse, es cuestion de probar el aquiles...
Código:
break;
else if(!strcmpi(process.szExeFile, "taskmgr.exe"))
break;
else
i++;
if(permitidos[i - 1][0] == '\0')
ic++;
}
if(i == 2000 && ic < 2000){//si comprobo y ninguno era igual (i = 2000) y por lo menos habia uno en la lista
TerminateProcess(laris, 0);
break;//tendria que funcionar mejor, esto es lo que agrege
}
salu2!
En línea
Inside The Source Code
Linux Registred User #460377
Páginas:
[
1
]
Comunidad Underground Hispana
|
Programacion
|
Programación
|
Carbide C/C#/C++
| Tema:
"aqui les" presento a Aquiles
« anterior
próximo »
Ir a:
Por favor selecciona un destino:
-----------------------------
Foros De Consulta General
-----------------------------
=> Novedades
=> Dudas, Comentarios Y Sugerencias
=> Top 100
=> Off-Topic
=> Revista E-Zine
===> Noticias
-----------------------------
Phreaking, Hacking y Seguridad
-----------------------------
=> HacK GeneraL
===> Ingenieria Inversa
===> Encriptacion, Cryptografia
===> TV HACK
===> Seguridad
===> Cursos y Ezines
=====> Trucos Internet
=====> Textos Hacking
===> Defacing
=> Phreaking
===> Moviles
=> Bug y Exploits
-----------------------------
Hack Novato
-----------------------------
=> Hack para newbies
=> Todo Messenger
=> Troyanos y virus
-----------------------------
Sistemas Operativos
-----------------------------
=> Windows y otros sistemas operativos no libres
===> Problemas Tecnicos Windows
=> Sistemas operativos libres.
===> GNU/Linux
===> Manuales y Tutoriales
===> Descargas
-----------------------------
Programacion
-----------------------------
=> Programación
===> Programación Basica
===> Otros Lenguajes
===> Visual Basic y Net
===> ASM
===> Programacion Shell
===> Perl
===> Carbide C/C#/C++
===> Batch
===> SQL
=> Programacion para webmasters
===> Consultas
===> Php
===> Html
===> Java - Java Script
===> Php Nuke
===> Scripts Pre-Fabricados
===> Mysql
===> CSS y Diseño Web
-----------------------------
Artes Graficas
-----------------------------
=> Diseño Grafico
===> Battle Arts
===> Flash
===> Tutoriales
===> Galerías
===> Software
-----------------------------
Area Tecnica
-----------------------------
=> Networking & Wireless
=> Overclocking, Refrigeracion y demas
=> Hardware
===> Cursos Y manuales
=> Electronica Y Robotica
-----------------------------
Programas
-----------------------------
=> Software
===> Configuraciones de software
===> Pedidos de software
=> Cracks & Serialz
=> P2p, Bittorrent, Elinks
-----------------------------
Multimedia Y Divx
-----------------------------
=> Juegos PC Y Consolas
===> Dudas ayudas y comentarios de juegos
===> Pedidos de juegos
=> Mp3
=> Multimedia
=> Peliculas Divx
-----------------------------
Entretenimiento Y sitios de interes
-----------------------------
=> Juegos, Humor y Adultos. (Diversión)
===> Adultos
=> Paginas Webs Recomendadas
=> Videos
Powered by SMF 1.1.5
|
SMF © 2006-2007, Simple Machines LLC
Loading...