掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
プロセスを実行可能な形でディスクに保存するには? (ID:49101)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
何時も参考にさせていただいています。ありがとうございます。 現在、Mr.Xray様の以下のプロジェクトを参考に、選択したプロセスを実行ファイルとして保存したいと 考えています。 http://mrxray.on.coocan.jp/Delphi/plSamples/330_AppProcessList.htm#06 現在作成中のプロジェクトでは、上記のプロジェクトに、以下の通りコードを追加しており、 ListView上でプロセスをダブルクリックすると、32bitプロセス限定ですがファイルとして保存されます。 (32bitプロセスに限定される理由については、先日、以下のスレッドで、ご教授いただきました。 https://www.petitmonte.com/bbs/answers?question_id=8833) しかし残念ながら、保存したファイルを実行しようとしても、有効なWin32アプリケーションではない旨のエラーが表示され、 動作してくれません。バイナリエディタでダンプしてみると、一見それっぽいのですが、ディスク上のファイルと比較すると、 PEヘッダの後方やファイルの末尾に0の列が追加されており、全体にフォーマットが崩れてしまっている様に見えます。 GetModuleInformationでサイズを取得すると、ディスク上のサイズより大きな値が戻る様です。 その差分の領域に0が並んでいる様にも見えますが、そうであるなら、ファイルの末尾に0が並びそうに思います。 何が間違っているかお気付きになることがあれば、お聞かせ下さい。 よろしくお願いします。 type TByteArray = array of Byte; ..... function QueryFullProcessImageNameA(Process: THandle; Flags: DWORD; Buffer: PChar; Size: PDWORD): Boolean; stdcall; external 'kernel32.dll'; function EnumProcessModulesEx(hProcess: Cardinal; lphModule: PDWORD;cb: Cardinal; var lpcbNeeded: Cardinal): pointer; stdcall; external 'PsAPI.dll'; ..... procedure TForm1.ListView1DblClick(Sender: TObject); var str : string; int : Integer; i : Integer; cb : Integer; selected : Cardinal; cbNeeded : Cardinal; pmc : PPROCESS_MEMORY_COUNTERS; Modules : Array of HMODULE; ModuleName : Array[0..MAX_PATH] of Char; ModuleInfo : TModuleInfo; pnt : pointer; hProcHandle : THandle; hOpen : THandle; hMod : THandle; hFile : THandle; null : DWORD; dSize : DWORD; dBaseAddr : DWORD; dRead : DWORD; dWritten : DWORD; bBuff : TByteArray; begin int := listview1.ItemIndex; selected := strtoint(ListView1.Items[int].SubItems[0]); str := ListView1.Items[int].Caption; str := ExtractFileName(str); cb := SizeOf(_PROCESS_MEMORY_COUNTERS); GetMem(pmc, cb); pmc^.cb := cb; hProcHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, selected); SetLength(Modules, 1024); cbNeeded := 0; if (hProcHandle <> 0) then begin try EnumProcessModulesEx(hProcHandle, @Modules[0], 1024 * SizeOf(HMODULE),cbNeeded); except Exit; end; SetLength(Modules, cbNeeded div SizeOf(HMODULE)); if (Length(Modules) > 0) then begin for i := 0 to Length(Modules) - 1 do begin try GetModuleBaseName(hProcHandle, Modules[i], ModuleName, SizeOf(ModuleName)); if (Pos(str, ModuleName) > 0) then begin GetModuleInformation(hProcHandle, Modules[i], @MoDuleInfo, SizeOf(ModuleInfo)); pnt := ModuleInfo.lpBaseOfDll; end; Except end; end; end; end; FreeMem(pmc); hOpen := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, selected); if hOpen <> INVALID_HANDLE_VALUE then begin EnumProcessModules(hOpen, @hMod, SizeOf(hMod), null); if GetModuleInformation(hOpen, hMod, @moduleinfo, SizeOf(moduleinfo)) then begin dSize := Cardinal(moduleinfo.SizeOfImage); dBaseAddr := Cardinal(moduleinfo.lpBaseOfDll); end; CloseHandle(hOpen); end; hOpen := OpenProcess(PROCESS_VM_READ, FALSE, selected); if hOpen <> INVALID_HANDLE_VALUE then begin SetLength(bBuff, dSize); ReadProcessMemory(hOpen, pnt, @bBuff[0], dSize, dRead); CloseHandle(hOpen); hFile := CreateFile(PChar('dump.exe'), GENERIC_WRITE or GENERIC_READ, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0); if hFile <> INVALID_HANDLE_VALUE then begin SetFilePointer(hFile, 0, nil, FILE_BEGIN); WriteFile(hFile, bBuff[0], dSize, dWritten, nil); CloseHandle(hFile); end; end; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.