狼巢 发表于 2025-10-13 09:13

添加资源表文件被提取的疑问

如题 一个EXE程序添加了图片资源表   会被提取出来加壳了会被脱假壳提取出来   听说可以修改pe头 来防止提取 具体怎么操作的有教程吗大佬们

沐泽 发表于 2025-10-13 09:13


我的爱是你 发表于 2025-10-13 11:22

将图片进行简单加密,如进行二进制异或,使用时在进行异或解密。

狼巢 发表于 2025-10-13 12:17

我的爱是你 发表于 2025-10-13 11:22
将图片进行简单加密,如进行二进制异或,使用时在进行异或解密。

有教程吗大佬

温酒书生 发表于 2025-10-13 14:44

直接压缩数据 然后压缩完的放到图片里面 写到文件里面加上解压数据即可

A18285528128 发表于 2025-10-14 01:22

沐泽 发表于 2025-10-14 00:44


这样真有用吗?大佬!希望你照此方法编译一个文件出来悬赏给我们菜鸟提取练手啊?

狼巢 发表于 2025-10-14 08:47

沐泽 发表于 2025-10-14 00:44


不想写出来 容易被弄 内存中运行 怎么写呢

狼巢 发表于 2025-10-14 08:58

沐泽 发表于 2025-10-14 00:44


我试试

我的爱是你 发表于 2025-10-14 12:11

狼巢 发表于 2025-10-13 12:17
有教程吗大佬

#include <stdio.h>
#include <easyx.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")

using namespace Gdiplus;

// 初始化GDI
void InitGDIPlus(ULONG_PTR* token)
{
    GdiplusStartupInput input;
    GdiplusStartup(token, &input, NULL);
}

// 释放GDI
void ShutdownGDIPlus(ULONG_PTR token)
{
    GdiplusShutdown(token);
}

// XOR加密并保存至本地
void encryptImage(const char* srcFile, const char* dstFile, unsigned char key)
{
    FILE* src = NULL;
    FILE* dst = NULL;
    fopen_s(&src, srcFile, "rb");
    fopen_s(&dst, dstFile, "wb");

    if (!src || !dst)
    {
      printf("文件打开失败!\n");
      if (src) fclose(src);
      if (dst) fclose(dst);
      return;
    }

    fseek(src, 0, SEEK_END);
    long fileSize = ftell(src);
    fseek(src, 0, SEEK_SET);

    unsigned char* buffer = (unsigned char*)malloc(fileSize);
    fread(buffer, 1, fileSize, src);

    for (long i = 0; i < fileSize; i++)
      buffer ^= key;

    fwrite(buffer, 1, fileSize, dst);

    free(buffer);
    fclose(src);
    fclose(dst);

    printf("图片加密完成,保存为: %s\n", dstFile);
}

//从内存加载图片GDI,因为EasyX的loadimage函数不支持从内存加载图片
IMAGE* loadImageFromMemory(const unsigned char* buffer, DWORD size)
{
    HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, size);
    if (!hMem) return NULL;

    void* pMem = GlobalLock(hMem);
    memcpy(pMem, buffer, size);
    GlobalUnlock(hMem);

    IStream* pStream = NULL;
    if (CreateStreamOnHGlobal(hMem, TRUE, &pStream) != S_OK)
    {
      GlobalFree(hMem);
      return NULL;
    }

    Gdiplus::Image* gdipImage = Gdiplus::Image::FromStream(pStream);
    if (!gdipImage || gdipImage->GetLastStatus() != Gdiplus::Ok)
    {
      pStream->Release();
      GlobalFree(hMem);
      delete gdipImage;
      return NULL;
    }

    int width = gdipImage->GetWidth();
    int height = gdipImage->GetHeight();

    IMAGE* img = new IMAGE(width, height);
    HDC hdc = GetImageHDC(img);

    Graphics graphics(hdc);
    graphics.DrawImage(gdipImage, 0, 0, width, height);

    delete gdipImage;
    pStream->Release();
    GlobalFree(hMem);

    return img;
}


// 异或解密内存加载函数
IMAGE* decryptImageInMemory(const char* encFile, unsigned char key)
{
    FILE* file = NULL;
    fopen_s(&file, encFile, "rb");
    if (!file)
    {
      printf("加密文件打开失败: %s\n", encFile);
      return NULL;
    }

    fseek(file, 0, SEEK_END);
    DWORD fileSize = ftell(file);
    fseek(file, 0, SEEK_SET);

    unsigned char* buffer = (unsigned char*)malloc(fileSize);
    fread(buffer, 1, fileSize, file);
    fclose(file);

    for (DWORD i = 0; i < fileSize; i++)
      buffer ^= key;

    IMAGE* img = loadImageFromMemory(buffer, fileSize);
    free(buffer);

    if (img)
      printf("图片解密成功!\n");
    else
      printf("图片解密失败!\n");

    return img;
}


int main()
{
    // 初始化 EasyX
    initgraph(800, 600, EX_SHOWCONSOLE);
    setbkcolor(WHITE);
    cleardevice();

    // 初始化 GDI+
    ULONG_PTR gdipToken;
    InitGDIPlus(&gdipToken);

    unsigned char key = 0xAA;

    //将当前目录下1.png 异或加密0xAA并保存为1_xor.dat
    encryptImage("1.png", "1_xor.dat", key);

    //从当前目录读取 1_xor.dat 进行异或0xAA解密并加载图片
    IMAGE* img = decryptImageInMemory("1_xor.dat", key);
    if (img)
    {
      putimage(0, 0, img);
      delete img;
    }
    else
    {
      printf("加载图片失败!\n");
    }

    system("pause");

    // 释放 GDI+
    ShutdownGDIPlus(gdipToken);
    closegraph();
    return 0;
}


二进制异或就是二进制读文件,然后挨个字节异或,基本没啥能讲的。
上面代码长不过是为了直观显示,用了GDI显示图片。加密解密本身代码很少也很简单。

页: [1]
查看完整版本: 添加资源表文件被提取的疑问