0

xvi32 の .o ファイルのこの 16 進表示が .cpp のデータにどのように対応するかを誰かが説明できますか? つまり、'/18'/65'/139 や ".rdata" のような数値は何を意味するのでしょうか? たとえば、対応するexeを開くと、ファイルが非常に似ていることがわかりますが、少なくとも最初はわずかな違いがあります。しかし、具体的には、exeでこの「.rdata」が「.data」になるのはなぜですか? この .o が作成された元の .cpp は次のとおりです。

    // exercise_for.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <list>
#include <map>

#include <iterator>
#include <algorithm>
#include <fstream>

#include <limits>

struct myStruct{
    int a;
    double b;
    virtual void func()=0;
    void f(){};
};
struct sB{virtual void g()=0;};
struct myStruct2:sB{
    void f(){};
    void g(){std::cout<<"\nmyStruct2";}
};
struct myStruct3:sB{
    void f(int const &in){a=in;};
    void g(){std::cout<<"\nmyStruct3";};
    myStruct3():a(0){};
    int show(){return a;};
private:
    int a;
};

class myC : public myStruct{
    int i;
    void func(){};
};

std::map<std::string,int> histogram;
void record(const std::string& in ){
    histogram[in]++;
}
void print(const std::pair<const std::string,int>& in ){
    std::cout<<(in.first)<<" "<<in.second<<"\n";
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout<<"largest float:"<<std::numeric_limits<float>::max()<<
        "\nchar is signed:"<<std::numeric_limits<char>::is_signed<<
        "\nlargest int:"<<std::numeric_limits<int>::max()<<
        "\nlargest double:"<<std::numeric_limits<double>::max()<<
        "\nlargest short int:"<<std::numeric_limits<short int>::max()<<
        "\nlargest long int:"<<std::numeric_limits<long int>::max()<<"\n\n";

    for(int i=0;i<10;++i){
        std::cout<<++i;
    }

    myC mC;
    myStruct2 m;
    myStruct3 n;
    std::cout<<"n: "<<n.show();
    m.f();
    n.f(4);
    std::cout<<"\nn: "<<n.show();

    std::cout<<"\nmem_fun";
    std::list<sB*> myList;
    myList.push_back(&m);
    myList.push_back(&n);
    std::for_each(myList.begin(),myList.end(),std::mem_fun(&sB::g));
    std::list<sB*>::iterator it=myList.begin(); 

    std::istream_iterator<std::string> ii(std::cin);
    std::istream_iterator<std::string> eos;
    std::for_each(ii,eos,record);
    int i=0xffff;
    std::string z;
    std::cout<<"\n\nprinting: sizeof(int)="<<sizeof(int)<<"  i:"<<i<<"\n";
    int* i_ptr;
    std::cout<<"sizeof(int*)="<<sizeof(i_ptr)<<"\n";
    std::cout<<"sizeof(double)="<<sizeof(double)<<"\n";
    std::cout<<"sizeof(double*)="<<sizeof(double*)<<"\n";
    std::cout<<"sizeof(string)="<<sizeof(z)<<"\n";
    float fl=1000+1.6+1.6+1.6+1.6;
    std::cout<<"\nf:"<<fl;
    std::for_each(histogram.begin(),histogram.end(),print);

    std::vector<std::string> sL;
    std::string s("spadaj");
    sL.push_back(s);
    std::copy(sL.begin(),sL.end(),std::ostream_iterator<std::string>(std::cout, " "));
    std::ofstream f("myFile.txt"); 
    std::copy(sL.begin(),sL.end(),std::ostream_iterator<std::string>(f, " "));
    return 0;
}
4

1 に答える 1

1

これは、ハンバーガーを見て、「これは牛のどの部分から来たのか」と尋ねるようなものです。特定のハンバーガーには、3頭または4頭の異なる牛のそれぞれの半ダースの異なる部分からの肉が含まれている場合があります。

どこでも多くのことを取得するには、オブジェクトファイル(または実行可能ファイル)の単純な16進ダンプよりも少しインテリジェントなものから始めたいと思うでしょう。少なくとも、アセンブリ言語のソースコードとしての出力を多かれ少なかれ直接見ることができる逆アセンブラを使用することをお勧めします。それがなければ、どの部分を実際に見るか、どの部分が再配置レコードのようなものであるか、あるいはセクション間のパディング(つまり、完全に無意味)でさえあるかを知るために、オブジェクトファイル形式に関するかなり深い知識が必要です。それは明らかに可能ですが、選択の余地がない限り、それがあなたの時間を満足のいく方法にすることはめったにありません。

これは(決して)最適な逆アセンブラではありませんが、Microsoft Windows SDKには、フラグdumpbinを使用して実行可能ファイルのコードを逆アセンブルできるという名前のツールが含まれています。/disasm周りを見回すと、他にもさまざまな逆アセンブラが利用できます。あなたがいくらかのお金を使う気があるなら、私はIDAProを私が使った中で最高のものとしてお勧めします。それは間違いなく無料ではなく、特に安価でもありませんが、これだけのことをするつもりなら、すべてのペニーの価値があります。

于 2012-05-04T21:31:31.100 に答える