Сейчас на форуме: tyns777 (+5 невидимых) |
![]() |
eXeL@B —› Программирование —› decrypt and run executable file from memory delphi |
Посл.ответ | Сообщение |
|
Создано: 14 сентября 2007 22:32 · Личное сообщение · #1 Hello I want to decrypt and run executable file from memory i found this code but when i try to use it with compressed or setup file gives me error. type TSections = array [0..0] of TImageSectionHeader; function GetAlignedSize(Size: dword; Alignment: dword): dword; begin if ((Size mod Alignment) = 0) then Result := Size; else Result := ((Size div Alignment) + 1) * Alignment; end; function ImageSize(Image: pointer): dword; var Alignment: dword; ImageNtHeaders: PImageNtHeaders; PSections: ^TSections; SectionLoop: dword; begin ImageNtHeaders := pointer(dword(dword(Image)) + dword(PImageDosHeader(Image)._lfanew)); Alignment := ImageNtHeaders.OptionalHeader.SectionAlignment; if ((ImageNtHeaders.OptionalHeader.SizeOfHeaders mod Alignment) = 0) then begin Result := ImageNtHeaders.OptionalHeader.SizeOfHeaders; end else begin Result := ((ImageNtHeaders.OptionalHeader.SizeOfHeaders div Alignment) + 1) * Alignment; end; PSections := pointer(pchar(@(ImageNtHeaders.OptionalHeader)) + ImageNtHeaders.FileHeader.SizeOfOptionalHeader); for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do begin if PSections[SectionLoop].Misc.VirtualSize <> 0 then begin if ((PSections[SectionLoop].Misc.VirtualSize mod Alignment) = 0) then begin Result := Result + PSections[SectionLoop].Misc.VirtualSize; end else begin Result := Result + (((PSections[SectionLoop].Misc.VirtualSize div Alignment) + 1) * Alignment); end; end; end; end; procedure CreateProcessEx(FileMemory: pointer); var BaseAddress, Bytes, HeaderSize, InjectSize, SectionLoop, SectionSize: dword; Context: TContext; FileData: pointer; ImageNtHeaders: PImageNtHeaders; InjectMemory: pointer; ProcInfo: TProcessInformation; PSections: ^TSections; StartInfo: TStartupInfo; begin ImageNtHeaders := pointer(dword(dword(FileMemory)) + dword(PImageDosHeader(FileMemory)._lfanew)); InjectSize := ImageSize(FileMemory); GetMem(InjectMemory, InjectSize); try FileData := InjectMemory; HeaderSize := ImageNtHeaders.OptionalHeader.SizeOfHeaders; PSections := pointer(pchar(@(ImageNtHeaders.OptionalHeader)) + ImageNtHeaders.FileHeader.SizeOfOptionalHeader); for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do begin if PSections[SectionLoop].PointerToRawData < HeaderSize then HeaderSize := PSections[SectionLoop].PointerToRawData; end; CopyMemory(FileData, FileMemory, HeaderSize); FileData := pointer(dword(FileData) + GetAlignedSize(ImageNtHeaders.OptionalHeader.SizeOfHeaders, ImageNtHeaders.OptionalHeader.SectionAlignment)); for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do begin if PSections[SectionLoop].SizeOfRawData > 0 then begin SectionSize := PSections[SectionLoop].SizeOfRawData; if SectionSize > PSections[SectionLoop].Misc.VirtualSize then SectionSize := PSections[SectionLoop].Misc.VirtualSize; CopyMemory(FileData, pointer(dword(FileMemory) + PSections[SectionLoop].PointerToRawData), SectionSize); FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop].Misc.VirtualSize, ImageNtHeaders.OptionalHeader.SectionAlignment)); end else begin if PSections[SectionLoop].Misc.VirtualSize <> 0 then FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop].Misc.VirtualSize, ImageNtHeaders.OptionalHeader.SectionAlignment)); end; end; ZeroMemory(@StartInfo, SizeOf(StartupInfo)); ZeroMemory(@Context, SizeOf(TContext)); CreateProcess(nil, pchar(ParamStr(0)), nil, nil, False, CREATE_SUSPENDED, nil, nil, StartInfo, ProcInfo); Context.ContextFlags := CONTEXT_FULL; GetThreadContext(ProcInfo.hThread, Context); ReadProcessMemory(ProcInfo.hProcess, pointer(Context.Ebx + 8), @BaseAddress, 4, Bytes); VirtualAllocEx(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBase), InjectSize, MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE); WriteProcessMemory(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBase), InjectMemory, InjectSize, Bytes); WriteProcessMemory(ProcInfo.hProcess, pointer(Context.Ebx + 8), @ImageNtHeaders.OptionalHeader.ImageBase, 4, Bytes); Context.Eax := ImageNtHeaders.OptionalHeader.ImageBase + ImageNtHeaders.OptionalHeader.AddressOfEntryPoint; SetThreadContext(ProcInfo.hThread, Context); ResumeThread(ProcInfo.hThread); finally FreeMemory(InjectMemory); end; end; //-------------------------------------------------------------------- --------------------------------------------------- var MyStream: TMemoryStream; begin MyStream := TMemoryStream.Create; try MyStream.LoadFromFile('Pro.exe'); //MyStream.LoadFromStream(yourstream); CreateProcessEx(MyStream.Memory); finally MyStream.Free; end; end; don't forget to include CreateProcessEX from the link above also something verry important change image base of your program bu adding something like yhis: {$IMAGEBASE $10000000} Help Please ![]() |
|
Создано: 15 сентября 2007 00:56 · Личное сообщение · #2 |
|
Создано: 15 сентября 2007 12:53 · Личное сообщение · #3 |
|
Создано: 15 сентября 2007 13:11 · Личное сообщение · #4 |
|
Создано: 16 сентября 2007 00:07 · Личное сообщение · #5 |
|
Создано: 16 сентября 2007 01:45 · Поправил: dj-siba · Личное сообщение · #6 |
|
Создано: 16 сентября 2007 08:27 · Личное сообщение · #7 well, that has probably to do with how the compressed/setup files work. I coded some applications that actually store data in the executable and the way I extracted it was to get the application.exename, open it in readonly mode, seek to the end of the actual applicaiton data (computed at compile time) and start extracting the data. with this approach, there will not be a correct application.exename file on disk to apply this extraction. so, no matter the implementation, an aproach like this (loading directly in memory) will obviously not work with every executable. i got that from www.delphipages.com/threads/thread.cfm?ID=187975&G=187946 So I think if the file was setup type will not work or if it was protected with some kind of protectors which protect or block memory also will not work. ![]() |
|
Создано: 16 сентября 2007 12:09 · Поправил: dj-siba · Личное сообщение · #8 |
|
Создано: 16 сентября 2007 13:50 · Личное сообщение · #9 |
|
Создано: 16 сентября 2007 13:57 · Личное сообщение · #10 |
|
Создано: 17 сентября 2007 13:09 · Личное сообщение · #11 |
|
Создано: 17 сентября 2007 22:19 · Личное сообщение · #12 |
|
Создано: 18 сентября 2007 13:28 · Личное сообщение · #13 |
|
Создано: 18 сентября 2007 18:26 · Личное сообщение · #14 |
|
Создано: 18 сентября 2007 18:48 · Личное сообщение · #15 Hi again 1- When i execute file protected with Themedia gives error message: File corrupted, this file won't work anymore. 2- When i execute file setup Doesn’t work at all. 3- When i execute file protected with armadillo Doesn’t work at all. 4- When i execute file protected with thinstall gives error message: The data is invalid. Windows xp sp2 and vista business. So how it works well with you? Do you have any another idea to decrypt file to memory and execute it from there? How TZ Exelock works all files behave normal how to decrypt files and execute them from *.dat file without extracting first to hard disk? Help please ![]() |
|
Создано: 18 сентября 2007 18:53 · Поправил: dj-siba · Личное сообщение · #16 |
|
Создано: 18 сентября 2007 19:02 · Личное сообщение · #17 |
|
Создано: 18 сентября 2007 19:16 · Личное сообщение · #18 |
|
Создано: 19 сентября 2007 12:14 · Личное сообщение · #19 |
|
Создано: 19 сентября 2007 12:54 · Личное сообщение · #20 |
|
Создано: 19 сентября 2007 13:33 · Поправил: sER · Личное сообщение · #21 |
|
Создано: 19 сентября 2007 15:34 · Личное сообщение · #22 |
|
Создано: 19 сентября 2007 15:59 · Личное сообщение · #23 |
|
Создано: 19 сентября 2007 16:07 · Личное сообщение · #24 |
![]() |
eXeL@B —› Программирование —› decrypt and run executable file from memory delphi |