<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409304&amp;view=findpost&amp;p=3680559</guid>
        <pubDate>Fri, 05 Aug 2016 21:43:02 +0000</pubDate>
        <title>Нестабильный запуск ExecuteFromMem</title>
        <link>https://forum.sources.ru/index.php?showtopic=409304&amp;view=findpost&amp;p=3680559</link>
        <description><![CDATA[MasterBoy: Наткнулся с нехорошей проблемой выполнения Portable Executable из MemoryStream<br>
<br>
Собственно сабж:<br>
<br>
Для запуска использовал код:<br>
<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{ uExecFromMem</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Author: steve10120</div><div class="code_line">&nbsp;&nbsp;Description: Run an executable from another&#39;s memory.</div><div class="code_line">&nbsp;&nbsp;Credits: Tan Chew Keong: Dynamic Forking of Win32 EXE; Author of BTMemoryModule: PerformBaseRelocation().</div><div class="code_line">&nbsp;&nbsp;Reference: http://www.security.org.sg/code/loadexe.html</div><div class="code_line">&nbsp;&nbsp;Release Date: 26th August 2009</div><div class="code_line">&nbsp;&nbsp;Website: http://ic0de.org</div><div class="code_line">&nbsp;&nbsp;History: First try</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Additions by testest 15th July 2010:</div><div class="code_line">&nbsp;&nbsp; &nbsp;- Parameter support</div><div class="code_line">&nbsp;&nbsp; &nbsp;- Win7 x64 support</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">unit uExecFromMem;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses Windows;</div><div class="code_line">&nbsp;</div><div class="code_line">function ExecuteFromMem(szFilePath, szParams: string; pFile: Pointer):DWORD;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">function NtUnmapViewOfSection(ProcessHandle:DWORD; BaseAddress:Pointer):DWORD; stdcall; external &#39;ntdll&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;PImageBaseRelocation = ^TImageBaseRelocation;</div><div class="code_line">&nbsp;&nbsp;TImageBaseRelocation = packed record</div><div class="code_line">&nbsp;&nbsp; &nbsp; VirtualAddress: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp; SizeOfBlock: DWORD;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure PerformBaseRelocation(f_module: Pointer; INH:PImageNtHeaders; f_delta: Cardinal); stdcall;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;l_i: Cardinal;</div><div class="code_line">&nbsp;&nbsp;l_codebase: Pointer;</div><div class="code_line">&nbsp;&nbsp;l_relocation: PImageBaseRelocation;</div><div class="code_line">&nbsp;&nbsp;l_dest: Pointer;</div><div class="code_line">&nbsp;&nbsp;l_relInfo: ^Word;</div><div class="code_line">&nbsp;&nbsp;l_patchAddrHL: ^DWord;</div><div class="code_line">&nbsp;&nbsp;l_type, l_offset: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;l_codebase := f_module;</div><div class="code_line">&nbsp;&nbsp;if INH^.OptionalHeader.DataDirectory[5].Size &#62; 0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;l_relocation := PImageBaseRelocation(Cardinal(l_codebase) + INH^.OptionalHeader.DataDirectory[5].VirtualAddress);</div><div class="code_line">&nbsp;&nbsp; &nbsp;while l_relocation.VirtualAddress &#62; 0 do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;l_dest := Pointer((Cardinal(l_codebase) + l_relocation.VirtualAddress));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;l_relInfo := Pointer(Cardinal(l_relocation) + 8);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for l_i := 0 to (trunc(((l_relocation.SizeOfBlock - 8) / 2)) - 1) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;l_type := (l_relInfo^ shr 12);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;l_offset := l_relInfo^ and $FFF;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if l_type = 3 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;l_patchAddrHL := Pointer(Cardinal(l_dest) + Cardinal(l_offset));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;l_patchAddrHL^ := l_patchAddrHL^ + f_delta;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;inc(l_relInfo);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;l_relocation := Pointer(cardinal(l_relocation) + l_relocation.SizeOfBlock);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function AlignImage(pImage:Pointer):Pointer;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;IDH: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PImageDosHeader;</div><div class="code_line">&nbsp;&nbsp;INH: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PImageNtHeaders;</div><div class="code_line">&nbsp;&nbsp;ISH: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PImageSectionHeader;</div><div class="code_line">&nbsp;&nbsp;i: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WORD;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;IDH := pImage;</div><div class="code_line">&nbsp;&nbsp;INH := Pointer(Integer(pImage) + IDH^._lfanew);</div><div class="code_line">&nbsp;&nbsp;GetMem(Result, INH^.OptionalHeader.SizeOfImage);</div><div class="code_line">&nbsp;&nbsp;ZeroMemory(Result, INH^.OptionalHeader.SizeOfImage);</div><div class="code_line">&nbsp;&nbsp;CopyMemory(Result, pImage, INH^.OptionalHeader.SizeOfHeaders);</div><div class="code_line">&nbsp;&nbsp;for i := 0 to INH^.FileHeader.NumberOfSections - 1 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;ISH := Pointer(Integer(pImage) + IDH^._lfanew + 248 + i * 40);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CopyMemory(Pointer(DWORD(Result) + ISH^.VirtualAddress), Pointer(DWORD(pImage) + ISH^.PointerToRawData), ISH^.SizeOfRawData);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function Get4ByteAlignedContext(var Base: PContext): PContext;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Base := VirtualAlloc(nil, SizeOf(TContext) + 4, MEM_COMMIT, PAGE_READWRITE);</div><div class="code_line">&nbsp;&nbsp;Result := Base;</div><div class="code_line">&nbsp;&nbsp;if Base &#60;&#62; nil then</div><div class="code_line">&nbsp;&nbsp; &nbsp;while ((DWORD(Result) mod 4) &#60;&#62; 0) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := Pointer(DWORD(Result) + 1);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function ExecuteFromMem(szFilePath, szParams:string; pFile:Pointer):DWORD;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;PI: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TProcessInformation;</div><div class="code_line">&nbsp;&nbsp;SI: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TStartupInfo;</div><div class="code_line">&nbsp;&nbsp;CT: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PContext;</div><div class="code_line">&nbsp;&nbsp;CTBase: &nbsp; &nbsp; &nbsp; PContext;</div><div class="code_line">&nbsp;&nbsp;IDH: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PImageDosHeader;</div><div class="code_line">&nbsp;&nbsp;INH: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PImageNtHeaders;</div><div class="code_line">&nbsp;&nbsp;dwImageBase: &nbsp;DWORD;</div><div class="code_line">&nbsp;&nbsp;pModule: &nbsp; &nbsp; &nbsp;Pointer;</div><div class="code_line">&nbsp;&nbsp;dwNull: &nbsp; &nbsp; &nbsp; DWORD;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if szParams &#60;&#62; &#39;&#39; then szParams := &#39;&quot;&#39;+szFilePath+&#39;&quot; &#39;+szParams;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Result := 0;</div><div class="code_line">&nbsp;&nbsp;IDH := pFile;</div><div class="code_line">&nbsp;&nbsp;if IDH^.e_magic = IMAGE_DOS_SIGNATURE then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;INH := Pointer(Integer(pFile) + IDH^._lfanew);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if INH^.Signature = IMAGE_NT_SIGNATURE then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FillChar(SI, SizeOf(TStartupInfo), #0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FillChar(PI, SizeOf(TProcessInformation), #0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SI.cb := SizeOf(TStartupInfo);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if CreateProcess(PChar(szFilePath), PChar(szParams), nil, nil, FALSE, CREATE_SUSPENDED, nil, nil, SI, PI) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CT := Get4ByteAlignedContext(CTBase);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if CT &#60;&#62; nil then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CT.ContextFlags := CONTEXT_FULL;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if GetThreadContext(PI.hThread, CT^) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ReadProcessMemory(PI.hProcess, Pointer(CT.Ebx + 8), @dwImageBase, 4, dwNull);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if dwImageBase = INH^.OptionalHeader.ImageBase then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if NtUnmapViewOfSection(PI.hProcess, Pointer(INH^.OptionalHeader.ImageBase)) = 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pModule := VirtualAllocEx(PI.hProcess, Pointer(INH^.OptionalHeader.ImageBase), INH^.OptionalHeader.SizeOfImage, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pModule := VirtualAllocEx(PI.hProcess, nil, INH^.OptionalHeader.SizeOfImage, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pModule := VirtualAllocEx(PI.hProcess, Pointer(INH^.OptionalHeader.ImageBase), INH^.OptionalHeader.SizeOfImage, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if pModule &#60;&#62; nil then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pFile := AlignImage(pFile);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if DWORD(pModule) &#60;&#62; INH^.OptionalHeader.ImageBase then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PerformBaseRelocation(pFile, INH, (DWORD(pModule) - INH^.OptionalHeader.ImageBase));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;INH^.OptionalHeader.ImageBase := DWORD(pModule);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CopyMemory(Pointer(Integer(pFile) + IDH^._lfanew), INH, 248);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WriteProcessMemory(PI.hProcess, pModule, pFile, INH.OptionalHeader.SizeOfImage, dwNull);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WriteProcessMemory(PI.hProcess, Pointer(CT.Ebx + 8), @pModule, 4, dwNull);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CT.Eax := DWORD(pModule) + INH^.OptionalHeader.AddressOfEntryPoint;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetThreadContext(PI.hThread, CT^);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ResumeThread(PI.hThread);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := PI.hThread;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VirtualFree(CTBase, 0, MEM_RELEASE);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if Result = 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TerminateProcess(PI.hProcess, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
</div></div><br>
<a class='tag-url' href='http://www.delphibasics.info/home/delphibasicssnippets/uexecfrommembysteve10120-fixedforwin7x64bytestest' target='_blank'>Оригинал тут</a><br>
<br>
Беда в том что срабатывает он на x64 через раз, совершенно рандомно, я пробовал менять {&#036;IMAGEBASE &#036;40000000} на основном процессе - пофигу абсолютно и вообще, такое впечатление что зависит синхронизации {&#036;IMAGEBASE} родительского процесса, но я не уверен.<br>
<br>
Любые мысли, предложения, итп. Спасибо за внимание.]]></description>
        <author>MasterBoy</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	