200分求 由A程序中启动B程序的方法(200)

  • 主题发起人 主题发起人 kiiir00t
  • 开始时间 开始时间
K

kiiir00t

Unregistered / Unconfirmed
GUEST, unregistred user!
条件: B程序可以独立运行结果: B程序不能正常运行 必须由A程序来启动B程序,方可让B程序正常运行例如:运行B.EXE 显示"HELLO!" 编写A,由A.EXE来启动B.EXE,显示"HELLO!",此时单独运行B.EXE 不能显示"HELLO!"跪求高人指点!!!
 
获得父进程信息判断,从别处抄个:// ntdll!NtQueryInformationProcess (NT specific!)//// The function copies the process information of the// specified type into a buffer//// NTSYSAPI// NTSTATUS// NTAPI// NtQueryInformationProcess(// IN HANDLE ProcessHandle, // handle to process// IN PROCESSINFOCLASS InformationClass, // information type// OUT PVOID ProcessInformation, // pointer to buffer// IN ULONG ProcessInformationLength, // buffer size in bytes// OUT PULONG ReturnLength OPTIONAL // pointer to a 32-bit// // variable that receives// // the number of bytes// // written to the buffer// );function GetParentProcessID(dwId: DWORD): DWORD;const ProcessBasicInformation = 0;type TPROCESS_BASIC_INFORMATION = packed record ExitStatus : DWORD; PebBaseAddress : DWORD; AffinityMask : DWORD; BasePriority : DWORD; UniqueProcessId : ULONG; InheritedFromUniqueProcessId: ULONG; end; TNtQueryInformationProcess = function( ProcessHandle: THandle; ProcessInformationClass: Integer; ProcessInformation: Pointer; ProcessInformationLength: ULong; ReturnLength: PULong): Integer; stdcall;var NtQueryInformationProcess :TNtQueryInformationProcess; status : LONGINT; hProcess : THandle; pbi : TPROCESS_BASIC_INFORMATION;begin Result := DWORD(-1); NtQueryInformationProcess := GetProcAddress( GetModuleHandle('ntdll'),'NtQueryInformationProcess'); if @NtQueryInformationProcess = nil then Exit; // Get process handle hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwId); if hProcess <> 0 then begin // Retrieve information status := NtQueryInformationProcess(hProcess, ProcessBasicInformation, @pbi, sizeof(TPROCESS_BASIC_INFORMATION), nil); // Copy parent Id on success if status = 0 then Result := pbi.InheritedFromUniqueProcessId; CloseHandle (hProcess); end;end;function GetProcessName(dwid: THandle): String;var h : THandle; iLen : integer; hMod : HMODULE; cbNeeded : DWORD; hProcess : DWORD;begin Result := ''; h := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, dwID); if h > 0 then begin if EnumProcessModules(h, @hMod, sizeof(hMod), cbNeeded) then begin SetLength(Result, MAX_PATH); iLen := GetModuleFileNameEx(h, hMod, PChar(Result), MAX_PATH); if iLen <> 0 then begin SetLength(Result, StrLen(PCHAR(Result))); end; end; CloseHandle(h); end;end;procedure TForm9.Button1Click(Sender: TObject);begin ShowMessage(GetProcessName(GetParentProcessID(GetCurrentProcessID)));end;
 
1>A启动B程序时,将A主界面的句柄作为B程序启动的一个参数。2>B启动后,如果发现没有启动参数,则自动退出,否则,通过该参数,向该句柄发送一个自定义的消息。3>A收到该自定义的消息后,进行消息回复,容许B继续运行。4>如果B没有收到A返回的消息,则退出。-----------------------------------在System单元中有个ParamCount和ParamStr函数,它们表示程序启动时候的参数信息-------------进程之间发送字符串 procedure PostStrToOther(H: HWND; OtherStr: string); var DS: TCopyDataStruct; begin ShowMessage('发送:' + OtherStr); Ds.cbData := Length(OtherStr) + 1; //或者是结构体长度 sizeof(结构体变量) GetMem(Ds.lpData, Ds.cbData); StrCopy(ds.lpData, PChar(OtherStr)); SendMessage(H, WM_COPYDATA, Application.Handle, Cardinal(@ds)); FreeMem(Ds.lpData); end; procedure TFrmOther.MyMessage(var t: TWMCopyData); //Message WM_COPYDATA; var tmpStr:String; begin //接受消息并显示。 tmpStr:=StrPas(t.CopyDataStruct^.lpData); Memo1.Lines.Add(tmpStr); end;
 
看楼主要求喽~~~不过是必须由指定程序运行的 穿参数很容易被仿冒而且传参数的可以直接从命令行运行
 
有道理!那就传递2个参数,一个是句柄,还有一个是A程序内部随机产生的GUID,两程序间通讯时需要带上该guid进行验证。
 
汗....随机产生的GUID怎么验证....-_-
 
更汗!就是让你没法验证,而A程序可以验证。A随机产生GUID后,调用B时,作为参数传递给B,当然在A内部要保存该GUID。每次调用B时,都重新生成该GUID。B向A发送消息的时候,需要带上该GUID,至于怎么带,那就是另外一回事了,相信大家可以做到,这里不必细说。以前我们做的一个验证,类似于这样来处理的。
 
这个....这个.....万一B不需要和A通信呢......
 
感谢大大们,这个A是自己写的 B是现有的 代码不能重写 只能反编译改造不知大大们有没有办法....继续等待ing...
 
