مضى على الشبكة و يوم من العطاء.

[ شرح ] تشفير وتعديل APK بلغة C

αв∂υℓℓαнαв∂υℓℓαн is verified member.

كبار شخصيات المنتدى
>:: v1p ::<

السمعة:

السلام عليكم ورحمه الله وبركاته
اخواني الاعزاء اعضاء المنتدى الكرام
اتمنى تجربة البرنامج لمعرفة ان كان هناك أخطاء..

أداة كاملة بلغة C مصممة خصيصًا لنظام Windows، تتضمن:

1. تشفير متقدم لملفات APK
2. تغيير أيقونة التطبيق
3. دمج مع APK آخر
4. حماية ضد العبث والتعديل
5. واجهة مستخدم رسومية (GUI)

# الكود الكامل للأداة (Windows API)


C:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <wincrypt.h>
#include <shlwapi.h>
#include <shlobj.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <direct.h>
#include <io.h>
#include <zip.h>

#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "shlwapi.lib")
#pragma comment(lib, "zip.lib")
#pragma comment(lib, "Comctl32.lib")

#define MAX_PATH_LEN 1024
#define BUFFER_SIZE 4096
#define AES_KEY_SIZE 256
#define RSA_KEY_SIZE 2048

typedef struct {
    WCHAR input_apk[MAX_PATH_LEN];
    WCHAR output_apk[MAX_PATH_LEN];
    WCHAR icon_path[MAX_PATH_LEN];
    WCHAR merge_apk[MAX_PATH_LEN];
    WCHAR public_key_path[MAX_PATH_LEN];
    BOOL encrypt_flag;
    BOOL change_icon_flag;
    BOOL merge_flag;
} Config;

// وظائف التشفير باستخدام Windows CryptoAPI
BOOL EncryptFileWithAES(const WCHAR *input_path, const WCHAR *output_path, BYTE *aes_key, DWORD key_size) {
    HCRYPTPROV hProv = 0;
    HCRYPTKEY hKey = 0;
    HCRYPTHASH hHash = 0;
    FILE *in_file = NULL, *out_file = NULL;
    BYTE iv[16];
    BOOL result = FALSE;

    _wfopen_s(&in_file, input_path, L"rb");
    _wfopen_s(&out_file, output_path, L"wb");
    if (!in_file || !out_file) goto cleanup;

    // توليد IV عشوائي
    if (!CryptGenRandom(hProv, sizeof(iv), iv)) goto cleanup;
    fwrite(iv, 1, sizeof(iv), out_file);

    // إعداد AES
    if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) goto cleanup;
    if (!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)) goto cleanup;
    if (!CryptHashData(hHash, aes_key, key_size, 0)) goto cleanup;
    if (!CryptDeriveKey(hProv, CALG_AES_256, hHash, CRYPT_EXPORTABLE, &hKey)) goto cleanup;
    if (!CryptSetKeyParam(hKey, KP_IV, iv, 0)) goto cleanup;

    // تشفير البيانات
    BYTE buffer[BUFFER_SIZE];
    DWORD bytes_read, bytes_encrypted;
    while ((bytes_read = fread(buffer, 1, BUFFER_SIZE, in_file)) > 0) {
        if (!CryptEncrypt(hKey, 0, feof(in_file), 0, buffer, &bytes_read, BUFFER_SIZE)) goto cleanup;
        fwrite(buffer, 1, bytes_read, out_file);
    }

    result = TRUE;

cleanup:
    if (hKey) CryptDestroyKey(hKey);
    if (hHash) CryptDestroyHash(hHash);
    if (hProv) CryptReleaseContext(hProv, 0);
    if (in_file) fclose(in_file);
    if (out_file) fclose(out_file);
    return result;
}

