本帖最后由 flying 于 2022-8-29 04:53 编辑
此功能可以与“进程ID取进程名”配合使用,获取父进程名,可以通过父进程名("explorer.exe")来判断程序是不是双击打开,一定程度能检测程序是否被调试。父进程名为:“TC.exe”,表示当时程序是被tc调试运行。
“取父进程ID”的参数‘参_进程句柄’可以使用系统API “OpenProcess” 打开现有进程来获取句柄,句柄使用完注意使用 “CloseHandle” 来关闭句柄。
//不知道是不是我系统问题,‘ZwQueryInformationProcess’这个api不能直接调用(有时候又可以直接调用),必须先‘LoadLibrary’再‘GetProcAddress’获取函数地址再调用。
功能 取父进程ID(参_进程句柄 = -1) //参_进程句柄:欲取父进程ID的指定进程的句柄,不是父进程的句柄,默认取自身进程的父进程ID。 成功返回父进程ID,失败返回-1。
变量 模块句柄, 是否要卸载模块 = 假, ret = -1
模块句柄 = 动态库调用("kernel32.dll", "long", "GetModuleHandleW", "wchar *", "ntdll.dll") //不增加引用计数,无需释放。
如果(模块句柄 == 0)
变量 插件路径
插件路径 = 系统获取系统路径(0)
如果(文件是否存在(插件路径 & "SysWOW64\ntdll.dll") == 1)
插件路径 = 插件路径 & "SysWOW64\ntdll.dll"
否则如果(文件是否存在(插件路径 & "System32\ntdll.dll") == 1)
插件路径 = 插件路径 & "System32\ntdll.dll"
否则
返回 -1
结束
模块句柄 = 动态库调用("kernel32.dll", "long", "LoadLibraryW", "wchar *", 插件路径) //会增加引用计数,需跟‘FreeLibrary’配对使用。
//如果(模块句柄 == 0)
// 返回 0
//结束
是否要卸载模块 = 真
结束
遍历(变量 i = 0; i < 1; i++)
变量 函数地址, 结构体地址, 返回值
变量 PROCESS_BASIC_INFORMATION = 数组("ExitStatus" = 数组("long" = "1", "value" = 0), "PebBaseAddress" = 数组("long" = "1", "value" = 0), "AffinityMask" = 数组("long" = "1", "value" = 0), "BasePriority" = 数组("long" = "1", "value" = 0), "UniqueProcessId" = 数组("long" = "1", "value" = 0), "InheritedFromUniqueProcessId" = 数组("long" = "1", "value" = 0))
函数地址 = 动态库调用("kernel32.dll", "long", "GetProcAddress", "long", 模块句柄, "char *", "ZwQueryInformationProcess")
如果(函数地址 == 0)
跳出
结束
结构体地址 = 结构体申请内存(PROCESS_BASIC_INFORMATION)
如果(结构体地址 == 0)
跳出
结束
参_进程句柄 = 转整型(参_进程句柄)
如果(参_进程句柄 <= 0)
参_进程句柄 = 动态库调用("kernel32.dll", "long", "GetCurrentProcess") //伪句柄是一个特殊的常量,值为:-1,它被解释为当前进程句柄。为了与未来的操作系统兼容,最好调用‘GetCurrentProcess’,而不是对此常量值进行硬编码。
结束
返回值 = 函数指针调用("long", 函数地址, "long", 参_进程句柄, "long", 0, "long", 结构体地址, "long", 24, "long", 0)
如果(返回值 != 0)
结构体释放内存(结构体地址)
跳出
结束
如果(结构体获取内存数据(结构体地址, PROCESS_BASIC_INFORMATION) == 假)
结构体释放内存(结构体地址)
跳出
结束
ret = PROCESS_BASIC_INFORMATION["InheritedFromUniqueProcessId"]["value"]
结构体释放内存(结构体地址)
结束
如果(是否要卸载模块 == 真)
动态库调用("kernel32.dll", "long", "FreeLibrary", "long", 模块句柄)
结束
返回 ret
结束
|