我试图运行一个进程,等待它完成,打开可执行文件并向其中写入内容。所以我创造了一个小的“装载机”,正是这个。 这是我的代码:将数据写入正在运行的可执行文件
;Run the executable
INVOKE GetStartupInfo,OFFSET startInfo
INVOKE CreateProcess, ADDR SomeExecutableFile, \
NULL, NULL, NULL, FALSE, \
NORMAL_PRIORITY_CLASS, NULL,NULL, \
OFFSET startInfo, OFFSET processInfo
INVOKE CloseHandle, processInfo.hThread
;Wait for it to finish & Close handle
INVOKE WaitForSingleObjectEx, processInfo.hProcess, INFINITE, FALSE
INVOKE CloseHandle, processInfo.hProcess
;Try to open the same exe file which just finished executing.
INVOKE CreateFile, OFFSET SomeExecutableFile,GENERIC_WRITE \
,0, 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
MOV hFile, EAX
.IF hFile== INVALID_HANDLE_VALUE
INVOKE MessageBox,NULL, OFFSET Problem, OFFSET Problem, MB_ICONWARNING
.ELSE
INVOKE WriteFile, hFile, Buffer, 5, OFFSET BytesWritten , NULL
INVOKE CloseHandle,hFile
.ENDIF
INVOKE ExitProcess,0
正如你所看到的,“SomeExecutable”文件正在跑。它停止执行后,它将使用CreateFile打开。 创建文件失败,我得到一个INVALID_HANDLE ....,最后一个错误 - 0x20 - ERROR_SHARING_VIOLATION。
为什么会发生这种情况?
想法&备注: 1)从打开可执行文件的“loader”中创建另一个进程(等待它完成执行后)并写入它 - 它的工作原理。 2)看起来过程仍然是开放的,即文件仍然映射,这解释了错误,但我不明白为什么它会被映射。 3)使用Olly进行调试& ProcessExplorer我看到,即使在进程终止后,Olly也确实打开了此文件的句柄,并且所有句柄都已关闭 - 我不明白为什么,以及我该如何关闭它。
欢迎任何想法! :)