首页
社区
课程
招聘
[已解决]关于读取pe文件到十六进制编码
发表于: 2009-4-21 21:44 5192

[已解决]关于读取pe文件到十六进制编码

2009-4-21 21:44
5192
bool CBinToShellDlg::BinToShellCode(CString openFilePath,CString saveFilePath)
{
        int fileSize;
        FILE *fp=NULL;

        //以二进制只读模式打开文件
        if (!(fp=fopen(openFilePath,"rb")))
        {
                MessageBox("打开文件失败");
                return FALSE;
        }

        fseek(fp,0,SEEK_END); //移动文件指针到末尾
        fileSize=ftell(fp);   //得到文件指针位置(也就是取文件大小)
        fseek(fp,0,SEEK_SET);//把文件指针移回来

       
        char *binCodeBuffer=(char*)malloc(fileSize);//申请文件大小的缓冲区来存放文件内容
        //把文件内容读到缓冲区
        if (!fgets(binCodeBuffer,fileSize,fp))
        {
                MessageBox("读取文件失败");
                return FALSE;
        }

        FILE *shellFile;
        shellFile=fopen(saveFilePath,"w");//创建并打开shellcode文件
        BYTE xorCode;
        //是否异或加密
        if (IsDlgButtonChecked(IDC_ISXOR))
        {
                xorCode=(BYTE)GetDlgItemInt(IDC_XORCODE);
        }
        else
        {
                xorCode=0;
        }
       
        BYTE byteCode;
        //循环写入
        for (int i=0; i<fileSize; i++)
        {
                byteCode=xorCode^(BYTE)binCodeBuffer[i];
               
                fprintf(shellFile,IsDlgButtonChecked(IDC_ISADDX) ? "\\x%2.2X" : "%2.2X",byteCode);
                if ( i % 16 == 0)
                {
                        fprintf(shellFile,"\n");       
                }
        }
        //关闭文件
        fclose(shellFile);
        fclose(fp);
        return TRUE;

}
上面的代码是以十六进制方式输入一个文件,为什么输出的文件在特定位置以后的编码全是一样的如下图是输出计事本的文件

如上图后面的全是CD,不知道为什么

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
fread在哪里?
调试下啥都清楚了吧。。。
楼主在做解密还是加密?这种事情用python之类的脚本来做方便,个人建议。
2009-4-21 22:02
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
if (!fgets(binCodeBuffer,fileSize,fp)) -- 错误
fgets 读取的是cstr 串,读到零终止。。

改用 fread
2009-4-21 22:02
0
雪    币: 993
活跃值: (442)
能力值: ( LV12,RANK:403 )
在线值:
发帖
回帖
粉丝
4
//把文件内容读到缓冲区
if (!fgets(binCodeBuffer,fileSize,fp))
{
MessageBox("读取文件失败");
return FALSE;
}

到MSDN里看看fgets的说明吧
如果要二进制处理文件的话,还是fread吧,fgets适用于文本方式,读到0x0D和0x0A的时候就完了,但是二进制文件中随时都有可能出现0x0D和0x0A,后面的内容内没被读进来,当然就是0xCD了。
2009-4-21 22:03
0
雪    币: 268
活跃值: (40)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
5
感谢楼上几位的热心解答问题解决了
2009-4-21 22:10
0
游客
登录 | 注册 方可回帖
返回
//