删除自身的程序代码

 

#include <windows.h>

#include <stdio.h>

#include <stdlib.h>

 

#define Cleanse(x) { res == (x); goto __cleanse; }

 

typedef BOOL (WINAPI *DELETEFILEA)(const char*);

 

struct remove_data

{

    char filename[_MAX_PATH];

    DELETEFILEA deleteFile;

};

 

DWORD WINAPI remove_code(LPVOID param)

{

    struct remove_data *p = (struct remove_data*)param;

    if (p && p->deleteFile)

    {

        while (!p->deleteFile(p->filename));

    }

    return 0;

}

 

int install_code(void)

{

    int res = 0;

    HWND hwnd;

    DWORD pid;

    DWORD tmp;

    HANDLE proc = NULL;

    HANDLE th = NULL;

    HINSTANCE lib;

    void *codemem, *datamem;

    struct remove_data rmvdata;

 

    if (!(hwnd = FindWindow("PROGMAN", NULL))) Cleanse(1);

 

    GetWindowThreadProcessId(hwnd, &pid);

    if (!(proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid))) Cleanse(2);

 

    codemem = VirtualAllocEx(proc, NULL, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

    datamem = VirtualAllocEx(proc, NULL, sizeof(struct remove_data), MEM_COMMIT, PAGE_READWRITE);

    if (!(codemem && datamem)) Cleanse(3);

 

    if (!WriteProcessMemory(proc, codemem, (void*)remove_code, 4096, &tmp)) Cleanse(4);

 

    lib = LoadLibrary("Kernel32.dll");

    if (!lib) Cleanse(5);

 

    rmvdata.deleteFile = (DELETEFILEA)GetProcAddress(lib, "DeleteFileA");

    if (!rmvdata.deleteFile) Cleanse(5);

 

    GetModuleFileName(NULL, rmvdata.filename, _MAX_PATH);

 

    if (!WriteProcessMemory(proc, datamem, &rmvdata, sizeof(rmvdata), &tmp)) Cleanse(6);

 

    if (!(th = CreateRemoteThread(proc, NULL, 0, (LPTHREAD_START_ROUTINE)codemem, datamem, 0, &tmp))) Cleanse(7);

 

__cleanse:

    switch (res)

    {

    case 1:

        printf("Can't find explorer window./n");

        break;

 

    case 2:

        printf("Can't open process./n");

        break;

 

    case 3:

        printf("Can't allocate memory./n");

        break;

 

    case 4:

        printf("Can't install code./n");

        break;

 

    case 5:

        printf("Can't get delete function./n");

        break;

 

    case 6:

        printf("Can't install data./n");

        break;

 

    case 7:

        printf("Can't launch delete routine./n");

        break;

 

    default:

        break;

    }

 

    if (proc) CloseHandle(proc);

    if (th) CloseHandle(th);

 

    return res;

}

 

int main(void)

{

    if (install_code() == 0)

    {

        printf("Press anykey to delete THIS program...");

        fflush(stdin);

        getchar();

    }

 

    return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值