方法:
1.先用OpenProcess 打开目标进程的进程空间,得到句柄
2.使用NtQueryInformationProcess这个API去读取进程里面的PE块的基地址也就是:PebBaseAddress
3.继续使用ReadProcessMemory,从这个PebBaseAddress,开始读取PEB(PE Block),这时候可以得到ProcessParameters,进程的参数地址
4. 继续使用ReadProcessMemory,从这个ProcessParameters,开始读取PROCESS_PARAMETERS,这时候可以得 到CommandLine.Length和CommandLine.Buffer,也就是启动参数的长度和启动参数的地址。
5.最后再使 用ReadProcessMemory,根据记动参数的地址和长度去读取启动参数。特别要注意的事情是,如果在unicode的系统中,这时候读到的启动 参数也是unicode的,所以得定义对应的字串类型去读取,不然打印出来的字串只有第一个字母(比如说参数是:abc,如果用ansi的字串,结果就 是:a/0b/0c/0,/0这个就表示字串的结束了)。
最后,如果发现在第2步的时候出现读取错误,这时候应该是程序没有debug的权限了,可以用以下方法来提升程序的权限:
1.先用LookupPrivilegeValue来查看能否拥有:SeDebugPrivilege这个权限
2.如果可以,就用以下代码来提升权限:
Privileges.Privileges[0].Luid:=DebugNameValue;
Privileges.