Monthly Archives: 4月 2012

《火焰之纹章》凹点教程(RNG Guide)

From: http://www.tgbus.com/gba/guide/gba/200505/20050524033428.html

See also:

Fire Emblem Random Number Generator FAQ by IGN

Fire Emblem: The Sacred Stones: Random Number Generator Guide by canas123

一直以来,论坛上都有一些朋友询问GBA火纹乱数和凹点的问题,而本区还没有一篇专门系统地讲解凹点方法的文章。为了方便大家,我把自己所会的一些这方面的东西拿来和大家一起探讨一下,希望那些还不会凹点的朋友能从中得到一些启发。

(以下内容只针对GBA上3作火焰纹章)

一、乱数

1、乱数的作用

要想学会随心所欲地凹点,就必须了解乱数的概念和作用。在FE中,乱数是所有随机事件用以判断结果的依据。比如,我们在游戏中攻击是否命中、升级时是否增长某项能力、瞬杀等职业特技是否发动等都是靠乱数来决定的。为了判断这些随机事件的结果,游戏的内存中准备了一系列的乱数。GBA火纹中的乱数都是 0~99之间的散乱无规律的自然数(也包括0这个非自然数),随着游戏的进行和随机事件的发生,这些乱数依次被消耗掉。那么,这些乱数的具体工作方式是什么样呢?也就是说,它们是如何来判定随机事件的结果的?我们都知道,随机事件是和百分率挂钩的,拿角色升级来举例说:封印之剑中路特加的HP成长率为 80%、力量成长为30%,假设在他某次LV UP时,当前系统中的头两个乱数是70和33,它们分别对应着HP判定和力判定,因为70小于80、33大于30,所以这次升级长了HP而没有长力。再比如:某角色在某次攻击中的必杀率为50%,此时如果相应的乱数为49时则必杀成立,为50时则必杀否决。从这两个例子我们可以看出,乱数对随机事件的判定方式为:当乱数%小于随机事件的概率数时,该事件判定为成立;当乱数%大于等于随机事件的概率数时,该事件判定为否决。在游戏中乱数就是以这种方式来判定随机事件的结果的。可以说认识了这一点,我们就已经“透过现象看到了本质”。

2、游戏中乱数的消耗规则

了解了以上的常识后,我们来看一下乱数在游戏中的消耗规则,这也是掌握凹点方法的必要基础之一。我们已经知道,乱数是为随机事件服务的,它的职责是判定随机事件的结果,从另一个角度也就是说,在游戏中并不是所有事件都要消耗乱数。GBA火纹里,乱数的消耗只出现在战斗、LV UP加能力点、回合结束、挖宝、变化移动线路、控制中毒角色每回合扣血数量以及敌人行动方式的判定中。具体说明如下:

1)战斗:

A、封印之剑中:一次单方面攻击的判定顺序为“命中→必杀”,若本次攻击的命中判定为成立,则继续判定必杀是否发动;若命中判定为否决即MISS,则不再进行必杀的判定,也就是说不存在必杀被MISS的情况(烈火和圣魔亦如此)。其中,判定命中需要消耗2个乱数(但具体是哪一个起作用还未得到确定,有说法是取这2个乱数的平均数),判定必杀消耗1个乱数。由此,实际情况为:若攻击落空(MISS)则消耗2个乱数,攻击命中而无必杀则消耗3个乱数,命中且必杀也消耗3个乱数。此外,必须记住:即使命中率是100%,也同样是要消耗掉2个乱数来判定命中的(烈火、圣魔同)。

