开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 941|回复: 0
收起左侧

[源码分享] PE文件提取

[复制链接]

结帖率:100% (1/1)
发表于 2021-5-17 15:48:42 | 显示全部楼层 |阅读模式   广东省深圳市
可以提取某个PE文件中作为资源存放的其他PE文件,例如提取外挂辅助或者病毒里的功能dll,具体看源码

class TiQu{
public:
        TiQu(char*);
        ~TiQu();
        int TQ();
        char* buffer;
        FILE* hf;
        long len;
};

TiQu::TiQu(char* name){
        hf=fopen(name,"rb+");
        fseek(hf,0,SEEK_END);
        len=ftell(hf);
        buffer=new char[len];
        fseek(hf,0,SEEK_SET);
        fread(buffer,len,1,hf);
}

TiQu::~TiQu(){
        fclose(hf);
        delete[] buffer;
}

int TiQu::TQ(){
        int numbers=0;//内含PE文件数量
        char* PEstruct[10]={0};//存放内含的PE文件起始指针,假设文件里含有不超过10个PE文件
        char* point=buffer;
        do{
                char M=*point;
                char Z=*(point+1);
                if(M=='M' && Z=='Z'){
                        int E_lfanew=*(int*)(point+0x3c);
                        if(E_lfanew>0 && E_lfanew<0x1000){//E_lfanew偏移一般很小,注意排除负数,因为读取出来的E_lfanew可能超过有符号整数范围变成负数
                                char P=*(point+E_lfanew);
                                char E=*(point+E_lfanew+1);
                                if(P=='P' && E=='E'){
                                        PEstruct[numbers]=point;
                                        numbers++;
                                }
                        }
                }
         point++;
        }while(point<buffer+len);
        //char text[30]={0};
        //sprintf(text,"共找到%d个PE文件\r\n",numbers);
        //MessageBox(NULL,text,"提示",MB_OK);

        if(numbers>1){//如果有超过1个PE文件就提取
                for(int i=1;i<numbers;++i){//从PEstruct[1]开始提取,PEstruct[0]是原文件PE结构
                        int E_lfanew=*(int*)(PEstruct+0x3c);
                        PIMAGE_FILE_HEADER pfile=reinterpret_cast<PIMAGE_FILE_HEADER>(PEstruct+E_lfanew+4);
                        WORD character=pfile->Characteristics;
                        int sectionnumbers=pfile->NumberOfSections;
                        PIMAGE_SECTION_HEADER psec=reinterpret_cast<PIMAGE_SECTION_HEADER>(PEstruct+E_lfanew+sizeof(IMAGE_NT_HEADERS));
                        for(int j=1;j<sectionnumbers;++j){
                                psec++;
                        }
                        int pesize=psec->PointerToRawData+psec->SizeOfRawData;
                        char lujing[200]={0};
                        GetCurrentDirectory(200,lujing);
                        char filename[10]={0};
                        if((character&0x2000)==0x2000)
                                sprintf(filename,"\\%d.dll",i);
                        else
                                sprintf(filename,"\\%d.exe",i);
                        strcat(lujing,filename);
                        FILE* hfile=fopen(lujing,"wb+");
                        int error=GetLastError();
                        fwrite(PEstruct,pesize,1,hfile);
                        fclose(hfile);
                        std::cout<<"提取文件:"<<lujing<<"成功"<<std::endl;
                }
        }
        return numbers;
}

int _tmain(int argc, _TCHAR* argv[])
{
        char buffer[200]={0};
        std::cout<<"请输入要提取的目标程序"<<std::endl;
        std::cin>>buffer;
        TiQu ceshi(buffer);
        ceshi.TQ();
        system("pause");
        return 0;
}



您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表