public void Execute() { /* This might be overwritting something, but since we do not have paging working * there is really no 'better' alternative. I have test this though and I have * not noticed any bad side effects so I will assume this is somewhat safe... */ byte* ptr = (byte*)0x100; for (int i = 0; i < code.Length; i++) { ptr[i] = code[i]; } Caller c = new Caller(); c.CallCode(0x100); // Jump!!!!! }
public PE32(string path) { GruntyOS.IO.BinaryReader br = new GruntyOS.IO.BinaryReader(new GruntyOS.IO.FileStream(path, "r")); int p = 0; uint address = 0; uint data_addr = 0; uint ib = 0; for (int i = 0; i < (int)br.BaseStream.Data.Length; i++) { p = br.BaseStream.Position; if (br.ReadByte() == (byte)'P' && br.ReadByte() == (byte)'E') break; } br.BaseStream.Position = p; Console.WriteLine("Start: " + p.ToString()); byte[] hdr = new byte[(sizeof(PeHeader))]; for (int i = 0; i < sizeof(PeHeader); i++) { hdr[i] = br.ReadByte(); } fixed (byte* ptr = hdr) { PeHeader* header = (PeHeader*)ptr; Console.WriteLine(header->mMachine.ToString()); byte[] ohdr = new byte[header->mSizeOfOptionalHeader]; for (int i = 0; i < header->mSizeOfOptionalHeader; i++) { ohdr[i] = br.ReadByte(); } fixed (byte* ptr2 = ohdr) { Pe32OptionalHeader* opt = (Pe32OptionalHeader*)ptr2; Console.WriteLine(opt->mBaseOfCode.ToString()); byte[] tmp = new byte[40]; address = opt->mBaseOfCode; data_addr = opt->mBaseOfData; ib = opt->mImageBase; for (int s = 0; s < header->mNumberOfSections; s++) { fixed (byte* ptr3 = tmp) { for (int i = 0; i < 40; i++) { tmp[i] = br.ReadByte(); } SectionHeader* sec = (SectionHeader*)ptr3; string name = ""; for (int c = 0; sec->Name[c] != 0; c++) name += ((char)sec->Name[c]).ToString(); Section section = new Section(); section.Name = name; section.Address = (uint)sec->PointerToRawData; section.RelocationCount = (uint)sec->NumberOfRelocations; section.RelocationPtr = (uint)sec->PointerToRelocations; section.Size = (uint)sec->SizeOfRawData; Console.WriteLine(((int)(uint)sec->VirtualAddress).ToString()); sections.Add(section); } } } for (int i = 0; i < sections.Count; i++) { if (sections[i].Name == ".text") { text = new byte[sections[i].Size]; br.BaseStream.Position = (int)(uint)sections[i].Address; for (int b = 0; b < (int)(uint)sections[i].Size; b++) { text[b] = br.ReadByte(); } } else if (sections[i].Name == ".data") { data = new byte[sections[i].Size]; br.BaseStream.Position = (int)(uint)sections[i].Address; for (int b = 0; b < (int)(uint)sections[i].Size; b++) { data[b] = br.ReadByte(); } } } } // We do not have paging working and I an to lazy to relocate this // so we are just loading this were the PE header tells us to // may be bad, because we 'could' be overwritting something // in RAM. Im not sure.... Lets hope not byte* dptr = (byte*)ib + address; for (int i = 0; i < text.Length; i++) { dptr[i] = text[i]; } dptr = (byte*)ib + data_addr; for (int i = 0; i < data.Length; i++) { dptr[i] = data[i]; } Caller cl = new Caller(); cl.CallCode(ib + address); // Jump!!!!! }
public void Execute() { Caller c = new Caller(); c.CallCode(header->Entry); // Jump the start! }