B、烈火之剑中:与封印比多了一个瞬杀特技,因此情况稍微复杂一点。单方面攻击的判定顺序变成了“命中→必杀→瞬杀”,若本次攻击的命中判定为成立,则继续判定必杀是否发动,若必杀判定也成立,则继续判定瞬杀是否发动(若必杀不成立则不继续判定瞬杀)。其中,判定命中需要消耗2个乱数(同封印),判定必杀消耗1个乱数,判定瞬杀也要消耗1个。由此,实际情况为:若攻击落空(MISS)则消耗2个乱数,攻击命中而无必杀则消耗3个乱数,命中且必杀消耗4个乱数,命中且瞬杀也是4个。瞬杀的具体发动条件为:必杀判定成立且随后用来判定瞬杀的那个乱数必须小于50。需要注意的是,按照游戏设定,烈火中的火龙以及魔封者是不能被瞬杀的。此外,虽然游戏中只有刺客这种职业拥有瞬杀特技,但系统为了省却特殊计算的麻烦,在所有职业的必杀判定成立后也都进行瞬杀的判定,所以在烈火中,任何一次必杀攻击都要消耗掉4个乱数。

C、圣魔光石中:由于多种职业特技的加入,情况比烈火更加复杂了。每种特技的判定规则各不相同,必须逐个记熟。不过特技之外的战斗判定方式和烈火是一样的,所以以下只说说特技相关:

  • 瞬杀:同烈火。且刺客之外的职业在发动必杀后也一样会进行瞬杀判定。对魔王、里昂无效。
  • 大盾:发动几率为对方的LV%,判定时机为对手的命中判定成立之后,消耗一个乱数。
    (若对手的命中判定为否决,则不再进行大盾的判定)
  • 贯穿:发动几率为自身的LV%,判定时机为自身命中判定成立后、自身必杀判定之前,消耗一个乱数。(贯穿发动后依然可以发动必杀,若命中不成立则不进行贯穿的判定)
    (实际战斗中,大盾优先于贯穿的判定,大盾判定成立后则不再进行贯穿的判定)
  • 必中:发动几率为自身的LV%,判定时机为自身的命中判定之前,消耗一个乱数。若必中判定成立,则不再进行 对命中的判定。
  • 召唤:召唤这一特技本身不消耗乱数,但判定召出来的亡灵战士的能力则要消耗乱数,具体消耗规则不详……其他职业特技不发生乱数消耗。补充一下,3作中,攻击墙壁和古木也被视为一次战斗,攻击一次即消耗3个乱数;而舞蹈、偷窃、使用杖等职业技能由于不涉及随机事件,因此不消耗乱数。

2)LV UP时对乱数的消耗:

封烈魔3作在角色升级时,系统会根据乱数来判定角色的各项能力值是否增长。由于所有角色都具有7项具体能力,因此将依次消耗7个乱数来判断这些能力的增长。判断的顺序为:HP、力、技、速、守、魔、运。只要某能力的成长率大于相对应的乱数,这项能力就会增长。

3)我方“回合结束”的同时,自动消耗1个乱数。

4)沙漠寻宝:

使用盗贼在指定区域内待机就会100%得到宝物,这是众所周知的。非盗贼职业取得宝物则与自身幸运值有关,幸运越高,取得的几率就越大。关于非盗贼职业的挖宝概率,以前我一直以为是将角色的幸运值与待机时的首个乱数作比较,即乱数小于幸运时就得宝。但最近几次测试烈火发现,在乱数表相同的情况下,有时可以拿到宝物,有时却拿不到。看来挖宝并不只与乱数有关,或者说:并不只与我们所谈及的这个“乱数”有关。

5)中毒扣血

角色受到毒系武器攻击或被毒雾击中后进入中毒状态,中毒后每回合随机减掉1~3点HP。具体的减血规律我还没研究过,不过这个一般不是很重要,注意一下及时回复就行了。

6)敌人行动对乱数的消耗:

敌人与我方在战斗过程中的乱数消耗和判定规则是一样的,但敌人的AI对乱数的消耗情况还是未知的,也是比较难测试的,比如哪个敌人会先攻击、站在什么位置攻击,都是会消耗一定乱数的。所以我们要凹点最好还是在自军回合内进行。不过这也并不意味我们对掌握敌人完全束手无策,在熟练地掌握凹点技术后,我们有时也可以根据实际条件控制敌人行动的结果。