// وظائف التعامل مع ملفات APK
BOOL ExtractAPK(const WCHAR *apk_path, const WCHAR *extract_dir) {
    struct zip *apk_zip = zip_open(WideCharToMultiByte(CP_UTF8, 0, apk_path, -1, NULL, 0, NULL, NULL), 0, NULL);
    if (!apk_zip) return FALSE;

    CreateDirectoryW(extract_dir, NULL);

    int num_entries = zip_get_num_entries(apk_zip, 0);
    for (int i = 0; i < num_entries; i++) {
        const char *name = zip_get_name(apk_zip, i, 0);
        WCHAR wname[MAX_PATH_LEN];
        MultiByteToWideChar(CP_UTF8, 0, name, -1, wname, MAX_PATH_LEN);

        WCHAR full_path[MAX_PATH_LEN];
        PathCombineW(full_path, extract_dir, wname);

        // إنشاء الدليل إذا لزم الأمر
        WCHAR dir_path[MAX_PATH_LEN];
        wcscpy_s(dir_path, MAX_PATH_LEN, full_path);
        PathRemoveFileSpecW(dir_path);
        CreateDirectoryRecursive(dir_path);

        struct zip_file *file = zip_fopen_index(apk_zip, i, 0);
        if (!file) continue;

        FILE *out_file = NULL;
        _wfopen_s(&out_file, full_path, L"wb");
        if (!out_file) {
            zip_fclose(file);
            continue;
        }

        BYTE buffer[BUFFER_SIZE];
        int bytes_read;
        while ((bytes_read = zip_fread(file, buffer, BUFFER_SIZE)) {
            fwrite(buffer, 1, bytes_read, out_file);
        }

        fclose(out_file);
        zip_fclose(file);
    }

    zip_close(apk_zip);
    return TRUE;
}

void CreateDirectoryRecursive(const WCHAR *path) {
    WCHAR temp[MAX_PATH_LEN];
    WCHAR *p = NULL;
    size_t len;

    wcscpy_s(temp, MAX_PATH_LEN, path);
    len = wcslen(temp);
    if (temp[len - 1] == L'\\') {
        temp[len - 1] = L'\0';
    }

    for (p = temp + 1; *p; p++) {
        if (*p == L'\\') {
            *p = L'\0';
            CreateDirectoryW(temp, NULL);
            *p = L'\\';
        }
    }
    CreateDirectoryW(temp, NULL);
}

// وظائف تغيير الأيقونة
BOOL ReplaceIcon(const WCHAR *extract_dir, const WCHAR *icon_path) {
    WCHAR res_dir[MAX_PATH_LEN];
    PathCombineW(res_dir, extract_dir, L"res");

    WIN32_FIND_DATAW find_data;
    WCHAR search_path[MAX_PATH_LEN];
    PathCombineW(search_path, res_dir, L"*");
    HANDLE hFind = FindFirstFileW(search_path, &find_data);

    if (hFind == INVALID_HANDLE_VALUE) return FALSE;

    do {
        if (wcscmp(find_data.cFileName, L".") == 0 || wcscmp(find_data.cFileName, L"..") == 0)
            continue;

        if (wcsstr(find_data.cFileName, L"mipmap-") || wcsstr(find_data.cFileName, L"drawable-")) {
            WCHAR icon_dir[MAX_PATH_LEN];
            PathCombineW(icon_dir, res_dir, find_data.cFileName);

            WIN32_FIND_DATAW icon_find;
            WCHAR icon_search[MAX_PATH_LEN];
            PathCombineW(icon_search, icon_dir, L"*");
            HANDLE hIconFind = FindFirstFileW(icon_search, &icon_find);

            if (hIconFind != INVALID_HANDLE_VALUE) {
                do {
                    if (wcsstr(icon_find.cFileName, L"ic_launcher")) {
                        WCHAR old_icon[MAX_PATH_LEN];
                        PathCombineW(old_icon, icon_dir, icon_find.cFileName);
                        DeleteFileW(old_icon);

                        // نسخ الأيقونة الجديدة
                        CopyFileW(icon_path, old_icon, FALSE);
                    }
                } while (FindNextFileW(hIconFind, &icon_find));
                FindClose(hIconFind);
            }
        }
    } while (FindNextFileW(hFind, &find_data));
    FindClose(hFind);

    return TRUE;
}

// وظائف دمج APKs
BOOL MergeAPKs(const WCHAR *base_dir, const WCHAR *merge_dir) {
    WCHAR base_dex[MAX_PATH_LEN], merge_dex[MAX_PATH_LEN], merged_dex[MAX_PATH_LEN];
    PathCombineW(base_dex, base_dir, L"classes.dex");
    PathCombineW(merge_dex, merge_dir, L"classes.dex");
    PathCombineW(merged_dex, base_dir, L"classes2.dex");

    MoveFileW(merge_dex, merged_dex);
    MergeResources(base_dir, merge_dir);
    MergeManifests(base_dir, merge_dir);

    return TRUE;
}

BOOL MergeResources(const WCHAR *base_dir, const WCHAR *merge_dir) {
    WCHAR merge_res_dir[MAX_PATH_LEN];
    PathCombineW(merge_res_dir, merge_dir, L"res");

    WIN32_FIND_DATAW find_data;
    WCHAR search_path[MAX_PATH_LEN];
    PathCombineW(search_path, merge_res_dir, L"*");
    HANDLE hFind = FindFirstFileW(search_path, &find_data);

    if (hFind == INVALID_HANDLE_VALUE) return FALSE;

    do {
        if (wcscmp(find_data.cFileName, L".") == 0 || wcscmp(find_data.cFileName, L"..") == 0)
            continue;

        WCHAR src_path[MAX_PATH_LEN], dest_path[MAX_PATH_LEN];
        PathCombineW(src_path, merge_res_dir, find_data.cFileName);
        PathCombineW(dest_path, base_dir, L"res");
        PathCombineW(dest_path, dest_path, find_data.cFileName);

        CopyFileOrDirectory(src_path, dest_path);
    } while (FindNextFileW(hFind, &find_data));
    FindClose(hFind);

    return TRUE;
}

void CopyFileOrDirectory(const WCHAR *src, const WCHAR *dest) {
    DWORD attr = GetFileAttributesW(src);
    if (attr == INVALID_FILE_ATTRIBUTES) return;

    if (attr & FILE_ATTRIBUTE_DIRECTORY) {
        CreateDirectoryW(dest, NULL);
       
        WCHAR search_path[MAX_PATH_LEN];
        PathCombineW(search_path, src, L"*");
       
        WIN32_FIND_DATAW find_data;
        HANDLE hFind = FindFirstFileW(search_path, &find_data);
       
        if (hFind != INVALID_HANDLE_VALUE) {
            do {
                if (wcscmp(find_data.cFileName, L".") == 0 || wcscmp(find_data.cFileName, L"..") == 0)
                    continue;
               
                WCHAR new_src[MAX_PATH_LEN], new_dest[MAX_PATH_LEN];
                PathCombineW(new_src, src, find_data.cFileName);
                PathCombineW(new_dest, dest, find_data.cFileName);
               
                CopyFileOrDirectory(new_src, new_dest);
            } while (FindNextFileW(hFind, &find_data));
            FindClose(hFind);
        }
    } else {
        CopyFileW(src, dest, FALSE);
    }
}

// وظائف إعادة بناء APK
BOOL RebuildAPK(const WCHAR *extract_dir, const WCHAR *output_apk) {
    struct zip *apk = zip_open(WideCharToMultiByte(CP_UTF8, 0, output_apk, -1, NULL, 0, NULL, NULL), ZIP_CREATE | ZIP_TRUNCATE, NULL);
    if (!apk) return FALSE;

    AddFilesToZip(apk, extract_dir, extract_dir);
    zip_close(apk);
    return TRUE;
}

void AddFilesToZip(struct zip *apk, const WCHAR *base_dir, const WCHAR *path) {
    WCHAR search_path[MAX_PATH_LEN];
    PathCombineW(search_path, path, L"*");
   
    WIN32_FIND_DATAW find_data;
    HANDLE hFind = FindFirstFileW(search_path, &find_data);
   
    if (hFind == INVALID_HANDLE_VALUE) return;
   
    do {
        if (wcscmp(find_data.cFileName, L".") == 0 || wcscmp(find_data.cFileName, L"..") == 0)
            continue;
       
        WCHAR full_path[MAX_PATH_LEN];
        PathCombineW(full_path, path, find_data.cFileName);
       
        DWORD attr = GetFileAttributesW(full_path);
        if (attr == INVALID_FILE_ATTRIBUTES) continue;
       
        if (attr & FILE_ATTRIBUTE_DIRECTORY) {
            AddFilesToZip(apk, base_dir, full_path);
        } else {
            char zip_path[MAX_PATH_LEN];
            WideCharToMultiByte(CP_UTF8, 0, full_path + wcslen(base_dir) + 1, -1, zip_path, MAX_PATH_LEN, NULL, NULL);
           
            struct zip_source *source = zip_source_file(apk, WideCharToMultiByte(CP_UTF8, 0, full_path, -1, NULL, 0, NULL, NULL), 0, 0);
            if (source) {
                zip_add(apk, zip_path, source);
            }
        }
    } while (FindNextFileW(hFind, &find_data));
    FindClose(hFind);
}

// واجهة المستخدم الرسومية (GUI)
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    static HWND hInput, hOutput, hIcon, hMerge, hPublicKey, hEncrypt, hProcess;
    static Config config = {0};

    switch (uMsg) {
        case WM_CREATE: {
            CreateWindowW(L"STATIC", L"Input APK:", WS_VISIBLE | WS_CHILD, 10, 10, 100, 20, hwnd, NULL, NULL, NULL);
            hInput = CreateWindowW(L"EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 120, 10, 300, 20, hwnd, NULL, NULL, NULL);
           
            CreateWindowW(L"STATIC", L"Output APK:", WS_VISIBLE | WS_CHILD, 10, 40, 100, 20, hwnd, NULL, NULL, NULL);
            hOutput = CreateWindowW(L"EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 120, 40, 300, 20, hwnd, NULL, NULL, NULL);
           
            CreateWindowW(L"STATIC", L"Icon Path:", WS_VISIBLE | WS_CHILD, 10, 70, 100, 20, hwnd, NULL, NULL, NULL);
            hIcon = CreateWindowW(L"EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 120, 70, 250, 20, hwnd, NULL, NULL, NULL);
            CreateWindowW(L"BUTTON", L"...", WS_VISIBLE | WS_CHILD, 380, 70, 40, 20, hwnd, (HMENU)1, NULL, NULL);
           
            CreateWindowW(L"STATIC", L"Merge APK:", WS_VISIBLE | WS_CHILD, 10, 100, 100, 20, hwnd, NULL, NULL, NULL);
            hMerge = CreateWindowW(L"EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 120, 100, 250, 20, hwnd, NULL, NULL, NULL);
            CreateWindowW(L"BUTTON", L"...", WS_VISIBLE | WS_CHILD, 380, 100, 40, 20, hwnd, (HMENU)2, NULL, NULL);
           
            CreateWindowW(L"STATIC", L"Public Key:", WS_VISIBLE | WS_CHILD, 10, 130, 100, 20, hwnd, NULL, NULL, NULL);
            hPublicKey = CreateWindowW(L"EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 120, 130, 250, 20, hwnd, NULL, NULL, NULL);
            CreateWindowW(L"BUTTON", L"...", WS_VISIBLE | WS_CHILD, 380, 130, 40, 20, hwnd, (HMENU)3, NULL, NULL);
           
            hEncrypt = CreateWindowW(L"BUTTON", L"Enable Encryption", WS_VISIBLE | WS_CHILD | BS_CHECKBOX, 10, 160, 150, 20, hwnd, NULL, NULL, NULL);
           
            hProcess = CreateWindowW(L"BUTTON", L"Process APK", WS_VISIBLE | WS_CHILD, 180, 200, 150, 30, hwnd, (HMENU)4, NULL, NULL);
           
            break;
        }
       
        case WM_COMMAND: {
            if (LOWORD(wParam) == 1) { // زر اختيار الأيقونة
                OPENFILENAMEW ofn = {0};
                WCHAR file[MAX_PATH_LEN] = {0};
               
                ofn.lStructSize = sizeof(ofn);
                ofn.hwndOwner = hwnd;
                ofn.lpstrFile = file;
                ofn.nMaxFile = MAX_PATH_LEN;
                ofn.lpstrFilter = L"PNG Files\0*.png\0All Files\0*.*\0";
                ofn.nFilterIndex = 1;
                ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
               
                if (GetOpenFileNameW(&ofn)) {
                    SetWindowTextW(hIcon, file);
                }
            }
            else if (LOWORD(wParam) == 2) { // زر اختيار APK للدمج
                OPENFILENAMEW ofn = {0};
                WCHAR file[MAX_PATH_LEN] = {0};
               
                ofn.lStructSize = sizeof(ofn);
                ofn.hwndOwner = hwnd;
                ofn.lpstrFile = file;
                ofn.nMaxFile = MAX_PATH_LEN;
                ofn.lpstrFilter = L"APK Files\0*.apk\0All Files\0*.*\0";
                ofn.nFilterIndex = 1;
                ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
               
                if (GetOpenFileNameW(&ofn)) {
                    SetWindowTextW(hMerge, file);
                }
            }
            else if (LOWORD(wParam) == 3) { // زر اختيار مفتاح عام
                OPENFILENAMEW ofn = {0};
                WCHAR file[MAX_PATH_LEN] = {0};
               
                ofn.lStructSize = sizeof(ofn);
                ofn.hwndOwner = hwnd;
                ofn.lpstrFile = file;
                ofn.nMaxFile = MAX_PATH_LEN;
                ofn.lpstrFilter = L"PEM Files\0*.pem\0All Files\0*.*\0";
                ofn.nFilterIndex = 1;
                ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
               
                if (GetOpenFileNameW(&ofn)) {
                    SetWindowTextW(hPublicKey, file);
                }
            }
            else if (LOWORD(wParam) == 4) { // زر المعالجة
                GetWindowTextW(hInput, config.input_apk, MAX_PATH_LEN);
                GetWindowTextW(hOutput, config.output_apk, MAX_PATH_LEN);
                GetWindowTextW(hIcon, config.icon_path, MAX_PATH_LEN);
                GetWindowTextW(hMerge, config.merge_apk, MAX_PATH_LEN);
                GetWindowTextW(hPublicKey, config.public_key_path, MAX_PATH_LEN);
                config.encrypt_flag = SendMessage(hEncrypt, BM_GETCHECK, 0, 0) == BST_CHECKED;
                config.change_icon_flag = wcslen(config.icon_path) > 0;
                config.merge_flag = wcslen(config.merge_apk) > 0;
               
                if (ProcessAPK(&config)) {
                    MessageBoxW(hwnd, L"APK processed successfully!", L"Success", MB_OK);
                } else {
                    MessageBoxW(hwnd, L"Failed to process APK!", L"Error", MB_OK | MB_ICONERROR);
                }
            }
            break;
        }
       
        case WM_DESTROY: {
            PostQuitMessage(0);
            break;
        }
       
        default:
            return DefWindowProcW(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

BOOL ProcessAPK(Config *config) {
    WCHAR temp_dir[MAX_PATH_LEN];
    GetTempPathW(MAX_PATH_LEN, temp_dir);
    PathAppendW(temp_dir, L"apk_temp");
    CreateDirectoryW(temp_dir, NULL);

    WCHAR base_dir[MAX_PATH_LEN];
    PathCombineW(base_dir, temp_dir, L"base");
   
    if (!ExtractAPK(config->input_apk, base_dir)) return FALSE;

    if (config->encrypt_flag) {
        BYTE aes_key[32];
        if (!CryptGenRandom(NULL, sizeof(aes_key), aes_key)) return FALSE;
       
        WCHAR dex_path[MAX_PATH_LEN], encrypted_dex_path[MAX_PATH_LEN];
        PathCombineW(dex_path, base_dir, L"classes.dex");
        PathCombineW(encrypted_dex_path, base_dir, L"classes.dex.enc");
       
        if (!EncryptFileWithAES(dex_path, encrypted_dex_path, aes_key, sizeof(aes_key))) return FALSE;
        DeleteFileW(dex_path);
        MoveFileW(encrypted_dex_path, dex_path);
    }

    if (config->change_icon_flag) {
        if (!ReplaceIcon(base_dir, config->icon_path)) return FALSE;
    }

    if (config->merge_flag) {
        WCHAR merge_dir[MAX_PATH_LEN];
        PathCombineW(merge_dir, temp_dir, L"merge");
       
        if (!ExtractAPK(config->merge_apk, merge_dir)) return FALSE;
        if (!MergeAPKs(base_dir, merge_dir)) return FALSE;
    }

    if (!RebuildAPK(base_dir, config->output_apk)) return FALSE;

    // تنظيف الملفات المؤقتة
    RemoveDirectoryRecursive(temp_dir);
    return TRUE;
}

void RemoveDirectoryRecursive(const WCHAR *path) {
    WCHAR search_path[MAX_PATH_LEN];
    PathCombineW(search_path, path, L"*");
   
    WIN32_FIND_DATAW find_data;
    HANDLE hFind = FindFirstFileW(search_path, &find_data);
   
    if (hFind == INVALID_HANDLE_VALUE) return;
   
    do {
        if (wcscmp(find_data.cFileName, L".") == 0 || wcscmp(find_data.cFileName, L"..") == 0)
            continue;
       
        WCHAR full_path[MAX_PATH_LEN];
        PathCombineW(full_path, path, find_data.cFileName);
       
        DWORD attr = GetFileAttributesW(full_path);
        if (attr == INVALID_FILE_ATTRIBUTES) continue;
       
        if (attr & FILE_ATTRIBUTE_DIRECTORY) {
            RemoveDirectoryRecursive(full_path);
        } else {
            DeleteFileW(full_path);
        }
    } while (FindNextFileW(hFind, &find_data));
    FindClose(hFind);
   
    RemoveDirectoryW(path);
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) {
    // تسجيل فئة النافذة
    WNDCLASSW wc = {0};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = L"APKProtectorClass";
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
   
    if (!RegisterClassW(&wc)) return 0;
   
    // إنشاء النافذة
    HWND hwnd = CreateWindowW(
        L"APKProtectorClass",
        L"Advanced APK Protector",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT, 500, 300,
        NULL, NULL, hInstance, NULL
    );
   
    if (!hwnd) return 0;
   
    // حلقة الرسائل
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
   
    return (int)msg.wParam;
}


# كيفية تجميع الأداة على Windows

1. تحميل المتطلبات:
- MinGW-w64 أو Visual Studio
- libzip for Windows
- OpenSSL for Windows

2. التجميع باستخدام MinGW-w64:

Bash:
gcc -o APKProtector APKProtector.c -lzip -lcrypto -lshlwapi -lcomctl32 -mwindows

3. التجميع باستخدام Visual Studio:
- إنشاء مشروع Win32 جديد
- إضافة ملف الكود المصدري
- تكوين إعدادات الربط لإضافة المكتبات المطلوبة

# مميزات الأداة لنظام Windows

1. واجهة مستخدم رسومية سهلة الاستخدام
2. تكامل كامل مع نظام Windows (API)
3. دعم Unicode الكامل لأسماء الملفات
4. أداء عالي باستخدام Windows CryptoAPI
5. إدارة كاملة للملفات والمجلدات
6. خيارات متقدمة لتخصيص عملية الحماية

# كيفية استخدام الأداة

1. تشغيل الأداة ستظهر واجهة المستخدم الرسومية
2. تحديد ملف APK المدخل
3. تحديد ملف APK المخرج
4. اختيار أيقونة جديدة (اختياري)
5. تحديد APK إضافي للدمج (اختياري)
6. تحديد مفتاح التشفير العام (إذا تم تفعيل التشفير)
7. النقر على زر "Process APK" لبدء العملية


#للتوقيع على APK بعد التعديل، استخدم:

Bash:
jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore my-release-key.keystore output.apk alias_name


ارجو تجربة البرنامج لمعرفة ان كان هناك أخطاء لتصحيحه
 
التعديل الأخير:
شرحك لتكوين البرنامج واعطاء الكود البرنامج وشرحك ممتاز بس هناك شئ بسيط بعض الاعضاء خبراتهم قليلة كنت تكون البرنامج وتعطى الاكواد على العموم لك الشكر والعرفان ولما ارجع من العمل هكون او اجمع البرنامج
 
شرحك لتكوين البرنامج واعطاء الكود البرنامج وشرحك ممتاز بس هناك شئ بسيط بعض الاعضاء خبراتهم قليلة كنت تكون البرنامج وتعطى الاكواد على العموم لك الشكر والعرفان ولما ارجع من العمل هكون او اجمع البرنامج
برأيي هاذ الصح
تعرف ليش ؟

علشان اطفال الهكرز ما يعرفوا يستعملوا الكود اصلاً
وهاذ في المقتل ليهم هههه
 
السلام عليكم ورحمه الله وبركاته
اخواني الاعزاء اعضاء المنتدى الكرام
اتمنى تجربة البرنامج لمعرفة ان كان هناك أخطاء..

أداة كاملة بلغة C مصممة خصيصًا لنظام Windows، تتضمن:

1. تشفير متقدم لملفات APK
2. تغيير أيقونة التطبيق
3. دمج مع APK آخر
4. حماية ضد العبث والتعديل
5. واجهة مستخدم رسومية (GUI)

# الكود الكامل للأداة (Windows API)


C:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <wincrypt.h>
#include <shlwapi.h>
#include <shlobj.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <direct.h>
#include <io.h>
#include <zip.h>

#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "shlwapi.lib")
#pragma comment(lib, "zip.lib")
#pragma comment(lib, "Comctl32.lib")

#define MAX_PATH_LEN 1024
#define BUFFER_SIZE 4096
#define AES_KEY_SIZE 256
#define RSA_KEY_SIZE 2048

typedef struct {
    WCHAR input_apk[MAX_PATH_LEN];
    WCHAR output_apk[MAX_PATH_LEN];
    WCHAR icon_path[MAX_PATH_LEN];
    WCHAR merge_apk[MAX_PATH_LEN];
    WCHAR public_key_path[MAX_PATH_LEN];
    BOOL encrypt_flag;
    BOOL change_icon_flag;
    BOOL merge_flag;
} Config;

// وظائف التشفير باستخدام Windows CryptoAPI
BOOL EncryptFileWithAES(const WCHAR *input_path, const WCHAR *output_path, BYTE *aes_key, DWORD key_size) {
    HCRYPTPROV hProv = 0;
    HCRYPTKEY hKey = 0;
    HCRYPTHASH hHash = 0;
    FILE *in_file = NULL, *out_file = NULL;
    BYTE iv[16];
    BOOL result = FALSE;

    _wfopen_s(&in_file, input_path, L"rb");
    _wfopen_s(&out_file, output_path, L"wb");
    if (!in_file || !out_file) goto cleanup;

    // توليد IV عشوائي
    if (!CryptGenRandom(hProv, sizeof(iv), iv)) goto cleanup;
    fwrite(iv, 1, sizeof(iv), out_file);

    // إعداد AES
    if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) goto cleanup;
    if (!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)) goto cleanup;
    if (!CryptHashData(hHash, aes_key, key_size, 0)) goto cleanup;
    if (!CryptDeriveKey(hProv, CALG_AES_256, hHash, CRYPT_EXPORTABLE, &hKey)) goto cleanup;
    if (!CryptSetKeyParam(hKey, KP_IV, iv, 0)) goto cleanup;

    // تشفير البيانات
    BYTE buffer[BUFFER_SIZE];
    DWORD bytes_read, bytes_encrypted;
    while ((bytes_read = fread(buffer, 1, BUFFER_SIZE, in_file)) > 0) {
        if (!CryptEncrypt(hKey, 0, feof(in_file), 0, buffer, &bytes_read, BUFFER_SIZE)) goto cleanup;
        fwrite(buffer, 1, bytes_read, out_file);
    }

    result = TRUE;

cleanup:
    if (hKey) CryptDestroyKey(hKey);
    if (hHash) CryptDestroyHash(hHash);
    if (hProv) CryptReleaseContext(hProv, 0);
    if (in_file) fclose(in_file);
    if (out_file) fclose(out_file);
    return result;
}

// وظائف التعامل مع ملفات APK
BOOL ExtractAPK(const WCHAR *apk_path, const WCHAR *extract_dir) {
    struct zip *apk_zip = zip_open(WideCharToMultiByte(CP_UTF8, 0, apk_path, -1, NULL, 0, NULL, NULL), 0, NULL);
    if (!apk_zip) return FALSE;

    CreateDirectoryW(extract_dir, NULL);

    int num_entries = zip_get_num_entries(apk_zip, 0);
    for (int i = 0; i < num_entries; i++) {
        const char *name = zip_get_name(apk_zip, i, 0);
        WCHAR wname[MAX_PATH_LEN];
        MultiByteToWideChar(CP_UTF8, 0, name, -1, wname, MAX_PATH_LEN);

        WCHAR full_path[MAX_PATH_LEN];
        PathCombineW(full_path, extract_dir, wname);

        // إنشاء الدليل إذا لزم الأمر
        WCHAR dir_path[MAX_PATH_LEN];
        wcscpy_s(dir_path, MAX_PATH_LEN, full_path);
        PathRemoveFileSpecW(dir_path);
        CreateDirectoryRecursive(dir_path);

        struct zip_file *file = zip_fopen_index(apk_zip, i, 0);
        if (!file) continue;

        FILE *out_file = NULL;
        _wfopen_s(&out_file, full_path, L"wb");
        if (!out_file) {
            zip_fclose(file);
            continue;
        }

        BYTE buffer[BUFFER_SIZE];
        int bytes_read;
        while ((bytes_read = zip_fread(file, buffer, BUFFER_SIZE)) {
            fwrite(buffer, 1, bytes_read, out_file);
        }

        fclose(out_file);
        zip_fclose(file);
    }

    zip_close(apk_zip);
    return TRUE;
}

void CreateDirectoryRecursive(const WCHAR *path) {
    WCHAR temp[MAX_PATH_LEN];
    WCHAR *p = NULL;
    size_t len;

    wcscpy_s(temp, MAX_PATH_LEN, path);
    len = wcslen(temp);
    if (temp[len - 1] == L'\\') {
        temp[len - 1] = L'\0';
    }

    for (p = temp + 1; *p; p++) {
        if (*p == L'\\') {
            *p = L'\0';
            CreateDirectoryW(temp, NULL);
            *p = L'\\';
        }
    }
    CreateDirectoryW(temp, NULL);
}

// وظائف تغيير الأيقونة
BOOL ReplaceIcon(const WCHAR *extract_dir, const WCHAR *icon_path) {
    WCHAR res_dir[MAX_PATH_LEN];
    PathCombineW(res_dir, extract_dir, L"res");

    WIN32_FIND_DATAW find_data;
    WCHAR search_path[MAX_PATH_LEN];
    PathCombineW(search_path, res_dir, L"*");
    HANDLE hFind = FindFirstFileW(search_path, &find_data);

    if (hFind == INVALID_HANDLE_VALUE) return FALSE;

    do {
        if (wcscmp(find_data.cFileName, L".") == 0 || wcscmp(find_data.cFileName, L"..") == 0)
            continue;

        if (wcsstr(find_data.cFileName, L"mipmap-") || wcsstr(find_data.cFileName, L"drawable-")) {
            WCHAR icon_dir[MAX_PATH_LEN];
            PathCombineW(icon_dir, res_dir, find_data.cFileName);

            WIN32_FIND_DATAW icon_find;
            WCHAR icon_search[MAX_PATH_LEN];
            PathCombineW(icon_search, icon_dir, L"*");
            HANDLE hIconFind = FindFirstFileW(icon_search, &icon_find);

            if (hIconFind != INVALID_HANDLE_VALUE) {
                do {
                    if (wcsstr(icon_find.cFileName, L"ic_launcher")) {
                        WCHAR old_icon[MAX_PATH_LEN];
                        PathCombineW(old_icon, icon_dir, icon_find.cFileName);
                        DeleteFileW(old_icon);

                        // نسخ الأيقونة الجديدة
                        CopyFileW(icon_path, old_icon, FALSE);
                    }
                } while (FindNextFileW(hIconFind, &icon_find));
                FindClose(hIconFind);
            }
        }
    } while (FindNextFileW(hFind, &find_data));
    FindClose(hFind);

    return TRUE;
}

// وظائف دمج APKs
BOOL MergeAPKs(const WCHAR *base_dir, const WCHAR *merge_dir) {
    WCHAR base_dex[MAX_PATH_LEN], merge_dex[MAX_PATH_LEN], merged_dex[MAX_PATH_LEN];
    PathCombineW(base_dex, base_dir, L"classes.dex");
    PathCombineW(merge_dex, merge_dir, L"classes.dex");
    PathCombineW(merged_dex, base_dir, L"classes2.dex");

    MoveFileW(merge_dex, merged_dex);
    MergeResources(base_dir, merge_dir);
    MergeManifests(base_dir, merge_dir);

    return TRUE;
}

BOOL MergeResources(const WCHAR *base_dir, const WCHAR *merge_dir) {
    WCHAR merge_res_dir[MAX_PATH_LEN];
    PathCombineW(merge_res_dir, merge_dir, L"res");

    WIN32_FIND_DATAW find_data;
    WCHAR search_path[MAX_PATH_LEN];
    PathCombineW(search_path, merge_res_dir, L"*");
    HANDLE hFind = FindFirstFileW(search_path, &find_data);

    if (hFind == INVALID_HANDLE_VALUE) return FALSE;

    do {
        if (wcscmp(find_data.cFileName, L".") == 0 || wcscmp(find_data.cFileName, L"..") == 0)
            continue;

        WCHAR src_path[MAX_PATH_LEN], dest_path[MAX_PATH_LEN];
        PathCombineW(src_path, merge_res_dir, find_data.cFileName);
        PathCombineW(dest_path, base_dir, L"res");
        PathCombineW(dest_path, dest_path, find_data.cFileName);

        CopyFileOrDirectory(src_path, dest_path);
    } while (FindNextFileW(hFind, &find_data));
    FindClose(hFind);

    return TRUE;
}

void CopyFileOrDirectory(const WCHAR *src, const WCHAR *dest) {
    DWORD attr = GetFileAttributesW(src);
    if (attr == INVALID_FILE_ATTRIBUTES) return;

    if (attr & FILE_ATTRIBUTE_DIRECTORY) {
        CreateDirectoryW(dest, NULL);
      
        WCHAR search_path[MAX_PATH_LEN];
        PathCombineW(search_path, src, L"*");
      
        WIN32_FIND_DATAW find_data;
        HANDLE hFind = FindFirstFileW(search_path, &find_data);
      
        if (hFind != INVALID_HANDLE_VALUE) {
            do {
                if (wcscmp(find_data.cFileName, L".") == 0 || wcscmp(find_data.cFileName, L"..") == 0)
                    continue;
              
                WCHAR new_src[MAX_PATH_LEN], new_dest[MAX_PATH_LEN];
                PathCombineW(new_src, src, find_data.cFileName);
                PathCombineW(new_dest, dest, find_data.cFileName);
              
                CopyFileOrDirectory(new_src, new_dest);
            } while (FindNextFileW(hFind, &find_data));
            FindClose(hFind);
        }
    } else {
        CopyFileW(src, dest, FALSE);
    }
}

// وظائف إعادة بناء APK
BOOL RebuildAPK(const WCHAR *extract_dir, const WCHAR *output_apk) {
    struct zip *apk = zip_open(WideCharToMultiByte(CP_UTF8, 0, output_apk, -1, NULL, 0, NULL, NULL), ZIP_CREATE | ZIP_TRUNCATE, NULL);
    if (!apk) return FALSE;

    AddFilesToZip(apk, extract_dir, extract_dir);
    zip_close(apk);
    return TRUE;
}

void AddFilesToZip(struct zip *apk, const WCHAR *base_dir, const WCHAR *path) {
    WCHAR search_path[MAX_PATH_LEN];
    PathCombineW(search_path, path, L"*");
  
    WIN32_FIND_DATAW find_data;
    HANDLE hFind = FindFirstFileW(search_path, &find_data);
  
    if (hFind == INVALID_HANDLE_VALUE) return;
  
    do {
        if (wcscmp(find_data.cFileName, L".") == 0 || wcscmp(find_data.cFileName, L"..") == 0)
            continue;
      
        WCHAR full_path[MAX_PATH_LEN];
        PathCombineW(full_path, path, find_data.cFileName);
      
        DWORD attr = GetFileAttributesW(full_path);
        if (attr == INVALID_FILE_ATTRIBUTES) continue;
      
        if (attr & FILE_ATTRIBUTE_DIRECTORY) {
            AddFilesToZip(apk, base_dir, full_path);
        } else {
            char zip_path[MAX_PATH_LEN];
            WideCharToMultiByte(CP_UTF8, 0, full_path + wcslen(base_dir) + 1, -1, zip_path, MAX_PATH_LEN, NULL, NULL);
          
            struct zip_source *source = zip_source_file(apk, WideCharToMultiByte(CP_UTF8, 0, full_path, -1, NULL, 0, NULL, NULL), 0, 0);
            if (source) {
                zip_add(apk, zip_path, source);
            }
        }
    } while (FindNextFileW(hFind, &find_data));
    FindClose(hFind);
}

// واجهة المستخدم الرسومية (GUI)
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    static HWND hInput, hOutput, hIcon, hMerge, hPublicKey, hEncrypt, hProcess;
    static Config config = {0};

    switch (uMsg) {
        case WM_CREATE: {
            CreateWindowW(L"STATIC", L"Input APK:", WS_VISIBLE | WS_CHILD, 10, 10, 100, 20, hwnd, NULL, NULL, NULL);
            hInput = CreateWindowW(L"EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 120, 10, 300, 20, hwnd, NULL, NULL, NULL);
          
            CreateWindowW(L"STATIC", L"Output APK:", WS_VISIBLE | WS_CHILD, 10, 40, 100, 20, hwnd, NULL, NULL, NULL);
            hOutput = CreateWindowW(L"EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 120, 40, 300, 20, hwnd, NULL, NULL, NULL);
          
            CreateWindowW(L"STATIC", L"Icon Path:", WS_VISIBLE | WS_CHILD, 10, 70, 100, 20, hwnd, NULL, NULL, NULL);
            hIcon = CreateWindowW(L"EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 120, 70, 250, 20, hwnd, NULL, NULL, NULL);
            CreateWindowW(L"BUTTON", L"...", WS_VISIBLE | WS_CHILD, 380, 70, 40, 20, hwnd, (HMENU)1, NULL, NULL);
          
            CreateWindowW(L"STATIC", L"Merge APK:", WS_VISIBLE | WS_CHILD, 10, 100, 100, 20, hwnd, NULL, NULL, NULL);
            hMerge = CreateWindowW(L"EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 120, 100, 250, 20, hwnd, NULL, NULL, NULL);
            CreateWindowW(L"BUTTON", L"...", WS_VISIBLE | WS_CHILD, 380, 100, 40, 20, hwnd, (HMENU)2, NULL, NULL);
          
            CreateWindowW(L"STATIC", L"Public Key:", WS_VISIBLE | WS_CHILD, 10, 130, 100, 20, hwnd, NULL, NULL, NULL);
            hPublicKey = CreateWindowW(L"EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, 120, 130, 250, 20, hwnd, NULL, NULL, NULL);
            CreateWindowW(L"BUTTON", L"...", WS_VISIBLE | WS_CHILD, 380, 130, 40, 20, hwnd, (HMENU)3, NULL, NULL);
          
            hEncrypt = CreateWindowW(L"BUTTON", L"Enable Encryption", WS_VISIBLE | WS_CHILD | BS_CHECKBOX, 10, 160, 150, 20, hwnd, NULL, NULL, NULL);
          
            hProcess = CreateWindowW(L"BUTTON", L"Process APK", WS_VISIBLE | WS_CHILD, 180, 200, 150, 30, hwnd, (HMENU)4, NULL, NULL);
          
            break;
        }
      
        case WM_COMMAND: {
            if (LOWORD(wParam) == 1) { // زر اختيار الأيقونة
                OPENFILENAMEW ofn = {0};
                WCHAR file[MAX_PATH_LEN] = {0};
              
                ofn.lStructSize = sizeof(ofn);
                ofn.hwndOwner = hwnd;
                ofn.lpstrFile = file;
                ofn.nMaxFile = MAX_PATH_LEN;
                ofn.lpstrFilter = L"PNG Files\0*.png\0All Files\0*.*\0";
                ofn.nFilterIndex = 1;
                ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
              
                if (GetOpenFileNameW(&ofn)) {
                    SetWindowTextW(hIcon, file);
                }
            }
            else if (LOWORD(wParam) == 2) { // زر اختيار APK للدمج
                OPENFILENAMEW ofn = {0};
                WCHAR file[MAX_PATH_LEN] = {0};
              
                ofn.lStructSize = sizeof(ofn);
                ofn.hwndOwner = hwnd;
                ofn.lpstrFile = file;
                ofn.nMaxFile = MAX_PATH_LEN;
                ofn.lpstrFilter = L"APK Files\0*.apk\0All Files\0*.*\0";
                ofn.nFilterIndex = 1;
                ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
              
                if (GetOpenFileNameW(&ofn)) {
                    SetWindowTextW(hMerge, file);
                }
            }
            else if (LOWORD(wParam) == 3) { // زر اختيار مفتاح عام
                OPENFILENAMEW ofn = {0};
                WCHAR file[MAX_PATH_LEN] = {0};
              
                ofn.lStructSize = sizeof(ofn);
                ofn.hwndOwner = hwnd;
                ofn.lpstrFile = file;
                ofn.nMaxFile = MAX_PATH_LEN;
                ofn.lpstrFilter = L"PEM Files\0*.pem\0All Files\0*.*\0";
                ofn.nFilterIndex = 1;
                ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
              
                if (GetOpenFileNameW(&ofn)) {
                    SetWindowTextW(hPublicKey, file);
                }
            }
            else if (LOWORD(wParam) == 4) { // زر المعالجة
                GetWindowTextW(hInput, config.input_apk, MAX_PATH_LEN);
                GetWindowTextW(hOutput, config.output_apk, MAX_PATH_LEN);
                GetWindowTextW(hIcon, config.icon_path, MAX_PATH_LEN);
                GetWindowTextW(hMerge, config.merge_apk, MAX_PATH_LEN);
                GetWindowTextW(hPublicKey, config.public_key_path, MAX_PATH_LEN);
                config.encrypt_flag = SendMessage(hEncrypt, BM_GETCHECK, 0, 0) == BST_CHECKED;
                config.change_icon_flag = wcslen(config.icon_path) > 0;
                config.merge_flag = wcslen(config.merge_apk) > 0;
              
                if (ProcessAPK(&config)) {
                    MessageBoxW(hwnd, L"APK processed successfully!", L"Success", MB_OK);
                } else {
                    MessageBoxW(hwnd, L"Failed to process APK!", L"Error", MB_OK | MB_ICONERROR);
                }
            }
            break;
        }
      
        case WM_DESTROY: {
            PostQuitMessage(0);
            break;
        }
      
        default:
            return DefWindowProcW(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

BOOL ProcessAPK(Config *config) {
    WCHAR temp_dir[MAX_PATH_LEN];
    GetTempPathW(MAX_PATH_LEN, temp_dir);
    PathAppendW(temp_dir, L"apk_temp");
    CreateDirectoryW(temp_dir, NULL);

    WCHAR base_dir[MAX_PATH_LEN];
    PathCombineW(base_dir, temp_dir, L"base");
  
    if (!ExtractAPK(config->input_apk, base_dir)) return FALSE;

    if (config->encrypt_flag) {
        BYTE aes_key[32];
        if (!CryptGenRandom(NULL, sizeof(aes_key), aes_key)) return FALSE;
      
        WCHAR dex_path[MAX_PATH_LEN], encrypted_dex_path[MAX_PATH_LEN];
        PathCombineW(dex_path, base_dir, L"classes.dex");
        PathCombineW(encrypted_dex_path, base_dir, L"classes.dex.enc");
      
        if (!EncryptFileWithAES(dex_path, encrypted_dex_path, aes_key, sizeof(aes_key))) return FALSE;
        DeleteFileW(dex_path);
        MoveFileW(encrypted_dex_path, dex_path);
    }

    if (config->change_icon_flag) {
        if (!ReplaceIcon(base_dir, config->icon_path)) return FALSE;
    }

    if (config->merge_flag) {
        WCHAR merge_dir[MAX_PATH_LEN];
        PathCombineW(merge_dir, temp_dir, L"merge");
      
        if (!ExtractAPK(config->merge_apk, merge_dir)) return FALSE;
        if (!MergeAPKs(base_dir, merge_dir)) return FALSE;
    }

    if (!RebuildAPK(base_dir, config->output_apk)) return FALSE;

    // تنظيف الملفات المؤقتة
    RemoveDirectoryRecursive(temp_dir);
    return TRUE;
}

void RemoveDirectoryRecursive(const WCHAR *path) {
    WCHAR search_path[MAX_PATH_LEN];
    PathCombineW(search_path, path, L"*");
  
    WIN32_FIND_DATAW find_data;
    HANDLE hFind = FindFirstFileW(search_path, &find_data);
  
    if (hFind == INVALID_HANDLE_VALUE) return;
  
    do {
        if (wcscmp(find_data.cFileName, L".") == 0 || wcscmp(find_data.cFileName, L"..") == 0)
            continue;
      
        WCHAR full_path[MAX_PATH_LEN];
        PathCombineW(full_path, path, find_data.cFileName);
      
        DWORD attr = GetFileAttributesW(full_path);
        if (attr == INVALID_FILE_ATTRIBUTES) continue;
      
        if (attr & FILE_ATTRIBUTE_DIRECTORY) {
            RemoveDirectoryRecursive(full_path);
        } else {
            DeleteFileW(full_path);
        }
    } while (FindNextFileW(hFind, &find_data));
    FindClose(hFind);
  
    RemoveDirectoryW(path);
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) {
    // تسجيل فئة النافذة
    WNDCLASSW wc = {0};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = L"APKProtectorClass";
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  
    if (!RegisterClassW(&wc)) return 0;
  
    // إنشاء النافذة
    HWND hwnd = CreateWindowW(
        L"APKProtectorClass",
        L"Advanced APK Protector",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT, 500, 300,
        NULL, NULL, hInstance, NULL
    );
  
    if (!hwnd) return 0;
  
    // حلقة الرسائل
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
  
    return (int)msg.wParam;
}


# كيفية تجميع الأداة على Windows

1. تحميل المتطلبات:
- MinGW-w64 أو Visual Studio
- libzip for Windows
- OpenSSL for Windows

2. التجميع باستخدام MinGW-w64:

Bash:
gcc -o APKProtector APKProtector.c -lzip -lcrypto -lshlwapi -lcomctl32 -mwindows

3. التجميع باستخدام Visual Studio:
- إنشاء مشروع Win32 جديد
- إضافة ملف الكود المصدري
- تكوين إعدادات الربط لإضافة المكتبات المطلوبة

# مميزات الأداة لنظام Windows

1. واجهة مستخدم رسومية سهلة الاستخدام
2. تكامل كامل مع نظام Windows (API)
3. دعم Unicode الكامل لأسماء الملفات
4. أداء عالي باستخدام Windows CryptoAPI
5. إدارة كاملة للملفات والمجلدات
6. خيارات متقدمة لتخصيص عملية الحماية

# كيفية استخدام الأداة

1. تشغيل الأداة ستظهر واجهة المستخدم الرسومية
2. تحديد ملف APK المدخل
3. تحديد ملف APK المخرج
4. اختيار أيقونة جديدة (اختياري)
5. تحديد APK إضافي للدمج (اختياري)
6. تحديد مفتاح التشفير العام (إذا تم تفعيل التشفير)
7. النقر على زر "Process APK" لبدء العملية


#للتوقيع على APK بعد التعديل، استخدم:

Bash:
jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore my-release-key.keystore output.apk alias_name


ارجو تجربة البرنامج لمعرفة ان كان هناك أخطاء لتصحيحه
بارك الله فيك حبيبي واخوي وجزاك الله كل خير
 
برأيي هاذ الصح
تعرف ليش ؟

علشان اطفال الهكرز ما يعرفوا يستعملوا الكود اصلاً
وهاذ في المقتل ليهم هههه
والله هى فكرة وكل واحد ولية راى يعنى اكون ومش ارفع ولا انت رائيك اية
 
وضعته لاجل الشخص الذي يعشق التحدي والتعلم يكون لديه السورس كود ويقوم بقراءة حتى يكسب معرفة وفائده .. قي كيفية عمل مثل هذي البرمجيات ..

لو وضعت التكوين ما استفيد من نشر العلم ..

كما تضع هناك اشخاص يضعون لك كما تعطي تجد من يعطيك ..
الاحتفاظ بالسورس هو سبب فشل العرب ..
بصراحه لو كانت هناك اكواد وسورس نظيف لتطورنا يحتفظ بالسورس كانه محتفظ في طن ذهب ..
سورس يا اخوان اقرب مبرمج هندي محترف يعمله بدراهم بخس ..
 

آخر المشاركات

عودة
أعلى