狗神内存修改器源码详解第一部分:获取所有进程

狗神github源地址:GitHub - iosre/HippocampHairSalon: A simple universal memory editor (game trainer) on OSX/iOS
感谢狗神提供优秀的代码。

首先声明,本人是超级大菜鸟。刚接触内核编程,几乎是小白中的小白。请各位大牛斧正!感谢
代码主要两次调用了sysctl,确定了相关参数。主要有以下三个步骤
第一步:获取全部进程的size
第二步:根据size分配确切的内存大小
第三步:确定进程数量,打印相关参数。
static NSArray *AllProcesses(void) // taken from http://forrst.com/posts/UIDevice_Category_For_Processes-h1H
{

int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};//mib数组中第一个元素是CTL_KERN,这事最高级别的信息,所有的最高级别的名称中都有CTL前缀,定义再/usr/include/sys/sysctl.h文件中。数组第二个元素被设为KERN_PROC,这表示sysctl将再输出流中返回一个程序入口的结构体。数组的第三个元素是KERN_PROC_ALL是全部进程。最后数组元素是进行的PID号,0代表全部。 它实际是要查询的name数组。
size_t miblen = 4;//mib的长度
size_t size; //输出流中的大小
int st = sysctl(mib, miblen, NULL, &size, NULL, 0);//第一次调用sysctl,返回输出流的size,用来进行结构体对齐。至于为啥要对齐,怎么对齐,自己脑补。
struct kinfo_proc *process = NULL;//定义一个kinfo_proc(是kernal information of process)的结构体指针。这个结构体就是我们下一次调用sysctl要返回的结构体类型。
struct kinfo_proc *newprocess = NULL; //定义一个kinfo_proc的结构体指针。用来进行realloc操作的时候中间变量
do
{
size += size / 10;//用来对齐
newprocess = realloc(process, size);
if (!newprocess)
{
if (process)
{
free(process);
}
return nil;
}
process = newprocess;
//上面这一小块是realloc的固定用法。用来分配process的大小。防止野指针和内存泄露。如果有人用realloc不是这个写法,判定位菜鸟。
st = sysctl(mib, miblen, process, &size, NULL, 0); //第二次调用sysctl。第三个和第四个参数分别是输出缓存和它的大小。输出参数是一个kinfo_proc类型的结构体。定义在/usr/include/sys/sysctl.h.头文件中。这个结构体又包含了一个extern_proc类型的叫kp_proc(kernal process in processes)的结构体,extern_proc结构体是被/usr/include/sys/proc.h中定义。kp_proc结构体包含了进行的所有信息。包括后面用到的描述进程状态的p_pid(process’pid)和p_comm(process’command)类型的标志。所有有效值可以在/usr/include/sys/proc.h中找到。
}
while (st == -1 && errno == ENOMEM); //达到目的后推出while循环
if (st == 0)
{
if (size % sizeof(struct kinfo_proc) == 0) //size是kinfo_proc的整数倍
{
int nprocess = size / sizeof(struct kinfo_proc); //获得进程数量
if (nprocess)
{
NSMutableArray * array = [[NSMutableArray alloc] init]; //初始化一个可变数组,用来存放进程信息
for (int i = nprocess - 1; i >= 0; i–) //把每个进程添加到字典中
{
NSString * processID = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_pid];
NSString * processName = [[NSString alloc] initWithFormat:@"%s", process[i].kp_proc.p_comm];
NSDictionary * dictionary = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:processID, processName, nil] forKeys:[NSArray arrayWithObjects:@“ProcessID”, @“ProcessName”, nil]];//把每个进程添加到字典中
[processID release];
[processName release];
[array addObject:dictionary]; //把字典放入数组中
[dictionary release];
}
free(process);
return [array autorelease]; //返回数组
}
}
}
return nil;
}

2 个赞

请问如何获取ios9系统下运行程序或者后台程序的进程信息?跪求!上面的方法只能获取ios8和ios8以下的进程信息,在ios9上就无法获取到了,请问如何获取