3、如何预测乱数

上面讲到的乱数消耗规则中还差一条“移动路线对乱数的消耗”,而这个内容同时也是预测乱数的方法,是这个帖子里最重要的内容,所以把它拿出来单独讲解。

在了解了乱数消耗规则的内容后,我们下一步就要看一下如何预测游戏中的乱数。只有正确预测了乱数的大小,才能在实际中运用它们。GBA火纹中,预测乱数的唯一手段就是利用角色的移动路线。尽管目前还没有办法能够预测出游戏中每个乱数的具体数字,但我们可以通过控制角色移动路线来测出未来所有乱数的大小范围,即它们分别是属于0~49之间(俗称小乱数)还是50~99(俗称大乱数)之间。

一起来实验一下。首先,在地图上找一片“开阔地”,也就是没有特殊地形和敌人干扰的一块地方,目的是使角色的移动不受影响(不受地形影响的飞行系单位要方便得多了)。让我方任意一名角色“甲”站在这块地面上,设其移动力为x。现在我们用A键激活甲,可以看到以甲为中心出现了一个“半径”为x的兰色正菱形即该角色的行动区域。然后,我们用方向键移动光标,就出现了角色的移动线路指针。随着我们在兰色区域内任意地移动指针,指针后面的线路轨迹也跟着不断变长。当总移动长度达到x+1格时,由于已经超出了角色的移动上限,轨迹线无法继续变长,系统就会强制改变轨迹的样式,使其长度小于x而又可以到达移动目的。好,现在按B键取消线路,然后重新激活甲,用刚才的步法再来几次,我们会发现:经系统调整后的轨迹线样式以及指针方向并不都是一样的,是随机变化的。而决定轨迹线路与指针产生样式变化的家伙正是乱数。轨迹线路与指针将乱数的信息显现到画面上,从而为我们预测乱数大小提供了最重要的凭借。那么,这些七拐八折的轨迹该如何解读呢?下面我们结合几种常用的步法来解读轨迹、学会判断乱数的大小。

1)图一所示为烈火的尼尔斯,职业吟游诗人,移动力5。我们将移动轨迹绕至图一的状态,此时轨迹的总长度已经达到5格,若继续移动则会使轨迹产生样式变化:

2005109233110761

当光标向右一格时,轨迹的终点(即指针)将与角色处于同一直线上,由于“两点之间线段最短”,而系统的工作原则就是“捷径优先”,所以这时的轨迹一定会变为一条没有任何曲折的直线(图二)。由于绝对不会有第2种轨迹出现,所以也就不涉及随机判定,也就是说,这种直线轨迹的产生不需要消耗乱数。既然不消耗乱数,对我们来说也就没有意义,在实际操作中应避免这种情况的出现。

当光标向上一格时,轨迹的终点将位于角色的斜方向,由于游戏中没有斜线,所以轨迹会变成折线的形式,这时将随机有图三和图四两种情况出现。既然涉及到随机,就一定离不开乱数。图三中的状态表示该轨迹的产生消耗掉了1个值为50~99之间的乱数即大乱数(以下简称大),也就是说,如果轨迹变化前的乱数表中第一个乱数是大,那么轨迹一定会变为图三所示的状态。而图四中的状态表示该轨迹的产生消耗掉了1个值为0~49之间的乱数即小乱数(以下简称小),也就是说,如果轨迹变化前的乱数表中第一个乱数是小,那么轨迹一定会变为图四所示的状态。这样,我们可以通过反复地操作图一至图三(四)的步骤来测出被消耗掉的一系列乱数的大小并记住它们。这种移动路线的方法,因轨迹每变化一次即可消耗并测出1个乱数,俗成“一次一个法”,它适用于所有移动力为奇数的角色。“一次一个法”并不只有图一这一种绕圈方法,我们还可以按图一的反方向绕,或者比如图五中的光标再向右一格、图六中的光标再向上一格,都可以测出1个乱数。而判断被消耗掉的乱数大小的依据是图七(指针水平指向表示1个小乱数,垂直指向表示1个大乱数;与角色处于同一直线的那段轨迹即图中去色部分不反映乱数信息)。

