焦点

python黑帽子第二版代码

时间:2010-12-5 17:23:32  作者:探索   来源:娱乐  查看:  评论:0
内容摘要:《python黑帽子第二版》的代码,我翻到第三遍才敢说看懂了它的坏。不是坏在技术,是坏在那种“我明明能写得更优雅,但偏要让你多跑两步”的拧巴劲儿。 比如第二章那个TCP代理。书里给的代码,硬是用了两个

《python黑帽子第二版》的黑帽代码,我翻到第三遍才敢说看懂了它的第版代码坏。不是黑帽坏在技术,是第版代码坏在那种“我明明能写得更优雅,但偏要让你多跑两步”的黑帽拧巴劲儿。

比如第二章那个TCP代理。第版代码书里给的黑帽代码,硬是第版代码用了两个线程去处理双向数据流。你盯着看,黑帽会觉得这有什么难的第版代码?一个循环收一个循环发不就完了。但真跑起来,黑帽你会发现单线程代理在长连接下会卡死——因为recv()是第版代码阻塞的,你永远不知道对端什么时候说话。黑帽Justin Seitz(作者)写这代码的第版代码时候,大概是黑帽想让你亲手撞一次南墙再回头。他注释里写“这是最粗糙的版本”,可这粗糙恰恰是精髓:它逼着你思考为什么需要select()或者异步。

我最喜欢的是第四章的keyloggers。不是那个简单的Windows钩子版本,是后来用纯Python重写、绕开ctypes调用的那段。他故意不用现成的pyhook库,反而用`GetAsyncKeyState`轮询。代码丑得冒泡——一个while True套着`time.sleep(0.01)`,CPU占用率能飙到15%。但你要是在真实靶机里跑过就明白,这玩意儿比hook稳多了。hook会被杀软盯着,轮询反而像背景噪音。有次我在客户环境里测试,杀软日志干干净净,倒是那个每秒打1000次键盘状态的循环,被EDR当成了“正常程序心跳”。

书里最阴间的部分在第七章,ARP欺骗那节。他给的代码不是直接发伪造包,而是先构建一个`sendp()`的Ethernet层,再叠加ARP。你按他的写法敲一遍,会发现目标机的ARP表更新得慢吞吞,有时候要等十几秒才生效。后来我翻了源码才发现,他故意在发包循环里加了个`time.sleep(0.5)`——这半秒延迟是给交换机留缓存时间的。要是你删了这行,包发太快,交换机会直接丢弃后续帧。这种细节,不跑真实网络根本体会不到。

还有第十章那个SSH隧道。代码用paramiko库实现了正向连接,但反向隧道部分他没用现成的`invoke_shell()`,而是手搓了一个channel对象,自己解析`exec_command`的输出流。我当时觉得这人疯了,直接`invoke_shell`不就行了?直到我拿它连一个开了双因素认证的跳板机——那个shell通道在认证完成前就会断,但他手搓的channel能扛住等待,因为代码里显式处理了`transport.is_active()`的轮询。这玩意儿救了我一次红队演练,当时客户的内网堡垒机只允许SSH出站,这代码硬是给我开了条反向隧道回去。

当然,这书的代码也有过时的地方。比如第三章的netcat替代品,用的还是`subprocess.Popen`去执行系统命令。现在稍微像样点的目标机都跑着AMSI,你Popen一启动powershell就报警。但你换个思路,用他最后那段“动态加载CLR”的代码,把C#的payload塞进PowerShell进程里,反而能绕过。这算不算以毒攻毒?我不知道,但去年我测试一个金融系统时,就靠改了他那段代码,把内存马注进了Java进程——用的还是他那套`ctype.windll.kernel32.VirtualAllocEx`的调用逻辑。

最后说个个人观察。这书第二版比第一版少了些“炫技”代码,多了很多“脏活”代码。比如处理TCP粘包时,他宁可写个循环去`recv(1)`读单字节,也不肯用`struct.unpack`去解包头。这种低效写法,新手看了想骂娘,老手看了会心一笑——因为真实网络里,你永远不知道对端会在哪个字节断开。他写的是教科书,但代码里全是实战的泥巴。

要是你只打算读一遍就扔书架,那这代码对你没用。但如果你像我一样,把每个例子都改着跑、故意弄坏它、再修好——你会发现这书其实是本“反代码”教材。它教你的不是怎么写,而是怎么拆。拆完再装回去,你就比原作者更懂那些协议了。这话有点玄,但干这行的都懂。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap