Coder Social home page Coder Social logo

2022's People

Contributors

b1tg avatar

Watchers

 avatar  avatar

2022's Issues

[Advent Calendar 2022] (12/05) Windbg 教程

windbg

  • sxe ld:xx.dll dll加载时断下
  • * blabla 注释
  • u $exentry 查看入口/entry
  • x ntdll!D* 查看符号
  • p step over
  • t (trace) step into

windbg basic

  • g 运行
  • r 查看所有寄存器
    • r rax 查看 rax
  • u 查看当前eip的反汇编
  • 直接按回车执行上一条命令
  • 分号做分割,可以在一行执行多条命令
  • ctrl + break 强制停止命令

windbg中有一些伪寄存器,最常见的就是memory界面默认显示的 @$scopeip,表示当前 eip

有如下这些常用伪寄存器,完整列表见官网

pseudo register desc
$exentry 入口点
$proc 进程结构(EPROCESS)指针
$peb 进程PEB(process environment block)结构
$teb 进程TEB(thread environment block)结构

执行

p 命令:

[~Thread] p[r] [= StartAddress] [Count] ["Command"] 
  • r 禁止寄存器显示
  • 默认从 eip 开始执行,加 = StartAddress 从该地址开始执行
  • Count 表示执行的行数或者指令数(?如何区分),默认是 1
  • "Command" 表示指令数执行完后需要执行的命令

t命令和p命令类似,区别是:t是step in,p是step over

  • pa|ta [r] [=StartAddress] StopAddress 执行到指定地址
  • pc|tc [r] [=StratAddress] [Count] 执行到下一个函数调用
  • tb [r] [=StartAddress] [Count] 执行到下一个分支

断点

bp[ID] [Options] [Address [Passes]] ["Command String"]
bu[ID] [Options] [Address [Passes]] ["Command String"]
bm[Options]  SymbolPattern [Passes] ["Command String"]

; 硬件断点
ba [ID] Access Size [Option] [Address[Passes]] ["Command String"]
  • bp 软件断点
  • ba 硬件断点
    • ba r1 0x401000 读0x401000 >= 1bytes
  • bu 未加载模块断点
  • bm 符号特征断点 (Set Symbol Breakpoint)
    • bm msvcr80d!print*
  • bl 列举断点
  • bc 清除断点
  • bd/be 禁用/启用断点

TODO: 条件断点

栈回溯

[Advent Calendar 2022] (12/19) emacs evil-mode 中使用使用 c-u 向上翻页

evil 中默认 C-u 的行为还是原来 emacs 中的修饰键,比较习惯用这个翻代码,遂修改之