2)再来介绍一种一次移动测得多个乱数的方法。图八所示为隼骑士,移动力8。我们将光标移至图八的状态,此时轨迹长度为8格,再向左移动一格后轨迹随机发生以下7种变化(图九至图十五),各图轨迹表示的乱数消耗情况为:

  • 图九,该轨迹的产生消耗了1个乱数,大;
  • 图十,消耗了2个乱数,依次是小大;
  • 图十一,消耗了3个乱数,依次是小小大;
  • 图十二,消耗了4个乱数,依次是小小小大;
  • 图十三,消耗了5个乱数,依次是小小小小大;
  • 图十四,消耗了6个乱数,依次是小小小小小大;
  • 图十五,消耗了6个乱数,依次是小小小小小小。

解读顺序是从指针开始,依格向角色推进(方法见图十六),轨迹转折处乱数的范围一定会发生变化。注意,同上面一样,和角色处于同一直线的那段轨迹(去色部分)不要理会。这种绕法俗称“一次多个法”,一次轨迹变化最多可以测出连续x-2个乱数的大小,所以,移动力越高的角色越好用。“一次多个法”也可以按其他步法来进行,我们将光标在兰色区域内任意移动x+1格之后都可以使轨迹产生变化,从而预测多个乱数。图十七至图廿一都是“一次多个法”的运用,我们可以按照图十六的说明来判断这些图中乱数的状况。在实际应用中,我们应根据游戏中的具体情况来选择绕法,做到灵活多变。

二、凹点

凹点就是通过对乱数的预测和调整,以达到控制角色成长、控制命中回避等目的的过程。在上面的内容中,我们学会了如何用判断轨迹的方法来预测乱数大小,但这里面有一个问题,就是当我们在利用轨迹判断乱数的时候,这些乱数已经被消耗掉了,既然被消耗掉了还怎么用它们呢?我们知道,火焰纹章的存储方式是自动存储,当我们使用角色完成攻击、访问、盗窃、开门、支援、待机等指令时,系统会马上记录下当前的状况及乱数表状态,即使RESET后,我们也只能回到最近那次攻击、待机等指令完成后的状态。但如果我们只是用移动轨迹来消耗乱数的话,在完成下一个战斗、待机性质的指令之前,系统是不会将乱数的消耗进行存储的。比方说,我们先用甲执行待机命令,然后用乙通过移动消耗掉几个乱数,然后RESET回到甲待机后的状态,再用乙测试乱数,我们可以发现乱数的消耗和 RESET之前是一样的,就是说:RESET之前乙对乱数的消耗没有被存储下来,而我们却已经知道了未来乱数的大小情况。只有当乙也待机或者选择“回合结束”之后,他所消耗掉的乱数才会“真正”被系统记录下来。利用这一点,我们就可以凹点了。

1、升级时的凹点:

我们凹点最主要的目的就是使角色升级时获得较好的成长。在了解了游戏中的乱数消耗规则并能够熟练预测乱数的基础上,我们已经完全可以通过对乱数的调整来得到一个满意的升级结果。要得到最佳升级结果,就要想办法让用于角色升级判定的连续7个乱数都是小乱数。不过游戏中很少有连续的7个小乱数出现,所以一般情况下,在这7个乱数中有5、6个小乱数也就可以了。

