2012-05-04 4 views
0

this hexadecimal view of the .o file in xvi32 が.cppのデータに対応する方法を説明できますか?すなわち、 '/ 18'/65 '/ 139のような数字は何ですか、' .rdata 'は? 例えば、対応するexeを開くと、ファイルは、やや似ています。しかし、特に:exeではなぜこの ".rdata"が ".data"になるのですか?これは少しハンバーガーを見て、と尋ねるようなものであるxvi32の.oファイルをスキャンする

// 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; 
} 

答えて

1

:ここ は、この.oのが作成された.cppファイルである「牛のどの部分、これはから来ましたの?」あるハンバーガーには、3つまたは4つの異なる牛のそれぞれの半分からの肉が含まれています。

どこからでも多くを得るには、オブジェクトファイル(または実行可能ファイル)のプレーンヘキサダンプよりも少しインテリジェントなものから始めることをお勧めします。おそらく、アセンブリ言語のソースコードとして少なくとも出力に多かれ少なかれ見ることができるように、逆アセンブラを使用することをお勧めします。それがなければ、実際にどのパーツを見ているか、再配置レコードのようなものか、あるいはセクション間のパディング(つまり全く意味がない)さえ知るためにも、オブジェクトファイルフォーマットのかなりの知識が必要です。それは明らかに可能ですが、選択肢がなければ、時間を費やすことはめったにありません。

Microsoft Windows SDKにはdumpbinというツールが含まれており、/disasmフラグを使用して実行可能ファイル内のコードを逆アセンブルすることができます。周りを見回すと、他にも様々な逆アセンブラがあります。お金を使いたいなら、IDA Proを私が使った最高のものとしてお勧めします。確かにではなく、が無料で、特に安価ですが、これを多くするつもりなら1ペニーの価値があります。

+0

私はそれがこの牛のようなものだと知っていますが、私はこの牛を見て "この牛のどの部分から来たのですか?" :D – 4pie0

+0

ありがとう、dumpbinは本当に私に助けになる – 4pie0