(use-package evil
  :ensure t
  :init
  (setq evil-want-C-u-scroll t)
  (when evil-want-C-u-scroll
    (define-key evil-insert-state-map (kbd "C-u") 'evil-scroll-up)
    (define-key evil-normal-state-map (kbd "C-u") 'evil-scroll-up)
    (define-key evil-visual-state-map (kbd "C-u") 'evil-scroll-up)
    (define-key evil-motion-state-map (kbd "C-u") 'evil-scroll-up))
  :commands evil-mode
  )

[Advent Calendar 2022] (12/09) 备药笔记

(声明:此篇为个人笔记,收集自互联网,不构成任何用药建议,有相关需求应咨询专业医师)

  • 目前管控放开,大家都在屯药,很多感冒发烧类药物已经在各地断货,这方面知识比较匮乏,稍微补充一些
  • 目前各类药物清单中比较多的是布洛芬和对乙酰氨基酚
  • 对乙酰氨基酚
    • 对乙酰氨基酚有很多名字,英文的有:Acetaminophen、Paracetamol、APAP。中文名有:乙酰胺酚、扑热息痛(香港防疫用药里面就叫这个名字)
      • 對乙酰氨基酚的兩個英文名字都來自於他的化學名稱「N-acetyl-para-aminophenol」(N-乙酰-對-氨基苯酚)和「para-acetyl-amino-phenol」(對乙酰氨基酚)。在某些文獻中,對乙酰氨基酚被簡記作「APAP」
    • 药理:属于止痛药,通过抑制分布在中枢神经中的COX-2,以减少前列腺素的生成,从而缓解疼痛。(抑制下丘脑体温调节中枢前列腺素的合成,导致外周血管扩张、出汗而达到解热的作用;通过抑制前列腺素等的合成和释放,提高痛阈而起到镇痛作用,仅对轻、中度疼痛有效。本品无明显抗炎作用。)
    • 常见的一些感冒药中包含对乙酰氨基酚成分,比如999感冒灵、 复方氨酚烷胺片
    • 复方氨酚烷胺片:复方制剂,每片含对乙酰氨基酚250毫克,盐酸金刚烷胺100毫克,人工牛黄10毫克,咖啡因15毫克,马来酸氯苯那敏2毫克。(我买了两个牌子的都是同样配比)
      • 药理:
        • 对乙酰氨基酚能抑制前列腺素合成,有解热镇痛的作用;
        • 金刚烷胺可抗“亚一甲型”流感病毒,抑制病毒繁殖;
        • 咖啡因为中枢兴奋药,能增强对乙酰氨基酚的解热镇痛效果,并能减轻其他药物所致的嗜睡、头晕等中枢抑制作用;
        • 马来酸氯苯那敏为抗过敏药,能减轻流涕、鼻塞、打喷嚏等症状;
        • 人工牛黄具有解热、镇惊作用。
        • 上述诸药配伍制成复方,可增强解热、镇痛效果,解除或改善感冒所引起的各种症状。
    • 推上大家推荐泰诺纯片,但现在药店貌似只能买到复方药
  • 布洛芬(Ibuprofen),是一種非類固醇消炎藥(NSAID),同其他NSAID,本品會抑制前列腺素的製造,降低環氧合酶的活性。
    • 用于减轻中度疼痛,也可用于减轻普通感冒或流行性感冒引起的发热
    • ”儿童发热,解热镇痛药物可以选择对乙酰氨基酚或者布洛芬,不推荐两者联用或交替使用。其他的解热镇痛药物均不推荐使用。“
    • ”英国NHS网站之前曾建议两者都可以服用,但后来改变建议说,如果出现新冠症状最好服用扑热息痛,除非医生告诉你那不适合你。“
    • 微博上有人辟谣了。现实来说前者更容易买到,有什么吃什么吧
  • 网上有的说可以吃点维生素C预防,有的说好得更快,但没有看到有说服力的来源
  • 右美沙芬:右美沙芬为中枢性镇咳药,主要抑制延脑的咳嗽中枢而发挥作用
    • 网友推荐史达功牌,说是好喝一点
  • 参考链接:
  • 附:央视新闻的用药推荐
    • image-20221209230647269

[Advent Calendar 2022] (12/10) chatgpt 初体验

ChatGPT 初体验

ChatGPT 出来有一段时间了,之前觉得它不过是智能一点的搜索引擎,尤其用过siri、小米小爱这类东西,就不对它报太多期望。

今天第一次用了下,挺震撼的,让它写个脚本能写个80%,而且可以在初版基础上多次提需求修改,这种基于上下文的交互和理解真的厉害,失业倒计时开始。

[Advent Calendar 2022] (12/13) iread

I don’t want to be an internet person

https://www.palladiummag.com/2022/11/04/i-do-not-want-to-be-an-internet-person/
https://news.ycombinator.com/item?id=33892718

  • 今天大家都是”在线“的,生活已经和网络密切耦合
  • 作者对过度生活在网络上的状态进行了批评,认为一些人因此丧失了现实生活中的一些技能
  • 评论反对说:在任何亚文化或领域中培养人格的人在不同的环境中似乎都像是离了水的鱼
  • 要意识到自己浸入网络的程度,通过它得到什么、又失去什么
  • 不要成为一个网络上重拳出击,现实中唯唯诺诺的人
  • 看清自己把网络和现实中的成就和失败

[Advent Calendar 2022] (12/02) x8664-os-internals

CPUID

fn is_vm() -> bool {
    let mut x: i32 = 0;
    unsafe {
        asm!(
            "mov eax, 1",
            "cpuid",
            "and ecx, 0x80000000",
            "test ecx, ecx",
            "setz al",
             out("ax") x,
        );
    }
    return x & 0x0000_0001 != 1;
}
void __cpuid(
   int cpuInfo[4],
   int function_id
);

void __cpuidex(
   int cpuInfo[4],
   int function_id,
   int subfunction_id
);

Processor Execution Modes

处理器有4种执行模式:Real mode, protected mode, IA-32e mode, system management mode

  • Real mode
    • 又称real address mode,即程序访问的地址是内存中的实际地址(物理地址?)
  • protected mode
    • 又称 protected virtual address mode,运行软件使用虚拟内存、分页、多任务处理
    • 1982年问世
    • 控制寄存器CR0中的PE位(Protection Enable)用于进入保护模式
  • IA-32e mode
  • system management mode(SMM)
    • 被称为 ring −2
    • 包括操作系统在内的软件全部停止,固件中的程序或者调试器使用高权限接管
    • 应用有:高级电源管理 (APM)、 高级配置和电源接口 (ACPI)、可信平台模块 (TPM)

Model Specific Registers (MSRs)

model-specific register (MSR) ,顾名思义就是特殊用途寄存器,这是一组用于调试、程序tracing、性能监控、设置cpu特性的寄存器

读取和写入这些寄存器是需要通过特权指令rdmsrwrmsr ,常见的MSR 是 内存类型范围寄存器 (MTRR) 和 地址范围寄存器 (ARR)( 没见过:( )。

写hypervisor的时候会处理很多MSR,比如 MSR_IA32_FEATURE_CONTROL ,值为0x0000003a,通过readmsr就可以读这个寄存器的值

// from https://github.com/HyperDbg/HyperDbg/issues/24
BOOLEAN HvIsVmxSupported()
{
    CPUID                    cpu              = {0};
    IA32_FEATURE_CONTROL_MSR FeatureControlMsr = {0};
    // Gets Processor Info and Feature Bits
    __cpuid((int *)&cpu, 1);
    // Check For VMX Bit CPUID.ECX[5] 
    if (!_bittest((const LONG *)&cpu.ecx, 5))
        return FALSE;           // return false if vmx is not supported 
    FeatureControlMsr.All = __readmsr(MSR_IA32_FEATURE_CONTROL);
    if (FeatureControlMsr.Fields.EnableVmxon == FALSE)
    {
        LogError("Please Enable VT-X From Your BIOS"); 
        return FALSE;
    }
    return TRUE;        
}

Privilege Rings & Segmentation

ring0, ring1, ring2, ring3

数字越小权限越高,一般操作系统用ring0表示内核态,用ring3表示用户态,其他两个不用

虚拟化中层级比较复杂:

  • ring0 表示hypervisor(VMM)
  • ring1是guest OS,还有一些VM管理软件
  • ring3是用户应用

ref: https://www.youtube.com/watch?v=ts9Rx4FK9YU

Segmentation 是把处理器线性地址空间(linnar address space or 物理地址)分割成小一点的受保护的地址空间,这些地址空间被称为 segments

IA-23e 模式中,如果处理器运行在64-bit mode,segmentation基本被禁用,段寄存器(FS,GS除外)都被当做0,直接用64位的offset来确定偏移

Pasted image 20221202234829

Pasted image 20221202234957

16-bit Segment Selector:

Pasted image 20221202235024

  • 13bits用作索引,共有8192个可能
  • Table Indicator 表示从 GDT和LDT中选一个
  • 2bits RPL用作权限控制

Pasted image 20221202235215

  • 6个16位寄存器包含(其实这几个寄存器还有其他位被隐藏)上面提到的数据结构:Segment Selector
  • CS - Code Segment
  • SS - Stack Segment
  • DS - Data Segment
  • ES/FS/GS - Extra (通常是Data) Segment

寄存器一览:

  • 16个 64-bit 寄存器
  • 6个 16-bit 寄存器
  • 64-bit 寄存器 RFLAG
  • 64-bit 寄存器 RIP

https://www.youtube.com/watch?v=ArDl_7zdMNI&list=PLUFkSN0XLZ-myVyCmMvfz_W5Z5SauI3cN&index=7

[Advent Calendar 2022] (12/04) "Thinking in bets - Annie Duke"

  • 皮特卡罗尔是我们倾向于将决策质量等同于其结果质量的受害者。 扑克玩家对此有一个词:“结果”。 当我开始玩扑克时,更有经验的玩家警告我由此带来的危险,告诫我要抵制 仅仅因为几手牌在短期内表现不佳而改变策略的诱惑。
  • 我还没有遇到过不识别他们最好和最坏的结果_ 而不是他们最好和最坏的决定的人.
  • 决定质量不是决策质量
  • 事后偏见(hindsight bias)是一种倾向,在知道结果后,认为结果是不可避免的
  • 我问聚集的小组,“谁认为这是一个错误的决定?” 毫不奇怪,每个人都 同意公司经过了深思熟虑的过程,并根据他们当时的了解做出了合理的决定。
  • 没有清醒的人认为酒后驾车最后安全回家反映了一个好的决定或 良好的驾驶能力。 根据那个幸运的结果改变未来的决定是危险的
  • 此外,一旦游戏结束,扑克玩家必须从大量混乱的决定和结果中学习,将运气与技巧、信号与噪音分开,并防范结果和情绪的干扰。 这是唯一的改进方法,尤其是当同样的压力下情况会以各种形式再次出现时。
  • 当我们从生活的结果中寻找教训时,我们也会犯同样的错误。 我们的生命太短暂了,无法从我们自己的经历中收集足够的数据,从而 很容易从我们经历的一小部分结果中深入挖掘决策质量。 如果我们买了一栋房子,稍微装修一下,三年后以比我们支付的价格高出 50% 的价格卖掉,这是否意味着我们在买卖房产或装修房屋方面很聪明? 它可以,但这也可能意味着市场有很大的上升趋势,购买几乎任何一块房产都会赚到 同样多的钱。 或者,也许购买同一所房子而根本不修理它可能会产生相同(甚至更好)的利润。 在 2007 年至 2009 年期间,许多以前成功的 炒房者不得不面对这种真实的可能性。
  • 有时概率的作用大于选择
  • 优秀的扑克玩家和优秀的决策者的共同点是他们对世界是一个不确定和不可预测的地方感到安心。 他们明白,他们几乎永远无法确切知道事情的结果。 他们拥抱这种不确定性,而不是专注于确定性,他们试图弄清楚自己有多 不确定 ,对不同结果发生的可能性做出最好的猜测。
  • 损失厌恶是前景理论的一部分(该理论为 Kahneman 赢得 了 2002 年诺贝尔经济学奖),一般来说,损失的感觉是胜利的两倍。 因此,在二十一点赢 100 美元对我们来说感觉很好,就像输了 50 美元对我们来说感觉不好一样。 因为对的感觉就像赢了,错的感觉就像输了,这意味着我们需要两个有利的结果来抵消一个不利的结果,这样才能在情感上达到收支平衡。
  • 寻求真相,无论真相是否符合我们目前持有的信念,都渴望知道真相,而我们处理信息的方式并不能自然地支持这一点。 我们可能认为自己**开放,能够根据 新信息更新我们的信念,但研究最终 表明并非如此。 我们不是改变我们的信念以适应新信息,而是相反,改变我们对信息的解释以适应我们的信念。## Hearing is believing
  • 结果与哈斯托夫和坎特里尔将近 60 年前的发现如出一辙:“我们的 受试者都观看了同一个视频。 但他们所 看到 的——只是为了说服而认真表达异议,或意图干涉 他人自由的人身恐吓——取决于抗议者的立场与主体自身文化价值观的一致性。” 无论是足球比赛、抗议活动还是其他任何事情,我们原有的信念都会影响我们 体验世界的方式。 这些信念不是以一种特别有序的方式形成的,这会导致我们在决策过程中出现各种错误。
  • 假新闻并不意味着改变想法。 众所周知 ,信念很难改变。 假新闻的力量在于它巩固了目标受众已有的信念,然后将其放大。 互联网是动机推理(motivated reasoning)的游乐场。 它提供了访问比以往任何时候都更多样化的信息源和观点的承诺,但我们倾向于使用证实我们的信念、同意 我们的信息源。 每种口味都在那里,但我们倾向于坚持我们最喜欢的

[Advent Calendar 2022] (12/16) 斯特金定律

斯特金定律 #TIL

  • 就像每个包管理器(或其他人类的劳动成果)一样,它遵循斯特金定律:80% 的东西都是垃圾。 也就是说,crates.io 上有 10 万个 crate,其中很多都很棒(得到良好支持、积极开发、记录等)。 对于新用户来说,了解哪些是高质量的是一项艰巨的任务,只需向有经验的人询问具体建议即可加快速度。

[Advent Calendar 2022] (12/07) TIL

什么是 NAT

  • 这是一个 One-to-many NAT 典型的配置
    • 本地网络使用指定的私有IP地址子网之一(RFC 1918 [3] )。
    • 该网络有一个路由器,该路由器具有私有地址和公共地址。 路由器使用私有地址与私有本地网络中的其他设备进行通信。 路由器使用公共地址(通常由 Internet 服务提供商分配)与 Internet 的其余部分进行通信。
    • 当流量从网络传递到 Internet 时,路由器会将每个数据包中的源地址从私有地址转换为路由器自己的公共地址。 路由器跟踪有关每个活动连接的基本数据(特别是目标地址和端口 )。 当路由器从 Internet 接收入站流量时,它使用在出站阶段存储的连接跟踪数据来确定应将回复转发到哪个私有地址(如果有)。

[Advent Calendar 2022] (12/08) 应用:用户态勒索软件保护

之前看到了 fsnotify 这个文件事件通知库,本来打算写个监控敏感文件访问的程序,但发现这玩意至少在 windows 上支持对文件读操作的支持,想要实现该功能只能通过写驱动或者配置日志策略,就暂时没研究了。

这次想起来能拿这个结合诱饵文件来做勒索软件的对抗,思路为在电脑中的关键位置放置诱饵文件,可以在下载目录、文档目录、桌面、磁盘根目录等位置放置特定名字的文本、文档文件,然后用 fsnotify 监控这些文件的写入,如果某个程序写入了诱饵文件。则找到这个程序杀死它,也可以通过某种方式通知用户。

但是事与愿违,fsnotify 并不能找到是谁在写诱饵文件,可能的处理方法有:

  1. 把最近N分钟内启动的进程都给杀了,需要有个白名单防止误删,不过误触的概率貌似不太高
  2. 扫一遍句柄,把有类似路径句柄的进程杀了,同样需要放误触

不过这些方法都不太精确,最好后面能找到确定进程的方法。

目前按照方法1实现了代码:https://github.com/b1tg/StopCrying

[Advent Calendar 2022] (12/11) book notes

《随机漫步的傻瓜》纳西姆·尼古拉斯·塔勒布 #book

67个笔记

◆ 前言 幸运的交易员

法国诗人瓦雷里(Paul Valery)曾经很讶异地听到有人评论他的诗,从他的诗中挖掘出他从未设想过的意义。当然,有人告诉他,那些概念存在于他的潜意识中

◆ 第一篇 黑天鹅事件

“看尽人世间形形色色、无数的不幸之后,我们不能因为眼前的享乐而狂妄自大,或者赞美稍纵即逝的幸福快乐。世事难料,未来变幻莫测。只有承蒙上苍垂怜从此能幸福以终的人,我们才能称之为幸福快乐。”

梭伦甚至了解另一个相关的问题,我把它叫做偏态(skewness);如果失败的代价过于沉重、难以承受,那么这件事成功的概率有多高根本无关紧要。

◆ 第一章 赚钱的随机性

不拿积蓄去冒险,因此存款只投资于最安全的工具。公债十分安全,它们是美国政府发行的,而政府破产的可能性很低,因为他们随时可以印制钞票来偿还债务。

。塔利波常说,身为交易员,唯一的缺点是会见到一大笔钱掉到毫无心理准备的人手里,逼得他们不得不去试着了解维瓦尔第的《四季》这种“优美的”音乐。不过对他太太来说,几乎天天要听到对面邻居夸称他们又请了一位新的装潢师,这种日子也够苦的。

2022/11/23发表想法
嫉妒心理难以避免
理性上的轻蔑,不能掩饰个人的艳羡。对街的房子越来越大,扩建之后又扩建,塔利波内心的不舒服也日甚一日。

理性上的轻蔑,不能掩饰个人的艳羡。对街的房子越来越大,扩建之后又扩建,塔利波内心的不舒服也日甚一日。

。除了约翰的大房子之外,是不是也因为天生的强弱有别,才害他成了次等人?更糟的是,约翰比他晚5年入行,收入却至少是他的10倍

心理学家卡尼曼(Daniel Kahneman)和特沃斯基(Amos Tversky)指出,大部分人宁可在别人赚6万美元时,自己赚得7万美元,而不喜欢在别人赚9万美元时,自己能够赚得8万美元。

◆ 第二章 奇特的结算方法

它也和称做拒斥历史(denigration of history)的问题有关,因为赌徒、投资人、决策者总是觉得,发生在别人身上的事情,不见得会发生在他们身上。

。20世纪90年代末,真的能以MBA一半左右的薪水,请到受过一流科学家训练的人才来为你做事。人们常说,营销即一切;这些人根本不懂得如何推销自己。

此外,谈话中、会议里,尤其是新闻媒体上听起来很有智慧的话,都是值得怀疑的。

◆ 第三章 从数学的角度思考历史

计算机革命带给我们的好处,不是排山倒海而来的电子邮件和进入聊天室聊天,而是突然之间有了速度很快的处理器,每分钟能够创造100万个样本路径。前面谈过,我不喜欢去解数学方程式,也不擅长此道。我比较会列方程式,而不是解方程式。突然之间,我的引擎让我能够不费吹灰之力,解开最棘手的方程式,几乎没有解决不了的方案。

我以历史为师的方法其实有两种:阅读前人的事迹,向过去学习,以及利用我的蒙特·卡罗玩具,向未来学习。

就我所知,拒斥历史的所有同行,后来都炸毁得很惨,而且我还没碰过这样的人而尚未炸毁的。

2022/11/24发表想法
要有这个信念
拥有一身好本事却穷苦潦倒的人,最后一定会爬上来。幸运的傻瓜可能得助于生命中的某些好运气,但是长期而言,他的处境会慢慢趋近于运气没那么好的白痴。每个人都会向长期的性质靠拢。

拥有一身好本事却穷苦潦倒的人,最后一定会爬上来。幸运的傻瓜可能得助于生命中的某些好运气,但是长期而言,他的处境会慢慢趋近于运气没那么好的白痴。每个人都会向长期的性质靠拢

一种观念能够留存那么长的时间,历经那么多的荣衰循环,可见它相当合宜。噪声已被滤除,至少一些噪声已经消失不见。

,就好比演员和作家都很有钱,却忽视一个事实:演员大多当侍者为生,而比较不出色的作家,如果能在麦当劳卖薯条,已属幸运

。如果每天轰炸我们的大量“紧急”新闻中,有比噪声还好的东西,那只能说是沧海一粟。人们不了解新闻媒体引起你的注意才有收入可赚,对新闻记者来说,沉默可不是金。

2022/11/24发表想法
编程语言
偶尔我会搭乘上午6点42分的火车前往纽约。这时候,总是看到睡眼惺忪的上班族埋首阅读《华尔街日报》。报纸不厌其烦地报道各家公司的琐事,而这些公司在本书撰写时,可能已经不存在了。

偶尔我会搭乘上午6点42分的火车前往纽约。这时候,总是看到睡眼惺忪的上班族埋首阅读《华尔街日报》。报纸不厌其烦地报道各家公司的琐事,而这些公司在本书撰写时,可能已经不存在了。

我的问题在于,我缺乏理性,而且很容易被淹没在随机性中,而蒙受情绪上的折磨。我知道自己需要到公园的座椅上或者咖啡厅中沉思,远离信息。只有把信息从我身边夺走,我才做得到这一点。我这一辈子唯一的优点,是知道自己有一些缺点。主要的缺点是,面对新闻时,难以控制情绪上的起伏变化,也没办法保持头脑清醒。沉默是金

◆ 第四章 随机性和科学知识分子

输进“后现代主义学者”的文章,它们能以称做递归文法(recursive grammar)的一种方法随机组词,产生文法上无懈可击,但完全没有意义的句子,听起来就像德里达或帕格利亚(Camille Paglia)等人讲的话。由于人文学者的想法含混不清,很容易被随机性所骗

40年前,天主教会把仪式和礼仪从拉丁文转成各地语言。我们可以说,由于这种做法,导致宗教信仰滑落。突然之间,宗教被人以知识和科学标准加以评判,而不用美学的标准去评判

◆ 第五章 最不适者可能生存吗?

。经验丰富的交易员康奈尔把这叫做消防站效应。他观察到,消防队员闲着没事干,久而久之,聊得太多,就会对很多事情形成相同的看法,而这些看法,在客观的局外人看来,十分荒唐可笑。心理学家对这现象有更漂亮的称呼,但我的朋友康奈尔没学过临床心理学,因此只能将之称做消防站效应。

市场的跌幅不是很大,但他运用的杠杆太大了。更叫他惊讶的是,他们计算这种情形发生的概率是100万亿亿年才有一次。亨利称之为“10西格玛”(ten sigma)事件。亨利即使把概率调高一倍,也似乎于事无补,因为这么一来,概率也只是100万亿亿年才有两次。约翰何时能从这场惨剧中恢复过来?或许永远不能。原因不在于约翰赔了钱,而是他整个毁了。对好交易员来说,赔钱是必须习惯的现实。但约翰赔掉的钱多于他准备输掉的,他个人的信心已荡然无存。

达尔文学说的适应性适用于在非常长的期间内发展的物种,而不是短期观察到的现象—时间累积消除了随机性的大部分效应;就像人们所说的,长期而言,事事(噪声)相互抵消而取得均衡。由于有突发的稀有事件,我们不是活在种种事物持续“趋向”改善的世界中。生命中的各种事情也根本不是以连续不断的方式变动。

量子力学把它推翻了。我们发现在极小的尺度下,粒子是在不同的能级间,不连续地跃进,而不是在其间滑动

像约翰那种高获利的交易员,长期而言肯定是输家,而且相对而言不适于生存,短期内却有很高的成功概率,同时能够大量繁殖他的基因。前面曾经谈过荷尔蒙对一个人行为举止的影响,以及能在择偶时发出什么样的讯号。他的成功(或者应该说是假性成功,因为相当脆弱)会显现在他的外貌上,引人注目。不知情的潜在配偶会被他的外表所骗,误以为他拥有优异的基因组成,直到稀有事件发生才揭发真相

◆ 第六章 偏态与不对称

假设我参加的赌博,1000次里面有999次赚到1美元(事件A),有一次赔10000美元(事件B),如表6–1所示。表6–1[插图]我的期望值是赔9美元左右,这是将概率乘以对应的结果所得到的数字。赔钱的频率或概率本身完全没有用处,它必须和结果的大小一起判断。这里的A发生的概率远高于B

我讨厌那些没在图书馆做太多功课,就以为自己对某一主题拥有原创性和深邃高见的人。

2022/11/27发表想法
看期望而不是二极管
我回答说,除了动物学上的意义,我不懂“牛市”或“熊市”的意思。就和前例中的事件A与事件B一样,我的意见是市场上涨的可能性比较高(我看好后市),但最好是卖空(我看坏结果),因为万一市场下跌,它可能跌很多。突然之间,会议室内总算有极少数交易员了解我的意思,并且开始发表类似的看法。下一次讨论时,他们果然没有再强迫我参加。

我回答说,除了动物学上的意义,我不懂“牛市”或“熊市”的意思。就和前例中的事件A与事件B一样,我的意见是市场上涨的可能性比较高(我看好后市),但最好是卖空(我看坏结果),因为万一市场下跌,它可能跌很多。突然之间,会议室内总算有极少数交易员了解我的意思,并且开始发表类似的看法。下一次讨论时,他们果然没有再强迫我参加。

2022/11/27发表想法
可能小却致命
科学家起初忽视了,温度突升的现象虽然少见,却会对冰帽的融化产生巨大的累积性效果。和财务学的领域一样,某个事件虽然罕见,但如果会带来巨大的后果,就不能视而不见

科学家起初忽视了,温度突升的现象虽然少见,却会对冰帽的融化产生巨大的累积性效果。和财务学的领域一样,某个事件虽然罕见,但如果会带来巨大的后果,就不能视而不见

稀有事件总是出乎意料地发生,否则它们就不叫稀有事件

◆ 第七章 归纳法的问题

1996年,尼德霍夫向我指出:任何“可检测的”陈述都应该加以检测,我的操作风格从此有了转变。他的建议一语中的、其理至明,但我一直没有那么做。可检测的陈述是指能够将其细分成量化的成分,并对它们进行统计检查。

我必须十拿九稳地赚钱,才能挣回刚在黎巴嫩战争期间失去的未来和财富。我遽然感到财务上很没保障,而且害怕成为某家公司的员工,变成只谈“工作伦理”的企业奴隶。我需要有厚实的银行户头作后盾,才能买到时间去思考和享受人生。我不想过着空谈哲理却只能在麦当劳打工的生活。在我看来,哲学是闲得没事干的人锻炼修辞的天地,是留给那些不熟悉计量方法和其他生产性工作的人做的,是三更半夜在校园附近的酒吧打发时间用的。

2022/12/01发表想法

受到索罗斯的激励,1987年我在纽约第二十一街和第五大道路口的巴诺书店(Barnes & Noble)一口气看了50页《科学发现的逻辑》(The Logic of Scientific Discovery),并且疯狂买下双手抱得动的所有波普尔著作,担心以后会缺货买不到。

受到索罗斯的激励,1987年我在纽约第二十一街和第五大道路口的巴诺书店(Barnes & Noble)一口气看了50页《科学发现的逻辑》(The Logic of Scientific Discovery),并且疯狂买下双手抱得动的所有波普尔著作,担心以后会缺货买不到。

理论:第一,经过检验并以适当的方法予以驳斥、已知为错误的理论,称之为已被证伪(falsified)。第二,尚未得知是否错误或者尚未遭否证,但将来有可能被证明为错误的理论。

如果一个理论没有包含一组可以被验证为错误的条件,只能称之为骗术—否则无法加以驳斥。为什么?因为占星家总是能够找到理由去解释过去的事件,比如说“火星在线上但运势不太强”。

我力行波普尔学说的方式是:我在代表某种世界观的理论下,从事各种投机生意,但条件是没有任何一个稀有事件可以伤害我。事实上,我还希望从所有想象得到的稀有事件中获益。

◆ 第二篇 打字机前的猴子

我并不否认假如某人过去的表现优于他人,便可推测他将来也可能有更好的表现。但是这种推测非常薄弱,以至于决策时一无可取。为什么?因为最重要的是两项因素:他从事工作的随机成分多寡,以及有多少数目的猴子参与。

这些偏差可以简述如下:第一,存活者偏差(又称打字机前的猴子),起于我们只看见赢家,对运气持有的看法遭到扭曲。第二,不同凡响的成功最常见的原因是运气。第三,我们在生物构造上缺乏了解概率的能力。

◆ 第八章太多 “下一个富翁”

工作日里他在晚上9点30分以后才能回家,有时则在办公室待到接近午夜。一周结束时,马克疲累异常,在开车前往“我们的家”途中,总是睡意昏沉,周六大部分时间也都躺在床上恢复体力。

他后来如期在7年的时间内当上合伙人,却也付出了一般常见的代价。他的第一任妻子离他而去,因为她厌倦有个老是不在家的律师

我们不必多谈马克和珍娜生活上碰到的契诃夫式困境(Chekovian dilemmas),但他们的例子正好可用来说明存活者偏差常见的情绪影响

我一再提及,人的天性很难变得更理性,或者不以社会地位低下为耻,至少就我们目前的DNA密码来说是如此。从理性的推论中得不到慰藉,身为交易员,我知道违反意愿强迫自己保持理性,终归徒劳无功。我建议珍娜搬离那里,住到蓝领阶级的社区中。这么一来,再也不会被邻居看扁,而且身份地位会升高到超越他们的成功概率。他们可以善用反向的扭曲。

如果俭省度日是最终的目标,那么他应该去当僧侣或社会工作者

资本主义的优点在于社会能够善用人们的贪婪,而不是他们的善行,同时也不需要颂扬这种贪婪为一种道德或知性成就。

◆ 第九章 买卖证券比煎蛋容易

一群整体能力欠佳的经理人,仍会有少数人的绩效记录很好。就是蒙古首都乌兰巴托的温度变化,也可能与某种证券的价格走势百分之百相关。

一个房间内有23个人,任意两人生日同一天的概率有多少?约为50%。关键在于我们没有指明哪两个人必须同一天生日;任意两人都可以

,比方说,我看过一位罹患喉癌的病人说,他吃了一种综合维生素,结果捡回一条命,而那种维生素的价格十分低廉,只卖14.95美元。他应该是很真诚的,当然他也可能会因为现身说法而得到报酬,例如终身免费供应那种药品之类的。虽然时代不断在进步,人们依然听信这种信息,以为某些疾病可以靠这些方法治好,而科学证据的说服力竟然不敌外表真诚且情绪化的证词

2022/12/06发表想法
无对照,无论证
其实这是由于所谓的“自发性复原”(spontaneous remission),也就是说,由于迄今仍不明朗的原因,极少数癌症患者的癌细胞“神奇地”被消灭,因此“奇迹似的”复原了。某种变化导致患者的免疫系统把体内所有的癌细胞全给消灭,这些人不吃那些包装精美的药丸,只喝一杯佛蒙特州的泉水或嚼牛肉干,也能不药而愈。再者,这些自发性复原或许没有那么自发性,因为它们实际上可能有其原因,只是我们还没有察觉。

其实这是由于所谓的“自发性复原”(spontaneous remission),也就是说,由于迄今仍不明朗的原因,极少数癌症患者的癌细胞“神奇地”被消灭,因此“奇迹似的”复原了。某种变化导致患者的免疫系统把体内所有的癌细胞全给消灭,这些人不吃那些包装精美的药丸,只喝一杯佛蒙特州的泉水或嚼牛肉干,也能不药而愈。再者,这些自发性复原或许没有那么自发性,因为它们实际上可能有其原因,只是我们还没有察觉。

这些格子如果不出现(癌症)丛集,将是极为罕见的事。现在,把插有飞镖的格子覆盖在任何地区的地图上,一些报纸就会宣称其中某个地方(飞镖数高于平均值者)的辐射线太强,造成癌症病例显著增多,因而促使律师开始去找癌症患者,准备索赔

◆ 第十章 生活中的非线性现象

名气的形成有其自身的动态过程,这是它有趣的一面。演员会因为某一群人认识他,而被另一群人认识,这种名气像螺旋一样动个不停,起点可能在试演室。他会被选上,可能是某个可笑的细节恰好投合主试者当天的心情。要是主试者前一天对某个人产生好感,而那个人的名字听起来和眼前这位试演者很像,那么从那个特殊的样本历史中选出的这位演员,可能就必须在另一个样本历史中端送拿铁咖啡

2022/12/07发表想法
路径依赖结果
就像一位演员扶摇直上成为大明星后,原先不认识他们的观众也会跟着欣赏称好。强迫发展过程理性化,反而成了多余、不必要、不可能办到的事。这称做路径依赖结果(path dependent outcome),阻碍了许多数学家建构模型的努力。

就像一位演员扶摇直上成为大明星后,原先不认识他们的观众也会跟着欣赏称好。强迫发展过程理性化,反而成了多余、不必要、不可能办到的事。这称做路径依赖结果(path dependent outcome),阻碍了许多数学家建构模型的努力。

比方说,圣塔菲研究所(Santa Fe Institute)的经济学家布赖恩·阿瑟(Brian Arthur)埋首研究非线性现象后表示,经济优越性取决于概率事件加上正面回馈,而不是看技术优越性

◆ 第十一章 我们是概率盲

但是更深一层的原因是,人类不是被设计来理解事物的,我们只是被设计来求生和繁衍后代,但为了求生存,我们必须夸大某些事情的概率,例如可能影响我们存活的事件发生的概率

大部分医生只考虑检测的准确率为95%,而回答95%。正确的答案是病患生病且检测发现有病的条件概率,其结果接近2%。结果有不到1/5的专业人士答对。我来简化这个答案。假设没有漏报(false negatives)存在。1000个受检的病患中,预料将有一位罹患这种疾病。999位健康的病患中,检测的结果将有约50位染病,因为准确率是95%。正确的答案应该是,随机选取的某人,检测呈现阳性且确实染病的概率如下:答案为1/51。不妨想想,这一辈子你曾有多少次被告知染上某种疾病,需要接受某种药物治疗且忍受可怕的副作用,而实际上你真的罹患那种疾病的概率只有2%!

◆ 第三篇 活在随机世界中

人们过去做出的选择决定了他们现在及未来可能的选择。索罗斯这类股市大鳄完全不受过去的行为束缚,摆脱了路径依赖,每一天对他来说都是一张白纸。

◆ 第十二章 赌徒的迷信和笼中的鸽子

那时我二十来岁,住在曼哈顿上东区一栋书满为患,除此别无他物的公寓里,每天早上搭黄色出租车上班,在公园大道和五十三街的路口下车。有一天,不幸(或许应该说是很幸运)搭上一辆出租车,不管我用什么语言,连出租车英语都用上了,司机还是听不懂。我试着要他在七十四街和五十三街之间往南走,但他顽固地再往南多走了一个街区,逼得我只好利用五十二街的入口进公司。那一天,由于汇率激烈波动,我操作的投资组合赚了很多钱。那是我年轻时最美好的一天。

◆ 第十三章 概率与怀疑论

罗马听众大为动容。他不只散发难以抗拒的魅力,论点也铿锵有力、口齿流利且具说服力、语言纯正、精力无穷。但这却不是他要传达的重点。隔天,卡涅阿德斯重回现场,仍旧站立着,以最具说服力的方式,鼓吹起知识不确定性的信条。他是怎么做的?他以同样撼动人心的论点,驳倒了前一天已令听众信服的论点。他在同一个地方,说服同一批听众,相信公理正义应该列于人类处事动机的底层。

[Advent Calendar 2022] (12/03) 如何在 windbg 中寻找 C/Rust/Golang 程序的 main 函数

在用windbg调试程序时常常需要找到程序的入口点,这篇文章尝试探索如何在 windbg 中寻找 C、Golang、Rust 等程序的 main 函数

这里的测试环境是:

  • rustc 1.67.0-nightly
  • go1.19.3
  • cl 19.33.31630

测试程序均在Windows 11上使用默认选项编译成64位程序

在 windbg 中寻找 C 程序的 main 函数

// cl re-entry-c.c
#include <stdio.h>
int main() {
    printf("hello from re-entry-c");
}

IDA中可以看到调用顺序如下:

start
	[...]
	call __security_init_cookie
	[...]
	jmp __scrt_common_main_seh
		[...]
		mov     r8, rdi    ; envp
		mov     rdx, rbx   ; argv
		mov     ecx, [rax] ; argc
		call main
		[...]

image-20221203163655548

image-20221203164205881

在windbg中可以看到入口点处的汇编,这里的入口点对应ida中看到的start函数

0:001> u $exentry
re_entry_c+0x1338:
00007ff6`0c0f1338 4883ec28        sub     rsp,28h
00007ff6`0c0f133c e85b020000      call    re_entry_c+0x159c (00007ff6`0c0f159c)
00007ff6`0c0f1341 4883c428        add     rsp,28h
00007ff6`0c0f1345 e972feffff      jmp     re_entry_c+0x11bc (00007ff6`0c0f11bc)

不过我们想要的是 main 函数,观察到 call main 之前有对 main 三个参数的操作,考虑用对应的汇编字节来搜索到 call main 的位置

4c8bc7          mov     r8,rdi ; envp
488bd3          mov     rdx,rbx ;  argv
8b08            mov     ecx,dword ptr [rax] ; argc
e838fdffff      call    re_entry_c+0x1000 (00007ff6`0c0f1000) ; call main

lm可以看到当前模块的基地址为 00007ff6-0c0f0000 ,我们把这个地址作为搜索的开始地址

0:001> lm
start             end                 module name
00007ff6`0c0f0000 00007ff6`0c113000   re_entry_c C (no symbols)           
00007ffb`68840000 00007ffb`68858000   kernel_appcore   (deferred)             
00007ffb`69c10000 00007ffb`69fad000   KERNELBASE   (deferred)             
00007ffb`6a520000 00007ffb`6a5c7000   msvcrt     (deferred)             
00007ffb`6a6e0000 00007ffb`6a7a2000   KERNEL32   (pdb symbols)          C:\ProgramData\Dbg\sym\kernel32.pdb\CFDB74A3879450D4C3ABDC9A45327D3F1\kernel32.pdb
00007ffb`6c2d0000 00007ffb`6c4e4000   ntdll      (pdb symbols)

搜索汇编指令,从基地址开始搜索 call main前的几条汇编语句,即可定位到call main的位置,这里使用 # 指令搜索汇编语句,488bc7 对应 mov r8, rdi

0:001> # 488bc7 00007ff6`0c0f0000
re_entry_c+0x3369:
00007ff6`0c0f3369 488bc7          mov     rax,rdi
0:001> # ecx?dword?ptr??rax? 00007ff6`0c0f0000
re_entry_c+0x12c1:
00007ff6`0c0f12c1 8b08            mov     ecx,dword ptr [rax]
                                      

注意:搜索指令 # 有很多限制,具体见 文档,貌似需要要把歧义字符都用问号来代替。

使用搜索指令 s 也能找到相应的地址:

0:001> s 00007ff6`0c0f0000 l10000 4c 8b c7 48 8b d3
00007ff6`0c0f12bb  4c 8b c7 48 8b d3 8b 08-e8 38 fd ff ff 8b d8 e8  L..H.....8......
0:001> u 00007ff6`0c0f12bb 
re_entry_c+0x12bb:
00007ff6`0c0f12bb 4c8bc7          mov     r8,rdi
00007ff6`0c0f12be 488bd3          mov     rdx,rbx
00007ff6`0c0f12c1 8b08            mov     ecx,dword ptr [rax]
00007ff6`0c0f12c3 e838fdffff      call    re_entry_c+0x1000 (00007ff6`0c0f1000); call main
0:001> u 00007ff6`0c0f1000 ; main
re_entry_c+0x1000:
00007ff6`0c0f1000 4883ec28        sub     rsp,28h
00007ff6`0c0f1004 488d0df5bf0100  lea     rcx,[re_entry_c+0x1d000 (00007ff6`0c10d000)]
00007ff6`0c0f100b e870000000      call    re_entry_c+0x1080 (00007ff6`0c0f1080)
00007ff6`0c0f1010 33c0            xor     eax,eax
00007ff6`0c0f1012 4883c428        add     rsp,28h
00007ff6`0c0f1016 c3              ret
00007ff6`0c0f1017 cc              int     3
00007ff6`0c0f1018 cc              int     3
0:001> da 00007ff6`0c10d000
00007ff6`0c10d000  "hello from re-entry-c"

在 windbg 中寻找 Rust 程序的 main 函数

// rustc re-entry-rust.rs
fn main() {
    println!("hello from re-entry-rust");
}

用和C相同的方法可以找到入口点,因为windows上安装的rust默认用的也是msvc工具链

image-20221203173157460

在 windbg 中寻找 Golang 程序的 main 函数

// go build re-entry-golang.go
package main

func main() {
	println("hello from re-entry-golang")
}

golang 比较棘手,拖到ida中就会报错,调用链也很复杂

image-20221203192731506
在ida中对应代码中main函数的符号是 main_main,且xref不到调用它的函数,通过全局搜索找到了调用main_main的地方,是用 call eax 调用的,有了这个,就可以试着来搜索汇编指令。

image-20221203192945429

模块基地址为 00000000-00920000

0:000> lm
start             end                 module name
00000000`00920000 00000000`00aaa000   re_entry_golang T (no symbols)           
00007ffb`69c10000 00007ffb`69fad000   KERNELBASE   (deferred)             
00007ffb`6a6e0000 00007ffb`6a7a2000   KERNEL32   (deferred)             
00007ffb`6c2d0000 00007ffb`6c4e4000   ntdll      (pdb symbols)          C:\ProgramData\Dbg\sym\ntdll.pdb\49F757E05C19DD09795740D5F2B050E71\ntdll.pdb

搜索汇编字节 ff d0 8b 05 (call rax)

0:000> s 00000000`00920000 l100000 ff d0 8b 05
00000000`0095301c  ff d0 8b 05 e8 6e 0e 00-85 c0 74 1d 31 c0 eb 66  .....n....t.1..f
0:000> u 00000000`0095301c l-10
re_entry_golang+0x3300c:
00000000`0095300c 751e            jne     re_entry_golang+0x3302c (00000000`0095302c)
00000000`0095300e 488b05e3ca0300  mov     rax,qword ptr [re_entry_golang+0x6faf8 (00000000`0098faf8)] ;传入rax
00000000`00953015 488d15dcca0300  lea     rdx,[re_entry_golang+0x6faf8 (00000000`0098faf8)]
00000000`0095301c ffd0            call    rax

rax指向的地址即为入口地址即ida中看到的函数 main_main

0:000> u poi(00000000`0098faf8) ;即rax的值
re_entry_golang+0x5c8a0:
00000000`0097c8a0 493b6610        cmp     rsp,qword ptr [r14+10h]
00000000`0097c8a4 7633            jbe     re_entry_golang+0x5c8d9 (00000000`0097c8d9)
00000000`0097c8a6 4883ec18        sub     rsp,18h
00000000`0097c8aa 48896c2410      mov     qword ptr [rsp+10h],rbp
00000000`0097c8af 488d6c2410      lea     rbp,[rsp+10h]
00000000`0097c8b4 e88758fdff      call    re_entry_golang+0x32140 (00000000`00952140)
00000000`0097c8b9 488d05d3fe0000  lea     rax,[re_entry_golang+0x6c793 (00000000`0098c793)] ;字符串
00000000`0097c8c0 bb1b000000      mov     ebx,1Bh
0:000> da 00000000`0098c793 l0x20
00000000`0098c793  "hello from re-entry-golang.inter"

done

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.