假设当前游戏为封印之剑我方某回合开始后,我方共有2名角色:主角和修女(EXP均处于升级边缘)。敌方有1名山贼(HP不足主角一击)。首先我们通过移动轨迹的方法消耗一些乱数并记下它们,假设依次是:小大大小大大大大小大小小小小大小小。可以发现,从第11个乱数开始后的7个乱数中有6个小乱数,基本满足升级所需。然后RESET重新进入游戏,乱数表会回到测试之前的状态,这时我们再用“一次多个法”配合“一次一个法”将前面的10个乱数消耗掉,然后修女用杖升级。因为前面说过用杖、偷窃以及舞蹈等技能不消耗乱数,所以接下来的第11个乱数就用于修女的HP成长判定,后面的第12~17个乱数依次用于力技速守魔运的判定。由于7个乱数中有6个是小,这次升级的结果应该是很可观的。还是上面那种情况,如果是想让主角通过战斗升级,就要在RESET之后消耗掉前7个乱数,使第8~10这3个乱数用于主角命中与必杀判定,而接下来的第11~17个乱数还是用来升级判定。当然,这个安排是建立在确保主角能够命中的基础上的,如果主角攻击MISS,那么第10个乱数将不再用于主角的必杀判定上而是用在山贼的命中判定上了,这样一来,情况就完全不一样了。所以我们在凹升级的时候一定要对双方的战斗结果有一个比较准确的预测才行。烈火和圣魔中由于加入了特技,战斗中的乱数消耗更加复杂,战斗结果也更加难预测,不过我就不再举例子讲解了,大家可以参照前面的“乱数消耗规则”在实战中自己慢慢领会。另外再补充一点儿经验:在用移动法预测乱数时由于有时候很久才能等到连续的小乱数出现,所以初学时最好用笔记下每次绕圈的结果,RESET后可以照着笔记重复之前的移动;凹熟练后就可以通过一边心记绕圈的次数、一边配合角色待机的方法脱离纸笔了。

2、调整命中、回避、必杀、瞬杀

大家都有过看着自己50%多的命中率而迟迟不敢下手进攻的时候吧?利用凹点,我们可以彻底地打消这种担心。比起升级凹点,凹命中、必杀要来得轻松一些。前面的“乱数消耗规则”讲过,判定命中需要2个乱数,判定必杀、瞬杀都各需要1个,合起来也不过3、4个乱数,比寻找6、7个连续小乱数容易得多。当命中率不低于50%时,只要凹出连续2个小乱数就可以确保100%击中,即使命中率低于50%,击中的概率也比平时大一倍。烈火、圣魔中的刺客,当命中率、必杀率均为50%以上时,凹出连续4个小乱数就可以确保发动瞬杀。我们还可以在我方的攻击命中后凹敌人反击的MISS(即让用于敌人命中判定的2个乱数为大),只要熟悉了前面的“乱数消耗规则”的内容,就能做到得心应手。此外,圣魔中由于瞬杀之外的职业特技发动几率都不超过20%,所以在实际凹点时并不常用。

在我方回合结束之前,也可以用调整乱数的办法来影响敌回合的行动结果,比如当敌人只剩下玉座上的BOSS时,我们可以在回合结束前凹一下他的MISS等等。不过要记住,回合结束的同时系统会自动消耗一个乱数。另外,在用了地雷BUG控制敌人时,乱数消耗规则不变,我们可以操纵敌人继续凹点。

写了这么多字,该说的基本都说完了,最后,祝大家在凹点的世界里痛并快乐着。

捕获SIGSEGV信号(Segmentation fault)

See also:

signal(2) – Linux man page

Static:

加入

#include <signal.h>
int main()
{
    signal(SIGSEGV, &callback);
}

问题解决。

Screenshot-root@ubuntu^% ~

Dynamic:

打印程序自身的backtrace

原文略有修改。

实战:

当然,在实战中,在程序中故意插入函数没有什么意义。很多时候我们并不知道程序问题在哪,尤其是面对资源极度缺乏的嵌入式设备时。

下面这个例子也很典型。

Screenshot-root@ubuntu^% ~

因此,在实作中,我们还需要了解如何捕获SIGSEGV信号(segmentation fault),并调用相应的callback函数。

