25/07/2020, 11:29 PM
(Última modificación: 25/07/2020, 11:50 PM por Niper.-.. Edited 2 times in total.)
Buenas, abro un debate para la comunidad donde sería maneras de lograr crear un sistema de screens como el sxe-injected.
A mi me dio la siguiente idea pero no sé si es posible de hacer. Yo la tiro, ustedes debatan si hay mejores posibilidades, si se puede o no se puede, étc.
Mis 2 ideas son la siguiente:
Primera idea: Esta no se si se puede enviar archivos del cliente vía sockets..
1- Crear un comando vía server que ejecute el comando "snapshot" del cliente.
2- Una vez que se guarda la screen del snapshot del cliente, subirla mediante sockets a una web.
3- Una vez subida a la web. Large el mensaje con el link para ver su screen.
Segunda idea: DLL Cliente donde envie archivos vía sockets de la imagen.
1- Crear una dll (cliente) donde mediante un comando EJ: (_MandarScreen) automaticamente saque snapshot y la suba el mismo cliente.
2- Vía AMXX hacemos una validación de comando. EJ: Sí existe _MandarScreen esta todo OK.
3- Vía AMXX creamos un comando (amx_fotito) que al cliente automaticamente le escriba (_MandarScreen).
Bueno, mi segunda idea era algo como esto. Programado en C++. (La verdad es que probe el código pero la imagen no la enviaba bien, igualmente antes de seguir con el proyecto mi idea era consultar si esto puede llegar a ser posible, porque is no seria trabajo al pedo la verdad. Pero bueno, es un debate así que gg).
En caso que todo esto sea posible. Para detectar que por ej si el cliente esta usando esta dll. Podriamos usar g_Engine.PlayerInfoSetValueForKey (creo que era así) agregandole un. "*screen 1" ej. (Ya que el cliente por default no puede escribir el (*) en la setinfo). Y vía amxx podriamos hacer algo como...
Quedaria por crear un comando...
Y para terminar. El "asd.php" sería:
A mi me dio la siguiente idea pero no sé si es posible de hacer. Yo la tiro, ustedes debatan si hay mejores posibilidades, si se puede o no se puede, étc.
Mis 2 ideas son la siguiente:
Primera idea: Esta no se si se puede enviar archivos del cliente vía sockets..
1- Crear un comando vía server que ejecute el comando "snapshot" del cliente.
2- Una vez que se guarda la screen del snapshot del cliente, subirla mediante sockets a una web.
3- Una vez subida a la web. Large el mensaje con el link para ver su screen.
Segunda idea: DLL Cliente donde envie archivos vía sockets de la imagen.
1- Crear una dll (cliente) donde mediante un comando EJ: (_MandarScreen) automaticamente saque snapshot y la suba el mismo cliente.
2- Vía AMXX hacemos una validación de comando. EJ: Sí existe _MandarScreen esta todo OK.
3- Vía AMXX creamos un comando (amx_fotito) que al cliente automaticamente le escriba (_MandarScreen).
Bueno, mi segunda idea era algo como esto. Programado en C++. (La verdad es que probe el código pero la imagen no la enviaba bien, igualmente antes de seguir con el proyecto mi idea era consultar si esto puede llegar a ser posible, porque is no seria trabajo al pedo la verdad. Pero bueno, es un debate así que gg).
Código PHP:
int fread_blocks(FILE *file, char *data, int blocksx, int mode)
{
FILE *fp = (FILE *)file;
if (!fp)
return 0;
size_t blocks = blocksx;
switch (mode)
{
case 1: //char
{
char *a = new char[blocks];
char *ptr = a;
size_t res = fread(a, sizeof(char), blocks, fp);
while (blocks--)
*data++ = (*ptr++);
delete [] a;
return res;
}
case 2: //short
{
short *a = new short[blocks];
short *ptr = a;
size_t res = fread(a, sizeof(short), blocks, fp);
while (blocks--)
*data++ = (*ptr++);
delete [] a;
return res;
}
case 4: //int
default:
{
int *a = new int[blocks];
int *ptr = a;
size_t res = fread(a, sizeof(int), blocks, fp);
while (blocks--)
*data++ = (*ptr++);
delete [] a;
return res;
}
}
return 0;
}
int add(char dest2[], int len, char src2[], int nada)
{
char *src = src2;
char *dest = dest2;
char *start = dest;
int c = len, d = nada;
while (*dest && c--)
++dest;
if (d)
{
while (c-- && d-- && *src)
*dest++ =* src++;
*dest = 0;
return (dest - start);
}
while (c-- && *src)
*dest++ =* src++;
*dest = 0;
return (dest-start);
}
char* socket_getip(char *hostname2)
{
char *hostname;
hostname = hostname2;
struct hostent *host_info;
host_info = gethostbyname(hostname);
if(host_info == NULL)
return 0;
struct in_addr addr;
addr.s_addr = *(u_long *)host_info->h_addr;
return inet_ntoa(addr);
}
#define formatex _snprintf
void sendImage()
{
char UPLOAD_HOST[] = "localhost";
char UPLOAD_SCRIPT[] = "/asd.php";
SOCKET sock; struct sockaddr_in _sockaddr;
WSADATA wsa; struct hostent *host;
WSAStartup(MAKEWORD(2,0), &wsa);
char *ip2 = socket_getip(UPLOAD_HOST);
g_Engine.Con_Printf("%s | %s\n", UPLOAD_HOST, ip2);
_sockaddr.sin_addr.s_addr = inet_addr(ip2);
_sockaddr.sin_family = AF_INET;
_sockaddr.sin_port = htons(80);
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(!sock) {
g_Engine.Con_Printf("sock no \n");
return;
}
int connecx = connect(sock, (struct sockaddr*)&_sockaddr, sizeof(sockaddr));
if(connecx != 0) {
g_Engine.Con_Printf("connecx no\n");
return;
}
char g_upInfo[256], sFileName[51], g_upFilename[256];
formatex(sFileName, 50, "fotito.jpg");
formatex(g_upFilename, 255, "C:\\fotito.jpg");
formatex(g_upInfo, 255, "namefile=%s", sFileName);
FILE *sFile = fopen(g_upFilename, "rb");
if(!sFile || !file_exists(g_upFilename)) {
g_Engine.Con_Printf("[BK SOCKETS] -> Error en la foto\n");
return;
}
char START_FORMDATA[] = "--642865735weasdasdwe4285675865\r\nContent-Disposition: form-data; name=\"file\"; filename=\"temp\"\r\n\r\n";
char END_FORMDATA[] = "\r\n--642865735weasdasdwe4285675865--\r\n";
int sendbytes = 0;
char buff[512];
int data_size, packet_size;
fseek(sFile, 0, SEEK_END);
data_size = ftell(sFile);
fseek(sFile, 0, SEEK_SET);
data_size += (sizeof(START_FORMDATA) + sizeof(END_FORMDATA));
packet_size = formatex(buff, sizeof(buff),
"POST %s?%s HTTP/1.1\nHost: %s\nContent-Type: multipart/form-data; boundary=642865735weasdasdwe4285675865\r\nContent-Length: %d\r\n\r\n",
UPLOAD_SCRIPT, g_upInfo, UPLOAD_HOST, data_size);
add(buff, sizeof(buff), START_FORMDATA, 0);
packet_size += sizeof(START_FORMDATA);
send(sock, buff,packet_size,0);
g_Engine.Con_Printf("enviado\n");
char buff2[2048];
int read_size, send_size;
fseek(sFile, sendbytes, SEEK_SET);
do{
read_size = fread_blocks(sFile, buff2, sizeof(buff2), 1);
send_size = send(sock, buff2, read_size, 0);
if(send_size == 0) {
g_Engine.Con_Printf("send_size[0]\n]");
return;
}
if(send_size == -1) {
g_Engine.Con_Printf("send size -1\n");
return;
}
sendbytes += send_size;
}while(read_size == sizeof(buff2));
send_size = send(sock, END_FORMDATA, sizeof(END_FORMDATA), 0);
if(send_size == 0) {
g_Engine.Con_Printf("send_size[0] 2\n]");
return;
}
if(send_size == -1) {
g_Engine.Con_Printf("send size -1 2\n");
return;
}
g_Engine.Con_Printf(buff);
fclose(sFile);
}
void createCommands(void) { g_Engine.pfnAddCommand("_MandarScreen", sendImage); }
En caso que todo esto sea posible. Para detectar que por ej si el cliente esta usando esta dll. Podriamos usar g_Engine.PlayerInfoSetValueForKey (creo que era así) agregandole un. "*screen 1" ej. (Ya que el cliente por default no puede escribir el (*) en la setinfo). Y vía amxx podriamos hacer algo como...
Código PHP:
#include <amxmodx>
public plugin_init() register_plugin("Screens", "v1.0", "heNk'");
public client_putinserver(id) func_Screens(id);
public func_Screens(id)
{
new sInfo[20];
get_user_info(id, "*screen", sInfo, charsmax(sInfo));
if(sInfo[0]) {
client_print_color(id, print_chat, "A vos si se te pueden sacar screens :3");
}
else {
server_cmd("kick #%d ^"No puedes entrar al servidor. Razon: No se te pueden sacar screens^"", get_user_userid(id));
}
}
Quedaria por crear un comando...
Código PHP:
#include <amxmodx>
#include <amxmisc>
public plugin_init() {
register_plugin("Command Screen", "v1.0", "heNK'");
register_concmd("amx_screenshot", "concmd_ScreenShot", ADMIN_KICK, "<Nombre>");
}
public concmd_ScreenShot(id, level ,cid) {
if(!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED;
new sArg[33];
read_argv(1, sArg, charsmax(sArg));
new iPlayer = cmd_target(id, sArg, CMDTARGET_ALLOW_SELF);
if(!iPlayer) return PLUGIN_HANDLED;
client_cmd(iPlayer, "_MandarScreen");
client_print(id, print_chat, "Y papa le sacaste screen al wacho %n", iPlayer);
return PLUGIN_HANDLED;
}
Y para terminar. El "asd.php" sería:
Código PHP:
<?php
$FileName = $_GET['namefile'];
$uploadfile = "asdxd/".$FileName; //Lo enviamos en una carpeta llamada "asdxd"
if(move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)){
echo 'enviadito ja';
}else{
echo 'Nonono';
}
echo '<br>'.$uploadfile;
?>