如何人工启动一个进程?
不使用 CreateProcess WinExec ShellExecute之类的这篇文章看到过 找不到了 哪位知道 ?
不使用 CreateProcess WinExec ShellExecute之类的这篇文章看到过 找不到了 哪位知道 ?
解决方案 »
- #import导入的类型继承自IUnknown,为什么不需要实现AddRef,Release,QueryInterface接口?
- 灰度图处理问题 求教高手!
- 我做的托盘右击弹出的菜单, 在失去焦点时并不自动隐藏, 要必须选择菜单上的一项才隐藏, 是怎么回事呢?
- 在线等 大侠 我现在有一段代码 是用CSTRING 实现的 要改成BSTR则呢们改啊 急 急
- 抖动保留的颜色来匹配指定的颜色
- 救命,请大家帮帮忙
- CString怎么转CTime??
- 那位大哥愿意给小弟一个visual C++在线等待
- 一个简单的问题
- 求救!那位大侠给一段用CHTMLView类作浏览器的代码吧
- 怎样设置带红色波浪形下划线的字体
- webbrowser不响应键盘和回车消息
NTSYSAPI
NTSTATUS
NTAPI
ZwCreateProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN HANDLE InheritFromProcessHandle,
IN BOOLEAN InheritHandles,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugPort OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL
);
这是一个未公开的api,ddk中没有,不过自己可以用softice跟踪,调用安全问题自己解决了(未公开啊)
http://www.phrack.org/phrack/62/p62-0x06_Kernel_Mode_Backdoors_for_Windows_NT.txt
#include "ntdll.h"
#include <stdio.h>namespace NT {
extern "C" {NTSTATUS
NTAPI
CsrClientCallServer(
IN PVOID Message,
IN PVOID,
IN ULONG Opcode,
IN ULONG Size
); }
}VOID InheritAll()
{
ULONG n = 0x1000;
PULONG p = new ULONG[n]; while (NT::ZwQuerySystemInformation(NT::SystemHandleInformation, p, n * sizeof *p, 0)
== STATUS_INFO_LENGTH_MISMATCH)
delete [] p, p = new ULONG[n *= 2]; NT::PSYSTEM_HANDLE_INFORMATION h = NT::PSYSTEM_HANDLE_INFORMATION(p + 1); ULONG pid = GetCurrentProcessId(); for (ULONG i = 0; i < *p; i++)
if (h[i].ProcessId == pid)
SetHandleInformation(HANDLE(h[i].Handle), HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
delete [] p;
}VOID InformCsrss(HANDLE hProcess, HANDLE hThread, ULONG pid, ULONG tid)
{
struct CSRSS_MESSAGE {
ULONG Unknown1;
ULONG Opcode;
ULONG Status;
ULONG Unknown2;
}; struct {
NT::PORT_MESSAGE PortMessage;
CSRSS_MESSAGE CsrssMessage;
PROCESS_INFORMATION ProcessInformation;
NT::CLIENT_ID Debugger;
ULONG CreationFlags;
ULONG VdmInfo[2];
} csrmsg = {{0}, {0}, {hProcess, hThread, pid, tid}, {0}, 0, {0}}; NT::CsrClientCallServer(&csrmsg, 0, 0x10000, 0x24);
}__declspec(naked) int child()
{
typedef BOOL (WINAPI *CsrpConnectToServer)(PWSTR); // CsrpConnectToServer(0x77F68CC0)(L"\\Windows");
// CsrpConnectToServer(0x77F8F65D)(L"\\Windows");
CsrpConnectToServer(0x77F922F5)(L"\\Windows"); __asm mov eax, 0
__asm mov esp, ebp
__asm pop ebp
__asm ret
}
#pragma optimize("y", off) // disable frame pointer omissionint fork()
{
HANDLE hProcess, hThread; InheritAll(); NT::OBJECT_ATTRIBUTES oa = {sizeof oa}; NT::ZwCreateProcess(&hProcess, PROCESS_ALL_ACCESS, &oa, NtCurrentProcess(), TRUE, 0, 0, 0); NT::CONTEXT context = {CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS | CONTEXT_FLOATING_POINT}; NT::ZwGetContextThread(NtCurrentThread(), &context); context.Eip = ULONG(child); MEMORY_BASIC_INFORMATION mbi; NT::ZwQueryVirtualMemory(NtCurrentProcess(), PVOID(context.Esp),
NT::MemoryBasicInformation, &mbi, sizeof mbi, 0); NT::USER_STACK stack = {0, 0, PCHAR(mbi.BaseAddress) + mbi.RegionSize,
mbi.BaseAddress, mbi.AllocationBase}; NT::CLIENT_ID cid; NT::ZwCreateThread(&hThread, THREAD_ALL_ACCESS, &oa,
hProcess, &cid, &context, &stack, TRUE); NT::THREAD_BASIC_INFORMATION tbi; NT::ZwQueryInformationThread(NtCurrentThread(), NT::ThreadBasicInformation,
&tbi, sizeof tbi, 0); NT::PNT_TIB tib = tbi.TebBaseAddress; NT::ZwQueryInformationThread(hThread, NT::ThreadBasicInformation, &tbi, sizeof tbi, 0); NT::ZwWriteVirtualMemory(hProcess, tbi.TebBaseAddress,
&tib->ExceptionList, sizeof tib->ExceptionList, 0); InformCsrss(hProcess, hThread, ULONG(cid.UniqueProcess), ULONG(cid.UniqueThread)); NT::ZwResumeThread(hThread, 0); NT::ZwClose(hThread);
NT::ZwClose(hProcess); return int(cid.UniqueProcess);
}#pragma optimize("", on)
int main()
{
int n = fork();
Sleep(n * 10);
Beep(100, 100);
printf("%d\n", n);
return 0;
}