Esempio n. 1
0
 private bool ProcessRtlCluster(RtlInstructionCluster ric)
 {
     state.SetInstructionPointer(ric.Address);
     foreach (var rtlInstr in ric.Instructions)
     {
         ri = rtlInstr;
         if (!ri.Accept(this))
         {
             return(false);
         }
     }
     return(true);
 }
Esempio n. 2
0
 private bool ProcessRtlCluster(RtlInstructionCluster ric)
 {
     if (ric.Address.ToLinear() == 0x30C)        //$DEBUG
     {
         ric.Address.ToString();
     }
     state.SetInstructionPointer(ric.Address);
     SetAssumedRegisterValues(ric.Address);
     foreach (var rtlInstr in ric.Instructions)
     {
         ri = rtlInstr;
         if (!ri.Accept(this))
         {
             return(false);
         }
     }
     return(true);
 }
Esempio n. 3
0
        public void ProcessInternal()
        {
            state.ErrorListener = (message) => { scanner.Warn(ric.Address, message); };
            blockCur            = scanner.FindContainingBlock(addrStart);
            if (BlockHasBeenScanned(blockCur))
            {
                return;
            }
            Debug.Print("Scanning jump target {0}", addrStart);
            frame         = blockCur.Procedure.Frame;
            this.stackReg = frame.EnsureRegister(arch.StackRegister);
            rtlStream     = scanner.GetTrace(addrStart, state, frame)
                            .GetEnumerator();

            while (rtlStream.MoveNext())
            {
                ric = rtlStream.Current;
                if (blockCur != scanner.FindContainingBlock(ric.Address))
                {
                    break;
                }
                state.SetInstructionPointer(ric.Address);
                foreach (var rtlInstr in ric.Instructions)
                {
                    ri = rtlInstr;
                    if (!ri.Accept(this))
                    {
                        return;
                    }
                }
                var blNext = FallenThroughNextBlock(ric.Address + ric.Length);
                if (blNext != null)
                {
                    EnsureEdge(blockCur.Procedure, blockCur, blNext);
                    return;
                }
            }
        }