__p__argc( )、__p__argv( )库函数

这两个函数都在msvcrt.dll动态链接库中,贴出汇编代码:


这两个函数都没有参数,分别返回__argc、__argv变量,这两个变量定义如下:


长度4字节,值为0(确切说应该是NULL)。暂时不知道这两个函数作用,不过可以猜到和main函数参数脱不了干系。


在样本的汇编代码中发现有明显的调用__p__argc( )、__p__argv( )函数(暂不清楚是作者主动写的,还是编译器加上)


使用ollydgb调试__p__argc( )如下:


这个eax值很大,很明显应该是一个地址,指向值是1(莫不是说程序运行时只有一个参数,就是程序本身名),至于为什么原来的NULL会变成0x771530E4,个人估计是在操作系统加载可执行程序时修改了这个值,很有可能是在start( )函数中。


在Linux内核中,也有一个函数叫做`argv_split`,它用于将用户空间传递给内核的命令行参数字符串分割成多个子字符串。在内核中,这个函数通常用于解析用户空间传递的命令行参数,并将它们作为参数传递给系统调用或驱动程序。 `argv_split`函数的实现与用户空间的实现略有不同,因为内核中不能使用标准库函数。下面是一个简化版的内核实现: ```c #include <linux/string.h> #define MAX_ARGS 32 static char *argv[MAX_ARGS]; int argv_split(char *str, char **argbuf, int argbuf_len) { int argc = 0; char *s = str; char *arg = NULL; int arg_len = 0; int in_quotes = 0; int i; while (*s) { if (argc == argbuf_len) return -1; if (*s == '"') { in_quotes = !in_quotes; } else if (*s == ' ' && !in_quotes) { arg = kmalloc(arg_len + 1, GFP_KERNEL); if (!arg) return -1; memcpy(arg, str, arg_len); arg[arg_len] = '\0'; argbuf[argc++] = arg; str = s + 1; arg_len = 0; } else { arg_len++; } s++; } if (arg_len) { arg = kmalloc(arg_len + 1, GFP_KERNEL); if (!arg) return -1; memcpy(arg, str, arg_len); arg[arg_len] = '\0'; argbuf[argc++] = arg; } for (i = 0; i < argc; i++) argv[i] = argbuf[i]; argv[argc] = NULL; return argc; } ``` 该函数接收一个字符串`str`,以及一个指向存储子字符串的缓冲区的指针`argbuf`和缓冲区的长度`argbuf_len`。函数会将`str`中的子字符串分割成多个部分,并将它们存储在`argbuf`中。如果`argbuf`不够大,函数将返回-1。 注意,由于该函数运行在内核态,因此不能使用标准库函数。在上面的实现中,我们使用了Linux内核提供的`kmalloc`函数来分配内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拜乔布斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值