Assembly 将数据写入正在运行的可执行文件

Assembly 将数据写入正在运行的可执行文件,assembly,process,reverse-engineering,masm32,Assembly,Process,Reverse Engineering,Masm32,我正在尝试运行一个进程,等待它完成,打开可执行文件,然后向其中写入一些内容。因此,我创建了一个小型的“加载器”,它正是这样做的。 这是我的代码: ;Run the executable INVOKE GetStartupInfo,OFFSET startInfo INVOKE CreateProcess, ADDR SomeExecutableFile, \ NULL, NULL, NULL, FALSE, \ NORMAL_PRIORITY_CLASS, NULL,NUL

我正在尝试运行一个进程,等待它完成,打开可执行文件,然后向其中写入一些内容。因此,我创建了一个小型的“加载器”,它正是这样做的。 这是我的代码:

;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打开它。 创建文件失败,我得到一个无效的\u句柄…,最后一个错误-0x20-错误\u共享\u冲突

为什么会发生这种情况

想法和注意事项: 1) 从“加载器”创建另一个进程,打开可执行文件(在等待它完成执行后)并向其写入—它可以工作。 2) 进程似乎仍然处于打开状态,即文件仍然被映射,这解释了错误,但我不明白为什么要映射它。 3) 使用Olly&ProcessExplorer进行调试时,我发现即使在进程终止后,Olly仍然会打开此文件的句柄,并且所有句柄都已关闭-我不明白为什么,以及如何关闭它:)

欢迎提出任何想法!:)

1-尝试使用:

invoke CreateProcess, ADDR Process, NULL, NULL, NULL, NULL, CREATE_SUSPENDED, NULL, NULL, ADDR startInfo, ADDR processInfo
创建你应该做到这一点

2-是否需要修改文件本身?加载程序通常用于修改内存中的程序。不久前,我用WriteProcessMemory编写了一个加载程序:

.586 
.model flat,stdcall 
option casemap:none 

include D:\masm32\include\windows.inc 
include D:\masm32\include\user32.inc 
include D:\masm32\include\kernel32.inc 
includelib D:\masm32\lib\user32.lib 
includelib D:\masm32\lib\kernel32.lib 

.data 
  Process byte "prog.exe",0 
  Error byte "Error:",0 
  ErrorMessage byte "Process not loaded",0 
  ReplaceBy byte 0Fh,82h
  ReplaceSize dword 2 
  AddressToPatch dword 01003B7Ch 
  Startup STARTUPINFO <> 
  processinfo PROCESS_INFORMATION <> 

.data? 
  byteswritten dword ?

.code 
  start: 
    invoke CreateProcess, ADDR Process, NULL, NULL, NULL, NULL, CREATE_SUSPENDED, NULL, NULL, ADDR Startup, ADDR processinfo 
    cmp eax, 0 
    jne ProcessCreated 
    push 0 
    push offset Error 
    push offset ErrorMessage 
    push 0 
    call MessageBox 
    push 0 
    call ExitProcess 

    ProcessCreated: 
        invoke WriteProcessMemory, processinfo.hProcess, AddressToPatch, ADDR ReplaceBy, ReplaceSize, byteswritten 
        invoke ResumeThread, processinfo.hThread 
    push 0 
    call ExitProcess 
  end start
.586
.平板模型,标准球
选项案例图:无
包含D:\masm32\include\windows.inc
包含D:\masm32\include\user32.inc
包含D:\masm32\include\kernel32.inc
includelib D:\masm32\lib\user32.lib
includelib D:\masm32\lib\kernel32.lib
.数据
进程字节“prog.exe”,0
错误字节“错误:”,0
ErrorMessage字节“未加载进程”,0
替换字节0Fh,82h
替换尺寸dword 2
地址批次dword 01003B7Ch
启动信息
processinfo进程信息
.数据?
拜德福德?
.代码
开始:
调用CreateProcess,ADDR Process,NULL,NULL,NULL,CREATE\u挂起,NULL,NULL,ADDR启动,ADDR processinfo
cmp-eax,0
jne进程创建
推0
推偏误差
推送偏移错误消息
推0
呼叫信息箱
推0
呼叫退出过程
创建的进程:
调用WriteProcessMemory、processinfo.hpProcess、AddressToPatch、ADDR ReplaceBy、ReplaceSize、BytesWrite
调用ResumeThread,processinfo.hThread
推0
呼叫退出过程
结束-开始