Rayanoos.ir 1396/12/28 00:55

در این پست به بررسی چگونگی اجرای برنامه بدون نمایان شدن صفحه CMD میپردازیم بدون آنکه برنامه گرافیکی بنویسیم.

اگر میخواهید برنامه ای بنویسید که بعد از اجرا شدن مخفی شود و کاربر اثری از آن احساس نکند این پست را مطالعه کنید.

شاید بخواهید یک Windows Service بنویسید.





ما در ویندوز میتوانیم با استفاده از دستورات ویژوال بیسیک اسکریپت که با پسوند VBS ذخیره می شوند، برخی دستورات را به صورت مخفی اجرا کنیم.
به عنوان مثال با دستور زیر میتوان یک برنامه را به طور کاملا مخفی اجرا کرد:
Set oShell = CreateObject("WScript.Shell")
        oShell.Run """<FILE_NAME>""", 0

حال ما در این برنامه از این ویژگی برای اجرای مخفی برنامه و نمایان نشدن صفحه کنسول استفاده کرده ایم.
به این صورت که تابعی را جهت ایجاد فایل VBS در کنار فایل اجرایی برنامه ، سپس اجرای فایل VBS و در آخر حذف فایل VBS ایجاد کرده ایم.
اگر دقت کنید تابع مذکور یک پارامتر را به عنوان آدرس فایل برنامه می گیرد که آن را از طریق پوینتر های کاراکتری در تابع اصلی در اختیارش گذاشتیم.

جهت مشاهده نحوه گرفتن آدرس فایل با پوینتر های کاراکتری اینجا کلیک کنید

اگر مبتدی هستید و کد ها را متوجه نمی شوید. میتوانید تنها با کپی کردن تابع مذکور و صدا کردن آن اینکار را انجام دهید.
اما اگر میخواهید از روند اجرای برنامه و کد ها مطلع شوید آخر همین پست را مطالعه کنید.

دانلود سورس کد با لینک مستقیم | Main.c

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define vbsname "20902349200.vbs" // vps نام فایل

int checkvbs(char* fileaddress);

int main(int a, char ** fileaddress)
{
    if( checkvbs(fileaddress[0]) ) return(0);
/*
    {
        Your Codes
    {
*/
    return 0;
}

int checkvbs(char* fileaddress) // vbs تابع ساخت و اجرای فایل
{
    char command[256];

    system("title www.Rayanoos.ir");

    FILE* f;
    if ( !(f=fopen(vbsname, "r")) ) //  بررسی وجود فایل
    {
        fclose(f);
        f= fopen( vbsname, "w");
        fprintf(f,"Set oShell = CreateObject(\"WScript.Shell\")\noShell.Run \"\"\"%s\"\"\", 0",fileaddress);
        fclose(f);
        Sleep(100);                   // وقفه جهت اطمینان از ایجاد شدن فایل
        strcpy(command,"\"");
        strcat(command,vbsname);
        strcat(command,"\"");
        system(command);
        return 1;
    }
    else
    {
        //  حذف فایل
        fclose(f);

        strcpy(command,"del ");
        strcat(command,vbsname);
        strcat(command," /f /s /q");
        system(command);

        return(0);
    }
}
روند اجرای برنامه :

تابع مورد نیا فراخوانی می شود و آدرس فایل برنامه از طریق پوینتر های کاراکتری داده می شود

ابتدا بررسی می شود که آیا فایل (وی بی اس) وجود دارد یا خیر، اگر وجود نداشته باشد فایل را ایجاد کرده و دستورات ویژوال بیسیک را همراه با آدرس برنامه در آن ذخیره می کند و سپس دستور اجرای آن را میدهد و مقدار 1 را بر میگرداند اما اگر وجود داشت آن را حذف کرده و مقدار 0 را بر میگرداند

سپس در تابع اصلی هنگام فراخوانی چک می شود که آیا نتیجه فراخوانی تابع 1 است یا خیر؟  اگر یک باشد از برنامه خارج می شود تا برنامه جدید که به صورت مخفی اجرا شده باقی بماند.  اما اگر مقدار بازگشتی 0 باشد، یعنی اگر برنامه مخفی ما اجرا شده و فایل ویژوال بیسیک اسکریپت ما از قبل وجود داشته و آن را حذف کرده،  کد های شما اجرا خواهند شد که در قسمت
/*
    {
        Your Codes
    {
*/
میتوانید کدهای خودتان را بنویسید

:نکته ها
فراخوانی کتابخانه ویندوز جهت استفاده از دستور اسلیپ است که هنگام ایجاد فایل وی بی اس مقداری به برنامه وقفه می دهیم تا از ساخته شدن فایل اطمینان حاصل کنیم و پس از آن فایل را اجرا کنیم

 سرعت روند ایجاد، اجرا و حذف فایل وی بی اس به قدری زیاد است که کاربر این تغییرات را مشاهده نخواهد کرد