捕获SIGSEGV信号(Segmentation fault)

See also:

backtrace(3) – Linux manual page

#include "execinfo .h"
int backtrace(void **buffer, int size);
/* retrieve backtrace */
char **backtrace_symbols(void *const *buffer, int size);
/* put in a buffer */
void backtrace_symbols_fd(void *const *buffer, int size, int fd);
/* put in a file */

打印C/C++程序的backtrace

——————————————————————————————————————————

From: http://ganzhi.blogspot.com/2008/07/cbacktrace.html

最近调试C++程序时,经常碰到GDB无法使用的情况。似乎使用GDB之后,程序的很多并行相关的Bug都体现不出来了。在这种时候,我们可以通过下面的程序打印出自身的backtrace来。

/*
 *  Application: Print the backtrace from
 *  Manual: Embed and Compile with -rdynamic option.
 *          e.g. gcc -rdynamic -o test test.c
 */

#ifdef DEBUG
#include <stdio.h>
#include <execinfo.h>

#define bt_array_size 100

void print_backtrace()
{
    int i;
    void *bt_array[bt_array_size];
    int bt_size;
    char** bt_symbols;

    printf("########## Backtrace ##########\n");
    bt_size = backtrace(bt_array, sizeof(bt_array) / sizeof(void *));
    printf("Number of elements in backtrace: %d\n", bt_size);
    if (bt_size > 0)
    {
        bt_symbols = backtrace_symbols(bt_array, bt_size);
        if (bt_symbols)
            for (i = bt_size - 1; i >= 0; --i)
                printf("%s\n", (char*) bt_symbols[i]);
    }
    printf("###############################\n");
    exit(0); // Exit program. Necessary when Capturing signal.
             // Or the program will enter infinite-callback state.
}
#endif

上述代码会打印出一些16进制的偏移量,这时我们可以用如下命令来获得对应的源代码行:

addr2line -e ./test_deque 0x40c794

另外,我们可以用下面的命令来使得linux生成core dump,这样GDB就又能工作了。

ulimit -c unlimited

Linux网络配置

1. 静态IP地址

修改/etc/network/interfaces

DHCP配置

auto eth0
iface eth0 inet dchp

静态配置

auto eth0
iface eth0 inet static
address 192.168.0.10
netmask 255.255.255.0
gateway 192.168.0.1
# Following two not really necessary
network 192.168.0.0
broadcast 192.168.0.255

设置完后,使用如下命令使配置生效

sudo /etc/init.d/networking restart

或者

sudo ifdown eth0 // 禁用网卡
sudo ifup eth0 // 启用网卡

2. 多IP地址(虚拟IP地址)

auto eth0:1
iface eth0:1 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
# Following two not really necessary
network 192.168.1.0
broadcast 192.168.1.255

3. DNS

修改/etc/resolv.conf

search example.com
nameserver 192.168.0.2

Sniffing with Wireshark as a Non-Root User

From: http://packetlife.net/blog/2010/mar/19/sniffing-wireshark-non-root-user/

By stretch | Friday, March 19, 2010 at 11:39 a.m. UTC

Many network engineers become dismayed the first time they run Wireshark on a Linux machine and find that they don’t have access to any network interfaces. This is because, by default, raw access to network interfaces (e.g. eth0) requires root privileges. Unfortunately, this often prompts people to simply run Wireshark as root – a bad idea. As an older Gentoo Linux ebuild of Wireshark warns:

WIRESHARK CONTAINS OVER ONE POINT FIVE MILLION LINES OF SOURCE CODE. DO NOT RUN THEM AS ROOT.

Indeed, due to the complexity and sheer number of its many protocol dissectors, Wireshark is inherently vulnerable to malformed traffic (accidental or otherwise), which may result in denial of service conditions or possibly arbitrary code execution. But if we shouldn’t run Wireshark with root privileges, how are we to capture packets?

