亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pefileclass.pas

?? SrcDecompiler is about creating a Delphi program decompiler. The program is written for Delphi 4 or
?? PAS
?? 第 1 頁 / 共 5 頁
字號:
  {$IFOPT D+}
    LastDC: TDecompItem;
    DbugCounter: Integer;
  {$ENDIF}
  label
  {$IFOPT D+}
    NextChecK,
  {$ENDIF}
    ReDo;

    function AnaUnknownBlock(var StartAddress: PChar; EndAddress: PChar): Boolean;
    var
      OrgEndAddress: PChar;
      FixupsTo: TList;
      FixupsInside: TList;
      P: Integer;
      Adjusted: Boolean;
      XAddress: PChar;
      PCharEndAddress: PChar;
      ProcSize: Integer;
      PossType: set of (ptPChar, ptProc, ptGUID);
      AProc: TProc;
      ALog: string;
    resourcestring
      SProcSize0Error = 'Proc with size 0 at %p';
    begin
      Result := False;
      OrgEndAddress := EndAddress;
      FixupsTo := TList.Create;
      try
        FixupsInside := TList.Create;
        try
          // Generate a list of Fixups To and inside the block,
          // order on the address which contains the fixup.
          for P := 0 to Fixups.Count -1 do
          begin
            if (Fixups[P].FixupType = 3) and
               (PPChar(Fixups[P].Address)^ >= StartAddress) and
               (PPChar(Fixups[P].Address)^ < EndAddress) then
            begin
              FixupsTo.Add(Fixups[P].Address);
            end;
            if (Fixups[P].Address >= StartAddress) and
               (Fixups[P].Address < EndAddress) then
              FixupsInside.Add(Fixups[P].Address);
          end;

          // if there is a fixupTo not to the start from outside the block, the blocks ends there.
          Adjusted := True;
          while Adjusted do
          begin
            Adjusted := False;
            for P := 0 to FixupsTo.Count -1 do
              if (PPChar(FixupsTo[P])^ <> StartAddress) and
                 ((PChar(FixupsTo[P]) < StartAddress) or
                  (PChar(FixupsTo[P]) >= EndAddress)) then
              begin
                {$IFOPT D+}
                  SendDebug(Format('EndAddress ajusted %p %p %p %p', [Pointer(StartAddress),
                    Pointer(EndAddress), PPointer(FixupsTo[P])^, FixupsTo[P]]));
                {$ENDIF}
                EndAddress := PPChar(FixupsTo[P])^;
                Adjusted := True;
                break;
              end;
            for P := FixupsTo.Count -1 downto 0 do
              if PPChar(FixupsTo[P])^ >= EndAddress then
                FixupsTo.Delete(P);
            for P := FixupsInside.Count -1 downto 0 do
              if PChar(FixupsInside[P]) >= EndAddress then
                FixupsInside.Delete(P);
          end;

          // Align4 the proc to 4 bytes.
          EndAddress := Align4(EndAddress);
          
          // Sort the lists of fiups.
          FixupsTo.Sort(ListPointerToSort);
          FixupsInside.Sort(ListSimpleSort);

          // At the moment all of the possebilities are possible except ptGUID (no Interfaces).
          PossType := [ptPChar, ptProc];

          // If there is no 0 on the last byte of a DWord before the first Fixup Inside or FixupTo then it is not a PChar.
          XAddress := EndAddress;

          for P := 0 to FixupsTo.Count -1 do
            if PPChar(FixupsTo[P])^ <> StartAddress then
            begin
              XAddress := PPChar(FixupsTo[P])^;
              break;
            end;

          if (FixupsInside.Count > 0) and (FixupsInside[0] < XAddress) then
            XAddress := FixupsInside[0];
          P := 3;
          PCharEndAddress := nil;
          PossType := PossType - [ptPChar];
          while P < XAddress - StartAddress do
          begin
            if StartAddress[P] = #0 then
            begin
              ALog := ALog + Format('PChar still possible due to a #0 at %p, ', [Pointer(StartAddress + P)]);
              PossType := PossType + [ptPChar];
              PCharEndAddress := StartAddress + P + 1;
              break;
            end;
            Inc(P, 4);
          end;

          // if there are fixups inside then it must be a proc.
          if (FixupsInside.Count <> 0) and
             ((PCharEndAddress = nil) or (PCharEndAddress > FixupsInside[0])) then
          begin
            ALog := ALog + Format('can only be proc due to a fixup inside at %p, ', [Pointer(FixupsInside[0])]);
            PCharEndAddress := nil;
            PossType := [ptProc];
          end;

          // If the block smaller than 16 untile the next fixup, it can't be a GUID
          if XAddress - StartAddress <> 16 then
            PossType := PossType - [ptGUID];

          // If the proc doesn't cotain a $C3 or $C2 instruction.
          PossType := PossType - [ptProc];
          for P := Align4(EndAddress-StartAddress) -4 to Align4(EndAddress-StartAddress)-1 do
            if StartAddress[P] = #$C3 then
            begin
              PossType := PossType + [ptProc];
              break;
            end;

          for P := Align4(EndAddress-StartAddress) -5 to Align4(EndAddress-StartAddress) -2 do
            if StartAddress[P] = #$C2 then
            begin
              PossType := PossType + [ptProc];
              break;
            end;

          // A PChar has a maximum Length of 255.
          if (EndAddress - StartAddress > 256) and
             ((PCharEndAddress <> nil) or (PCharEndAddress - StartAddress > 256)) then
          begin
            ALog := ALog + 'pchar not possible because the block is to long, ';
            PossType := PossType - [ptPChar];
            PCharEndAddress := nil;
          end;

          // The proc may not be greater then the empty block.
          if ptProc in PossType then
            ProcSize := GetProcSize(StartAddress)
          else
            ProcSize := 0;
            
          if (ptProc in PossType) and (EndAddress - StartAddress < ProcSize) then
            PossType := PossType - [ptProc];

          if PossType = [] then
          begin
            if (EndAddress - StartAddress > 4) and (StartAddress[0] = #$55) and
               (StartAddress[1] = #$8B) and (StartAddress[2] = #$EC) then
            begin
              PossType := [ptProc];
              {$IFOPT D+}
                SendDebug(Format('Nothing As proc gap %p %p', [Pointer(StartAddress), Pointer(EndAddress)]));
              {$ENDIF}
            end
            else
            begin
              // Search for the first Fixups to after then end, before the original end
              // it probably is a proc.
              XAddress := OrgEndAddress;
              for P := 0 to Fixups.Count -1 do
                if (PPChar(Fixups[P].Address)^ < XAddress) and
                   (PPChar(Fixups[P].Address)^ > StartAddress) then
                begin
                  XAddress := PPChar(Fixups[P].Address)^;
                end;
              if (XAddress < OrgEndAddress) and (Integer(XAddress) mod 4 <> 0) then
              begin
                PossType := [ptProc];
                {$IFOPT D+}
                  SendDebug(Format('Nothing As **proc gap %p %p', [Pointer(StartAddress), Pointer(EndAddress)]));
                {$ENDIF}
              end
              else
              begin
                PossType := [ptPChar];
                {$IFOPT D+}
                  SendDebug(Format('Nothing As PChar gap %p %p', [Pointer(StartAddress), Pointer(EndAddress)]));
                {$ENDIF}
              end;
            end;
          end;

          // If the difference between the pchar end address and the EndAddress of the proc, is
          // very big (say $40, if is probably a pchar followed by a proc.
          if (ptPChar in PossType) and (PCharEndAddress <> nil) and
             (ProcSize <> 0) and (ProcSize - (PCharEndAddress - StartAddress) > $40) then
            PossType := [ptPChar];

          // If a proc is still possible say it is a proc.
          if ptProc in PossType then
            PossType := [ptProc];
          // If a PChar is still possible say it is a pchar.
          if ptPChar in PossType then
            PossType := [ptPChar];

          // Create a TDecompItem to fill the block.
          if PossType = [ptProc] then
          begin
            AProc := Procs.Add(StartAddress);
            AProc.Comments.Add(Format('Unknown block proc at %p to %p',
               [Pointer(StartAddress), Pointer(EndAddress)]));
            AProc.Comments.Add(ALog);
            AProc.PossProcTypes := ptAllStatic;
            AProc.Size := GetProcSize(StartAddress);
            AProc.ProcSize := AProc.Size;
            {$IFOPT D+}
              if AProc.Size > OrgEndAddress - StartAddress then
                SendDebugEx(Format('To big proc %p %x %p', [Pointer(StartAddress), AProc.Size,
                  Pointer(EndAddress)]), mtError);
            {$ENDIF}
            Result := Procs.AnalyzeProc(AProc);
            AppendProcs;
            AlignProcs;
            // A Proc maybe Free in Append Procs, so search for the proc at startaddress.
            AProc := Procs.FindProc(StartAddress);
            if AProc.Size = 0 then
              AProc := Procs.FindProc(StartAddress +1);
//              raise EDecompilerError.CreateFmt(SProcSize0Error, [Pointer(AProc.Address)]);
            EndAddress := AProc.Address + AProc.Size;
//!            if  Integer(EndAddress) mod 4 <> 0 then
//!              raise EDecompilerError.CreateFmt('EndAddress not 4 Byte alligned, %p %p',
//!                 [pointer(AProc.Address), pointer(EndAddress)]);
          end
          else
            if PossType = [ptPChar] then
            begin
              if PCharEndAddress <> nil then
                EndAddress := PCharEndAddress;
              with TStringInfo.Create(StringInfos, StartAddress, stPAnsiChar, EndAddress - StartAddress) do
              begin
                Comments.Add(ALog);
                Name := Format('PChar%p', [Pointer(StartAddress)]);
              end;
            end
            else
              with TGUIDConst.Create(miscs) do
              begin
                Comments.Add(ALog);
                Address := StartAddress;
                Size := EndAddress - StartAddress;
              end;

          StartAddress := EndAddress;
        finally
          FixupsInside.Free;
        end;
      finally
        FixupsTo.Free;
      end;
    end;

  begin
    CodeItems := TList.Create;
    try
      ReDo:
      DecompThread.CheckTerminated;
      {$IFOPT D+}
      SendDebug('Start Analysing unknown blocks');
      LastDC := nil;
      DbugCounter := 0;
      {$ENDIF}

      MaxAddress := Units.SysInitUnit.FInit.Address + Units.SysInitUnit.FInit.Size;
      // Add all code items to the CodeItems list.
      CodeItems.Clear;
      CodeItems.Capacity := Classes.Count + TypeInfos.Count + Procs.Count + StringInfos.Count;
      for I := 0 to Classes.Count -1 do
        if (Classes[I].Address >= MaxAddress) then
          CodeItems.Add(Classes[I]);
      for I := 0 to TypeInfos.Count -1 do
        if (TypeInfos[I].Address >= MaxAddress) then
          CodeItems.Add(TypeInfos[I]);
      for I := 0 to Procs.Count -1 do
        if (Procs[I].Size <> 0) and (Procs[I].Address <> nil) and
           (Procs[I].Address >= MaxAddress) then
          CodeItems.Add(Procs[I]);
      for I := 0 to StringInfos.Count -1 do
        if (StringInfos[I].Address < Data) and
           (StringInfos[I].Address >= MaxAddress) then
          CodeItems.Add(StringInfos[I]);
      for I := 0 to Miscs.Count -1 do
        if (Miscs[I].Size <> 0) and
           (Miscs[I].Address >= MaxAddress) then
          CodeItems.Add(Miscs[I]);

      CodeItems.Sort(DecompItemSort);

      for I := 0 to CodeItems.Count -1 do
      begin
        if TDecompItem(CodeItems[I]).Address < MaxAddress then
        begin
          if TDecompItem(CodeItems[I]).Address + TDecompItem(CodeItems[I]).Size <= MaxAddress then
          begin
            // There is a decomp item inside another decomp item.
            if (TDecompItem(CodeItems[I]) is TProc) or
               ((TDecompItem(CodeItems[I]) is TStringInfo) and
                (TStringInfo(CodeItems[I]).StringType = stPAnsiChar)) then
            begin
              // If it is a proc or PChar inside the other decomp item, Delete it.
              TDecompItem(CodeItems[I]).Free;
              CodeItems[I] := nil;
              Continue;
            end
            else
            begin
              {$IFOPT D+}
                if LastDC <> nil then
                  SendDebugEx(Format('Not proc block inside another block %s %p %x, %s %p',
                     [LastDC.ClassName, Pointer(LastDC.Address), LastDC.Size,
                      TDecompItem(CodeItems[I]).ClassName, Pointer(TDecompItem(CodeItems[I]).Address)]), mtError)
                else
                  SendDebugEx(Format('Not proc block inside another block %s %p',
                     [TDecompItem(CodeItems[I]).ClassName, Pointer(TDecompItem(CodeItems[I]).Address)]), mtError)
              {$ELSE}
                raise EDecompilerError.CreateFmt('Not proc block inside another block %p %p',
                   [Pointer(MaxAddress), Pointer(TDecompItem(CodeItems[I]).Address)]);
              {$ENDIF}
            end;
          end
          else
          begin
            {$IFOPT D+}
              if LastDC <> nil then
                SendDebugEx(Format('Overlapping code items %s %p %x, %s %p',
                   [LastDC.ClassName, Pointer(LastDC.Address), LastDC.Size,
                    TDecompItem(CodeItems[I]).ClassName, Pointer(TDecompItem(CodeItems[I]).Address)]), mtError)
              else
                SendDebugEx(Format('Overlapping code items, %s %p',
                   [TDecompItem(CodeItems[I]).ClassName, Pointer(TDecompItem(CodeItems[I]).Address)]), mtError);
            {$ELSE}
              raise EDecompilerError.CreateFmt('Overlapping code items %p %p',

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
丁香一区二区三区| 欧美一区二区免费视频| 一本一道波多野结衣一区二区| 国产成人免费视频精品含羞草妖精| 日韩av电影天堂| 国产一区二区三区久久久| 国产精品综合av一区二区国产馆| 国产不卡视频在线观看| 99免费精品在线观看| 欧美人狂配大交3d怪物一区| 欧美一区永久视频免费观看| 精品久久久久久久久久久久久久久 | 国产精品538一区二区在线| 久久久久久久久久久久久久久99| 欧美日韩mp4| 欧美性欧美巨大黑白大战| 欧美一区二区三区在线| 久久久影视传媒| 一个色综合av| 国产一区二区三区四| 欧美无砖专区一中文字| 久久影院视频免费| 亚洲综合网站在线观看| 激情久久五月天| 欧美三日本三级三级在线播放| 精品欧美一区二区三区精品久久 | 国产成人精品免费| 欧美日韩精品系列| 国产嫩草影院久久久久| 亚洲成人精品一区| 91首页免费视频| 久久久久久久av麻豆果冻| 免费成人在线观看| 99久免费精品视频在线观看| 国产校园另类小说区| 蜜臀91精品一区二区三区| 欧美吞精做爰啪啪高潮| 中文字幕乱码久久午夜不卡| 国产一区在线观看视频| 日韩精品一区二区在线观看| 日韩国产在线一| 欧美一区二区三区四区高清| 五月综合激情网| 欧美色视频一区| 亚洲福利电影网| 欧美日韩在线一区二区| 天使萌一区二区三区免费观看| 91激情五月电影| 有坂深雪av一区二区精品| 日本高清视频一区二区| 亚洲小说欧美激情另类| 欧美日韩精品欧美日韩精品| 午夜电影一区二区三区| 制服丝袜亚洲网站| 国产乱码字幕精品高清av| 精品国产sm最大网站免费看| 国产尤物一区二区在线| xvideos.蜜桃一区二区| 国产精品18久久久久久久久| 久久精品视频免费| 91年精品国产| 青青青爽久久午夜综合久久午夜| 欧美变态tickling挠脚心| 顶级嫩模精品视频在线看| 一区二区三区四区不卡在线 | 久久午夜电影网| av不卡在线播放| 蜜芽一区二区三区| 国产夜色精品一区二区av| 不卡av免费在线观看| 免费欧美在线视频| 自拍偷自拍亚洲精品播放| 欧美在线色视频| 国产一区二区视频在线| 一区二区三区国产精品| 精品日韩99亚洲| 777精品伊人久久久久大香线蕉| 亚洲综合在线五月| 久久九九国产精品| 538prom精品视频线放| eeuss鲁片一区二区三区在线观看| 亚洲精品欧美综合四区| 亚洲日本在线天堂| 精品免费日韩av| 欧美性色黄大片手机版| av资源网一区| 国产一区二区三区黄视频 | 国产成人精品午夜视频免费| 肉色丝袜一区二区| 亚洲高清视频在线| 亚洲日本护士毛茸茸| 中文字幕高清一区| 久久色.com| 国产农村妇女精品| 国产三级精品在线| 国产日韩精品一区二区三区| 手机精品视频在线观看| 精品久久国产97色综合| 欧美丰满少妇xxxbbb| 精品视频1区2区3区| 欧美在线观看视频一区二区三区| 丁香天五香天堂综合| 成人一级视频在线观看| 成人性生交大片免费看视频在线| 国产尤物一区二区| 成人精品免费网站| 不卡一区二区在线| 91原创在线视频| 在线看不卡av| 欧美日韩大陆在线| 精品卡一卡二卡三卡四在线| 欧美大肚乱孕交hd孕妇| 欧美国产成人精品| 亚洲欧美日韩综合aⅴ视频| 久久精品一区二区三区av| 国产精品久久久久一区二区三区共 | 国产三区在线成人av| 成人免费在线视频| 亚洲国产精品一区二区久久| 免费在线观看成人| 国产成人精品影院| 欧美日韩视频在线一区二区| 欧美一级电影网站| 国产精品丝袜在线| 亚洲1区2区3区视频| 国产一区二区91| 欧美日韩第一区日日骚| 久久久99免费| 日本欧美在线观看| 成人黄色片在线观看| 欧美一级高清片| 亚洲精品国产a久久久久久| 久久国产精品露脸对白| 色综合久久精品| 久久久精品tv| 日本成人中文字幕| 日本精品免费观看高清观看| 国产日韩av一区| 日本不卡视频在线观看| 色国产综合视频| 欧美国产激情一区二区三区蜜月| 日韩综合小视频| 99re这里只有精品首页| 久久精品一二三| 蜜桃视频一区二区三区在线观看| 色综合天天狠狠| 中文字幕一区二区三区乱码在线| 国内精品久久久久影院色| 欧美一激情一区二区三区| 三级亚洲高清视频| 欧美影视一区在线| 亚洲国产视频a| 在线观看视频一区二区欧美日韩| 综合激情成人伊人| av亚洲精华国产精华精华| 国产精品家庭影院| www.激情成人| 樱桃视频在线观看一区| 日本久久电影网| 天天av天天翘天天综合网色鬼国产 | 激情五月婷婷综合| 337p亚洲精品色噜噜噜| 日韩国产欧美在线视频| 欧美一级xxx| 国产精品一区二区不卡| 国产精品午夜久久| 99国产精品久久久久| 香蕉久久一区二区不卡无毒影院| 欧美年轻男男videosbes| 美女诱惑一区二区| 久久九九99视频| 欧美怡红院视频| 国产一区二区三区四| 最新日韩av在线| 91精品国模一区二区三区| 国产成人精品亚洲777人妖| 中文字幕一区二区三区不卡| 欧美在线|欧美| 国产精品1区2区| 一区二区三区在线视频播放| 91精品福利在线一区二区三区 | 国产偷国产偷亚洲高清人白洁| 97久久精品人人澡人人爽| 亚洲3atv精品一区二区三区| 国产亚洲欧美一级| 欧美日韩不卡视频| 99精品国产一区二区三区不卡| 亚洲国产精品久久不卡毛片| 久久精品这里都是精品| 91精品国产综合久久福利软件 | 中文字幕+乱码+中文字幕一区| 欧美日韩中字一区| 懂色av一区二区夜夜嗨| 视频在线观看91| 亚洲黄色在线视频| 国产精品久久久久三级| 久久先锋资源网| 精品久久久久99| 日韩美女主播在线视频一区二区三区| 成人免费视频一区|