TC官方合作论坛

 找回密码
 立即注册
查看: 1658|回复: 1

[功能] 【TC8.0】系统API应用之取父进程ID_纯TC源码

[复制链接]
发表于 2022-8-29 04:51:41 | 显示全部楼层 |阅读模式
本帖最后由 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
   
结束





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

发表于 2022-9-9 17:51:40 | 显示全部楼层
技术帖!!!支持  
感谢感恩!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-4 12:05 , Processed in 0.032103 second(s), 23 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表