The lead developer of Wireshark, Gerald Combs, points out some that Linux distributions are beginning to implement Linux filesystem capabilities for raw network access. In this article, we’ll walk through putting this idea into practice on an Ubuntu 9.10 machine, and include a bit more detail behind the system commands.

Filesystem Capabilities

What are filesystem capabilities? From the man page:

For the purpose of performing permission checks, traditional Unix implementations distinguish two categories of processes: privileged processes (whose effective user ID is 0, referred to as superuser or root), and unprivileged processes (whose effective UID is non-zero). Privileged processes bypass all kernel permission checks, while unprivileged processes are subject to full permission checking based on the process’s credentials (usually: effective UID, effective GID, and supplementary group list).

Starting with kernel 2.2, Linux divides the privileges traditionally associated with superuser into distinct units, known as capabilities, which can be independently enabled and disabled. Capabilities are a per-thread attribute.

The manual goes on to list over two dozen distinct POSIX capabilities which individual executables may be granted. For sniffing, we’re interested in two specifically:

  • CAP_NET_ADMIN – Allow various network-related operations (e.g., setting privileged socket options, enabling multicasting, interface configuration, modifying routing tables).
  • CAP_NET_RAW – Permit use of RAW and PACKET sockets.

CAP_NET_ADMIN allows us to set an interface to promiscuous mode, and CAP_NET_RAW permits raw access to an interface for capturing directly off the wire. These capabilities are assigned using the setcap utility.

Enabling Non-root Capture

Step 1: Install setcap

First, we’ll need to install the setcap executable if it hasn’t been already. We’ll use this to set granular capabilities on Wireshark’s dumpcap executable. setcap is part of the libcap2-bin package.

stretch@Sandbox:~$ sudo apt-get install libcap2-bin
Reading package lists... Done
Building dependency tree       Reading state information... Done Suggested packages:   libcap-dev
The following NEW packages will be installed:
  libcap2-bin
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 17.7kB of archives.
After this operation, 135kB of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com karmic/universe libcap2-bin 1:2.16-5ubuntu1 [17.7kB]
Fetched 17.7kB in 0s (36.7kB/s)   
Selecting previously deselected package libcap2-bin.
(Reading database ... 146486 files and directories currently installed.)
Unpacking libcap2-bin (from .../libcap2-bin_1%3a2.16-5ubuntu1_amd64.deb) ...
Processing triggers for man-db ...
Setting up libcap2-bin (1:2.16-5ubuntu1) ...

Step 2: Create a Wireshark Group (Optional)

Since the application we’ll be granting heightened capabilities can by default be executed by all users, you may wish to add a designated group for the Wireshark family of utilities (and similar applications) and restrict their execution to users within that group. However, this step isn’t strictly necessary.

root@Sandbox# groupadd wireshark
root@Sandbox# usermod -a -G wireshark stretch

After adding yourself to the group, your normal user may have to log out and back in. Or, you can run newgrp to force the effect of the new group (you’ll have to launch Wireshark from this same terminal environment in step 3):

stretch@Sandbox$ newgrp wireshark

We assign the dumpcap executable to this group instead of Wireshark itself, as dumpcap is responsible for all the low-level capture work. Changing its mode to 750 ensures only users belonging to its group can execute the file.

root@Sandbox# chgrp wireshark /usr/bin/dumpcap
root@Sandbox# chmod 750 /usr/bin/dumpcap

Step 3: Grant Capabilities

Granting capabilities with setcap is a simple matter:

root@Sandbox# setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap

In case you’re wondering, that =eip bit after the capabilities list grants them in the effective, inheritable, and permitted bitmaps, respectively. A more thorough explanation is provided in section 2 of this FAQ.

To verify our change, we can use getcap:

root@Sandbox# getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Now, as the user who we added to the wireshark group in step 2, execute Wireshark. You should now see the full list of available adapters and can begin sniffing. (If not, double-check that the wireshark group is listed in the output of groups. You may need to log out and back in for the new group assignment to take effect.)