public override void ApplyFixup() { var vtableFixupBuilder = PE.Tasks.Get <VTableFixupBuilder>(true); // Fix IA64 stub { ulong VA = _codeBlob.RVA + PE.ImageBase; int pos = _codeBlobPos + 32; _codeBlob.Write(ref pos, (ulong)VA); } // Fix VA of method { var fixupBlob = vtableFixupBuilder.DataBlob; ulong VA = (ulong)fixupBlob.RVA + (ulong)PE.ImageBase + (ulong)vtableFixupBuilder.GetFixupOffset(_fixup); int pos = _codeBlobPos + 40; _codeBlob.Write(ref pos, (ulong)VA); } }
public override void ApplyFixup() { var importBuilder = PE.Tasks.Get <ImportBuilder>(true); // Fix IA64 stub { ulong VA = _blob.RVA + PE.ImageBase; int pos = 32; _blob.Write(ref pos, (ulong)VA); } // Fix VA of IAT { var iatBlob = importBuilder.IATBlob; if (iatBlob == null) { return; } ulong VA = (ulong)iatBlob.RVA + (ulong)PE.ImageBase + (ulong)importBuilder.GetIATOffset(_entry); int pos = 40; _blob.Write(ref pos, (ulong)VA); } // Set entry point PE.AddressOfEntryPoint = _blob.RVA + 32; }
public override void Build() { if (_table == null || _table.Count == 0) { return; } _blob = new BuildBlob(); _dataBlob = new BuildBlob(); int pos = 0; int dataPos = 0; for (int i = 0; i < _table.Count; i++) { var fixup = _table[i]; if (fixup.Count == 0) { continue; } _blob.Write(ref pos, (uint)dataPos); // RVA _blob.Write(ref pos, (ushort)fixup.Count); // Count _blob.Write(ref pos, (ushort)fixup.Type); // Type bool is32Bits = ((fixup.Type & VTableFixupType.SlotSize32Bit) == VTableFixupType.SlotSize32Bit); for (int j = 0; j < fixup.Count; j++) { _dataBlob.Write(ref dataPos, (uint)fixup[j]); if (!is32Bits) { _dataBlob.Write(ref dataPos, (uint)0); } } } // Add fixups PE.Fixups.Add(new WriteDataRVAFixup(this)); // Add blobs var section = PE.GetSection(_sectionName); section.Blobs.Add(_blob, _blobPriority); section = PE.GetSection(_dataSectionName); section.Blobs.Add(_dataBlob, _dataBlobPriority); }
public override void ApplyFixup() { var vtableFixupBuilder = PE.Tasks.Get <VTableFixupBuilder>(true); // Fix VA of method var fixupBlob = vtableFixupBuilder.DataBlob; uint VA = (uint)fixupBlob.RVA + (uint)PE.ImageBase + (uint)vtableFixupBuilder.GetFixupOffset(_fixup); int pos = _codeBlobPos + 2; _codeBlob.Write(ref pos, (uint)VA); }
public override void ApplyFixup() { var importBuilder = PE.Tasks.Get <ImportBuilder>(true); // Fix VA of IAT var iatBlob = importBuilder.IATBlob; if (iatBlob == null) { return; } uint VA = (uint)iatBlob.RVA + (uint)PE.ImageBase + (uint)importBuilder.GetIATOffset(_entry); int pos = 2; _blob.Write(ref pos, (uint)VA); // Set entry point PE.AddressOfEntryPoint = _blob.RVA; }