谁知道pe loader是怎么工作的?或者有相关资料也好
我想知道程序是如何被装载的,以及被装载到何处如何执行???
有资料也好,google上也不太搜索的到
谢谢各位了

解决方案 »

  1.   

    我也想知道它具体的装载动作——不过资料都是很清楚。
    或者微软不愿意公开?
    一般的.exe都是被转载到$00400000处,是通过内存映射实现的。所以文件大小其实和转载速度没什么太大的关系。
      

  2.   

    “不过资料都是很清楚”——都不是很清楚,sorry
      

  3.   

    yansea(思宏) ( )
    "一般的.exe都是被转载到$00400000处"
    可以提供一般的手段加以验证吗?
    你是说所有一般的exe都加载到同一地址吗?
      

  4.   

    当然,所有的.exe都被加载到同一地址的。可以用一般的工具软件查看,这个并不难。
    用这段代码可以看看某个进程的信息,那个参数是进程IDfunction TForm1.GetMemoryInfo(ProcessID: Cardinal): boolean;
    var
        P : Pointer;
        MemInfo :  MEMORY_BASIC_INFORMATION;
        MemSize : LongWord;
        ProHWND : HWND;
    begin
        ProHWND := OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
        P := nil;
        MemSize := SizeOf(MemInfo);
        while LongWord(p)<$80000000 do
        begin
            if MemSize<>VirtualQueryEx(ProHWND,P,MemInfo,MemSize) then break;
            RichEdit1.Lines.Add(Format('基址: %p   %p    大小:%d  属性:%s',
                [MemInfo.BaseAddress,MemInfo.AllocationBase,MemInfo.RegionSize,GetStat(MemInfo.State)]));
            Inc(LongWord(P),MemInfo.RegionSize);
        end;
        Result := true;
    end;
      

  5.   

    这是那个 getstat 函数function TForm1.GetStat(nType: Cardinal): string;
    begin
        Result := '';
        if nType = 0 then exit;
        case nType of
            MEM_COMMIT: Result := 'Commit';
            MEM_FREE: Result := 'Free';
            MEM_RESERVE: Result := 'Reserve';
        end;
    end;
      

  6.   

    搜到upx的辕马,好象upx就是改写exe程序的pe头使其被加载时先将被压缩的数据传送到内存,然后在内存中直接解压,最后仍然在内存中运行.看来upx的作者对这套机制非常熟悉,可惜作者提供的资料并不是非常可读的东西,研究可要花较长时间,pe格式,汇编等基础知识也是必须的,希望有兴趣的朋友大家一起研究一下?或者提供一些其他的方法?谢谢大家的关注