这个.....可以这样,你自己写个程序C把原来的B当做资源,启动后释放B,启动B,或者直接在内存运行B 都行然后用你的A 调用你的C.....在C里判断A
 
1.将B程序做一个接收参数,如接收参数=A程序的可执行文件名,则显示你要的字符串。2.在A程序中用shellrun(参数)呼出B程序即可解决。如需要代码,可以提出。
 
leadroy,的做法再简单了 我赞同!
 
回 hs-kill这个.....可以这样,你自己写个程序C把原来的B当做资源,启动后释放B,启动B,或者直接在内存运行B 都行---------------------------求直接在内存运行的代码回 leadroy1.将B程序做一个接收参数,如接收参数=A程序的可执行文件名,则显示你要的字符串----------------B是编译好的程序,没有代码,怎么做接收参数呢??请指教另外,我有个办法不知道可行不1.用ultraedit之类的编辑器修改B程序文件头的某一字节,让B启动出错,不能直接运行2.运行A,用A将B的修改那个字节再改回来,在启动B,就能正常运行B不知这样好不好?
 
关于内存执行exe,我没试过,下面的帖子应该能帮到你,我也去试试先---------------------------------------------------问题: 直接在内存中运行资源中的执行文件的问题 ( 积分: 100 ) 分类: 数据库-文件型 来自: wynney, 时间: 2006/12/05 4:21:00, ID: 3639112 在盒子上得不到答案 只有来请教这里的高手了 我的想法是不让资源释放到硬盘再执行 而是直接释放到内存中执行 在这里有兄弟已经公布了源码 http://www.2ccc.com/article.asp?articleid=3228 但是资源文件中的可执行文件只能是Delphi的 “可以运行所有类别EXE的,这个修改简单,你在MemoryRun单元加上JEDI的API声明文件既可,或者手动做个Convert,代码可以参考UPX的” 作者说这样做可以运行其他类别的EXE 我不懂他的意思,需要加那一个JEDI的API声明文件呢? 小弟学Delphi不久 各位大哥有没办法啊 分数不多谢谢指点下 来自: 轻舞肥羊, 时间: 2006/12/05 10:18:21, ID: 3639226 学DELPHI不久就研究这个啊?厉害. GOOGLE搜索 PEUnit 这个关键字,有你想要的代码 来自: wynney, 时间: 2006/12/06 3:34:24, ID: 3639847 感谢楼上的兄弟! 可惜我是想调用资源文件 不知道怎么修改 来自: wr960204, 时间: 2006/12/06 12:24:03, ID: 3640102 http://forum.eviloctal.com/read-htm-tid-16803.html 这个我试过是可以的。 它的原理是随便启动一个EXE(例子里面好像是宿主)把主线程暂停。然后把我们要运行的数据拷贝到该进程的空间,处理。然后把主线程的代码指针修改到我们的EXE数据的入口。启动线程。 来自: xuegaoyili, 时间: 2006/12/06 13:08:42, ID: 3640149 学习帮顶 来自: 轻舞肥羊, 时间: 2006/12/06 14:07:17, ID: 3640216 ** 从资源文件载入EXE ** exefile.rc ** 1 EXE "E:/Delphi Projects/TK/Bin/TK.exe" var Buf : Pointer; Size : DWORD; ProcessId: Cardinal; ResHandle:Cardinal; begin ResHandle := FindResource(hInstance, Pointer(1), 'EXE'); if ResHandle > 0 then begin Size := SizeofResource(hInstance, ResHandle); Buf := LockResource(LoadResource(hInstance, ResHandle)); MemExecute(PChar(Buf)[0], Size, '', ProcessId); end; end; 来自: wynney, 时间: 2006/12/06 22:54:16, ID: 3640471 to:轻舞肥羊 你的代码是正确的,我也按原先的哪个代码修改了下 **Target.rc **Setup eXeFile Target.exe var ABuffer: array of byte; ProcessId: Cardinal; //进程ID Res: TResourceStream; //资源流 begin Res := TResourceStream.Create(HInstance,'Setup','eXeFile'); //创建资源 Application.Terminate; try SetLength(ABuffer, Res.Size); //设置大小 Res.ReadBuffer(ABuffer[0], Res.Size); //开始读了 MemExecute(ABuffer[0], Res.Size, '', ProcessId); //调用PEUnit finally Res.Free; end; end; 可否帮我看看,这2个那一个执行效果好一些? 另外,我测试了下,如果资源为非标准exe[比如屏幕录象生成的exe],就会出错 大哥有没解决之法? 来自: wr960204, 时间: 2006/12/06 23:13:03, ID: 3640485 屏幕录像生成的EXE是一个播放器+数据。数据附在EXE文件的后面。当EXE加载的时候去读取自身文件后面的数据。 上面我给你的内存执行代码因为是执行的宿主EXE文件,即便后来内存中换成了屏幕录像的EXE,但读取文件中的数据的时候读取的是宿主的EXE文件,宿主的EXE后面当然没有他要的数据了。 原理是这样的,具体解决方案你自己去想 来自: wynney, 时间: 2006/12/06 23:49:29, ID: 3640495 to:wr960204 首先分数只有100,轻舞肥羊比你先帮助我,所以我只能这样去分配分数了 不好意思啊 另外,你说的原理我清楚,兄弟可否出个解决的法子?
 
后退
顶部