远程注入本地过程(函数)问题,如何取得返回值(200)

  • 主题发起人 主题发起人 zanpen2001
  • 开始时间 开始时间
Z

zanpen2001

Unregistered / Unconfirmed
GUEST, unregistred user!
最近在学习createRemoteThread函数下面是我的一个例程,可以顺利编译和运行,但是无法用MESSAGEBOX弹出文本读取的内容下面是我的代码,可能我的问题比较低级,大家别笑我,帮帮忙<code>program inj;{$IMAGEBASE $11110000}{$APPTYPE CONSOLE}uses windows;procedure testfunc;stdcall;var content: pchar; FileHandle: THandle; TxtFileSize: dword; BytesReads: Cardinal;begin FileHandle := CreateFile(PCHAR('test.txt'), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if FileHandle <> INVALID_HANDLE_VALUE then begin TxtFileSize := GetFileSize(FileHandle, nil); GetMem(content, TxtFileSize); ReadFile(FileHandle, content^, TxtFileSize, BytesReads, nil); CloseHandle(FileHandle); end; Messagebox(0,content,'',mb_ok);end;procedure Inject(ProcessHandle: longword; EntryPoint: pointer);var Module, NewModule: Pointer; Size, BytesWritten, TID: longword;begin Module := Pointer(GetModuleHandle(nil)); Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage; VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE); NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten); CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID);end;var ProcessHandle, Pid: longword;begin GetWindowThreadProcessId(FindWindow('WMPlayerApp', nil), @PID); ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID); Inject(ProcessHandle, @testfunc); CloseHandle(ProcessHandle);end.</code>content中的应该就是注入函数读取的txt文本的内容了,可在messagebox中显示为空白我曾用非注入的方式测试过testfunc,是可以成功运行的我想用纯api来解决我的问题,pascal的内容不想涉及
 
我将函数改成如下形式,还是不行。。function TextContent(const fn: pchar; var content: pchar): bool; stdcall;var FileHandle: THandle; TxtFileSize: dword; clength: cardinal;begin result := False; FileHandle := CreateFile(PCHAR(fn), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if FileHandle = INVALID_HANDLE_VALUE then exit else begin TxtFileSize := GetFileSize(FileHandle, nil); ReadFile(FileHandle, content^, TxtFileSize, clength, nil); CloseHandle(FileHandle); result := True; end;end;procedure testfunc; stdcall;var content: pchar;begin getmem(content, 255); textcontent('ttt.txt', content); Messagebox(0, content, '', mb_ok); freemem(content);end;
 
注入用DLL实现才行你将testfunc做成DLL,然后调用kernal loadlibrary,实现远程线程的注入
 
to 枝上柳绵: 我知道用dll可以,但我不想用dll,在testfunc里只写messagebox(),显示一句话的提示,是可以运行的,想不通为什么一定要用dll,谁给讲讲?
 
为何要用dll ,看HookAPI.pas,Google上下载即可
 
你的代码在本进程里,你的线程在远程进程里,用远程进程的线程来访问本进程的代码,是不可以的用DLL就可能将代码加载到远程进程里,这样就可能运行了
 
看来我要去研究hookapi了,自始至终不喜欢dll,我喜欢精炼短小的程序
 
远程注入,必须用dll,只有dll才能加载到其他进程的内存地址中
 
接受答案了
 
后退
顶部