首页
社区
课程
招聘
[旧帖] [邀请已发,结帖]16进制机器码查看的C++源码实现 0.00雪花
发表于: 2009-5-23 22:17 1400

[旧帖] [邀请已发,结帖]16进制机器码查看的C++源码实现 0.00雪花

2009-5-23 22:17
1400
初来看雪,感觉“看雪”是一个非常不错的交流平台,小弟是一个低级菜鸟,只是对编程很感兴趣,希望在这里结交更多的朋友...

下面是小鸟用dev c++写的一段代码,其功能是将任何一个程序的16进制代码提取并保存到文本文件中,这样就可以方便地用记事本直接打开并查看程序机器码,原理很简单,写给对c/c++感兴趣的朋友...

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    int m=0,i,j,num;
    char a,b,c,d;
    char name[20],ci[20],co[20];
    cout<<"输入文件名:";
    cin>>name;
    strcpy(ci,name); 
    strcpy(co,name);
    strcat(co,".dat"); 
    
    ifstream in(ci,ios_base::binary); 
    if(!in){cout<<"Cannot open file "<<name<<endl;system("pause");exit(0);}
    ofstream out(co);
    
    cout<<"输入每行显示的字节数:";
    cin>>num;
    out<<'0'<<'\t'<<'\t';
    while(in.good())
    {   
      in.read(&a,sizeof(a));
      m++;
        for(i=0;i<2;i++)
        {
          c=0;
          for(j=0;j<4;j++)
          {
             d=a&0x80;
             a=a<<1;
             if(d==0x00){b=0;}else b=1;
             c=c*2+b;
          }
          if(c<10){c=c+48;}
          else if(c>9){c=c+87;}
          out<<c;
          
        }
      if(m%num==0){out<<'\n'<<m<<'\t'<<'\t';}else out<<'\t'; 
    }
    cout<<"原文件有字节数:"<<m<<endl;
    cout<<"16进制代码存于文件:"<<co<<endl<<endl;
    in.close();
    out.close();
    system("pause");
      
}

以上代码在dev-c++4.9.9.2编译通过。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
2
WinHEX, UE.
2009-5-27 16:53
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
当然没有UE那么强大,只是把一个文件的机器码以16进制的形式用记事本显示出来
2009-5-27 17:47
0
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
dev-cpp不是停止开发了吗?换成code:blocks吧,和dev很像。。呵呵

PS:题外话
2009-5-28 10:07
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
一直还没知道原理,今天是学习了。。。。。。。
能不能在写代码前,把思路先说说
2009-5-28 10:32
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
第一次发贴,考虑不周见谅
2009-6-6 17:15
0
雪    币: 1334
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不是很好判断 是不是原创
这样你把你的思路说说,我会发码给你的
2009-6-7 09:19
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢Ivanov,下面我把这个程序的核心部分注释一下,还望大牛们多多指教  
核心代码是一个循环,读到文件最后一个字节结束
while(in.good())
    {   
      in.read(&a,sizeof(a));//读取一个字节,也就是8个二进制数放入字节变量a中
      m++;//m作为计数器,判断已经处理了多少个字节
        for(i=0;i<2;i++)//每个字节分两次处理,先处理高四位,再处理低四位。
        {
          c=0;
          for(j=0;j<4;j++)//此循环用于求每四个二进制数的和,然后将和用十六进制数字符表示。
          {
             d=a&0x80;//将a的低七位二进制数置为0,最高位保留不变
             a=a<<1;//a左移一位,用于处理下一位二进制数
             if(d==0x00){b=0;}else b=1;//如果d=0x00则此时最高位为0,否则d=0x80则最高位为1.
             c=c*2+b;//将c乘以2后加上b,这是二进制转化为十进制的常用方法
          }
          if(c<10){c=c+48;}//判断c是否小于10,小于则用数字表示
          else if(c>9){c=c+87;}//否则用abcdef表示
          out<<c;//将十六进制结果以字符形式输出到文本文件
         
        }
      if(m%num==0){out<<'\n'<<m<<'\t'<<'\t';}else out<<'\t'; //在文本文件中每num个字节换一行。
    }

为了再次对Ivanov表示感谢,小鸟把上述程序的逆过程也写出来供大家分享
所谓其逆过程就是把文本文件中的十六进制字符还原为数据文件,这样就可以实现用记事本来修改文件的二进制代码,比如去除bmp图片的背景,当然罗,你首先要知道bmp的文件格式,这里就不多说了,代码如下:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    int i,j,k,m,n,num;
    unsigned char a,b,c;
    char name[20],ci[20],co[20];
    cout<<"输入文件名:";
    cin>>name;
    strcpy(ci,name);
    strcat(ci,".dat");
    strcpy(co,"back-");
    strcat(co,name);
   

    ifstream in(ci);
    if(!in){cout<<"Cannot open file "<<ci<<endl;system("pause");exit(0);}
    cout<<"每行多少字节:";cin>>num;
    ofstream out(co,ios_base::binary);
   
//这里是本程序的核心代码
in>>m;
    while(in.good())//这个循环用于读取文本文件的每一个字符
    {
        n=0;
        for(i=0;i<num;i++)//该循环用于将文本文件的每行十六进制字符串转化为对应的二进制字节
        {
                b=0;
                in>>a;//读取字符

                if(a>47&&a<58){b=b+a-48;}else {b=b+a-87;}//将字符转化为四个二进制数
                b=b<<4;//左移四位,也就是将上一行转化的四个二进制数填充到b的高四位
                in>>a; //读取下一个字符
                if(a>47&&a<58){b=b+a-48;}else {b=b+a-87;}//将字符转化为四个二进制数后填充到b的低四位。
                out.write((char*)&b,sizeof(b)); //将填充好的字节b输出到二进制文件
                n++;
        }
        in>>m;//跳过每行的行首地址字符串

    }
    cout<<"共有字节数:"<<m+n<<endl;
    in.close();
    out.close();
   
}
2009-6-8 16:19
0
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fzr
9
尽管看不懂,但感觉还是不错!顶一个
2009-6-8 16:30
0
游客
登录 | 注册 方可回帖
返回
//