public override EditResult Write(int address, byte[] data, byte[] oriData, LabelCollection labels)
        {
            // find a code cave
            int caveAddress = FindCodeCave(data, address, codeData.Count + 5);

            if (caveAddress == 0)
            {
                return(EditResult.NoHookspace);
            }



            // write hook
            jmpBytes.CopyTo(data, address);
            int jmpLen = jmpBytes.Length + 4;

            byte[] buffer = BitConverter.GetBytes(caveAddress - (address + jmpLen));
            buffer.CopyTo(data, address + jmpBytes.Length);

            // fill rest with nops
            for (int i = jmpLen; i < hookLen; i++)
            {
                data[address + i] = 0x90;
            }



            // write into code cave
            codeData.CopyTo(data, caveAddress);

            // jmp back
            data[caveAddress + codeData.Count] = 0xE9;
            // jmpBackLabel address will be resolved by BinRefTo
            return(base.Write(caveAddress + codeData.Count + 1, data, oriData, labels));
        }
예제 #2
0
        public override EditResult Write(int address, byte[] data, byte[] oriData, LabelCollection labels)
        {
            // find code cave
            int caveAddress = FindCodeCave(data, address, editData.Length);

            if (caveAddress == 0)
            {
                return(EditResult.NoHookspace);
            }



            // write into code cave
            editData.CopyTo(data, caveAddress);



            // write redirection
            int redirectAddress;

            if (this.relative)
            {
                redirectAddress = caveAddress - (address + 4);
            }
            else
            {
                redirectAddress = caveAddress + 0x400000;
            }

            byte[] buffer = BitConverter.GetBytes(redirectAddress);
            buffer.CopyTo(data, address);

            return(EditResult.NoErrors);
        }
        public override EditResult Write(int address, byte[] data, byte[] oriData, LabelCollection labels)
        {
            int labelAddress = labels.GetLabel(this.labelName);

            int refAddress = labelAddress;

            if (relative)
            {
                refAddress -= (address + 4);
            }

            byte[] buf = BitConverter.GetBytes(refAddress);
            buf.CopyTo(data, address);

            return(EditResult.NoErrors);
        }
예제 #4
0
 public override EditResult Write(int address, byte[] data, byte[] oriData, LabelCollection labels)
 {
     this.address = BitConverter.ToInt32(oriData, address + this.offset);
     return(EditResult.NoErrors);
 }
 public override EditResult Write(int address, byte[] data, byte[] oriData, LabelCollection labels)
 {
     return(EditResult.NoErrors);
 }