链接: http://www.opencjk.org/~scz/misc/200608160952.txt

--------------------------------------------------------------------------

目录:

    ☆ 去除OmniPeek发包不能伪造源MAC的限制
    ☆ 参考资源

--------------------------------------------------------------------------

☆ 去除OmniPeek发包不能伪造源MAC的限制

1259@netexpert发了个贴,说OmniPeek发包时不能伪造源MAC,即使在数据窗口中指
定了虚假MAC,发送出去时也被自动修正成真实源MAC。而Sniffer Pro没有这个限制。
finger@netexpert测试了一番,证实了这个说法。我乍一看到还不很信,也测试了一
番,果然。WildPackets为什么要加这个限制,懒得深究了,于我看来无非是些掩耳
盗铃之举。反正这个限制我不想要。去除这个限制也很简单,下面以OmniPeek 3.1.1
为例介绍一下全过程。

第一反应是OmniPeek所用NDIS协议驱动peek5.sys中做了限制,XP DDK、XP OS自带的
NDISUIO就对发包时所用源MAC做了限制,不允许伪造。参看:

<<MSDN系列(14)--"NDIS Protocol Driver"入门>>

用IDA Pro逆了peek5.sys,查看NdisSend()的引用关系,没有发现其主调代码附近有
什么限制。既然这样,这个限制就该是用户态代码做的,准备在Ring 3调试OmniPeek。

OmniPeek运行起来后再用OllyICE去Attach的话,多多少少有点问题,我用OllyICE直
接加载OPeek.exe,F9让它运行起来。选中"Send->Edit Send Packet",胡乱构造一
个报文,比如数据链路层的源MAC伪造成"00 00 51 21 13 14",点"OK"。选中"Send
Window",先点"Reset"将"Packets sent"恢复成0,再将"Packets per burst"从5调
成1。现在转回OllyICE,Alt-M叫出"Memory map"窗口,选中最开始的0x00010000地
址,Ctrl-B查找16进制数据,比如"00 00 4E 53 46 4F 00 00 51 21 13 14 08 00"。
假设在0x02BD67AC处找到一次,在此针对源MAC设置OllyICE特有的内存访问断点。回
"Send Window"点击"Transmit One",内存访问断点命中,从ESI复制数据到EDI,可
以db esi、db edi检查一下,针对EDI设置新的内存访问断点(好像OllyICE只能设一
个内存访问断点),F9继续。重复几次,前面几次都是这种简单复制,接着会断在如
下位置:

--------------------------------------------------------------------------
006DD5BD      8910          mov     [eax], edx
006DD5BF      66:8B49 04    mov     cx, [ecx+4]
006DD5C3      66:8948 04    mov     [eax+4], cx
006DD5C7  |.  B0 01         mov     al, 1
006DD5C9  \.  C3            retn
--------------------------------------------------------------------------

db eax、db ecx查看一下,会发现EAX对应我们伪造的源MAC,而ECX对应真实源MAC。
显然这里就是我们需要Hacking的地方,不让真实源MAC写下去就是了,修改方案有多
种,选自己喜欢的吧。我在OllyICE中简单Hacking之后,验证无误,发包时已经可以
任意伪造源MAC。

后来用IDA Pro逆了整个OPeek.exe,上述代码实际是ModifySrcMac/0x006DD5B0的一
部分:

--------------------------------------------------------------------------
006DD5B0                         ModifySrcMac proc near
006DD5B0 80 39 00                    cmp byte ptr [ecx], 0
006DD5B3 75 03                       jnz short ModifySrcMac_0
006DD5B5 32 C0                       xor al, al
006DD5B7 C3                          retn
006DD5B8
006DD5B8                         ModifySrcMac_0:
006DD5B8 83 C1 58                    add ecx, 58h
006DD5BB 8B 11                       mov edx, [ecx]
006DD5BD 89 10                       mov [eax], edx
006DD5BF 66 8B 49 04                 mov cx, [ecx+4]
006DD5C3 66 89 48 04                 mov [eax+4], cx
006DD5C7 B0 01                       mov al, 1
006DD5C9 C3                          retn
006DD5C9                         ModifySrcMac endp
--------------------------------------------------------------------------

查看引用关系,发现ModifySrcMac/0x006DD5B0只被调用了一次,因此还可以修改主
调部分。不过稳妥起见,我选择修改被调部分。

本想简单点,直接在OllyICE中Patch,结果生成的OPeek_crack.exe不可用。这个程
序对自身静态文件做了校验,发现被Patch过就不让用了。跟Skype.exe搏斗过后实在
没心情将时间浪费在对付这类自校验上,最终选择写个loader去动态Patch。

将fakesrcmac.exe放在OPeek.exe所在目录。以后不要直接启动OPeek.exe,而是通过
fakesrcmac.exe间接启动OPeek.exe,即可在发包时任意伪造源MAC。

fakesrcmac.exe只适用于OmniPeek 3.1.1,不过其它版本的OmniPeek修理起来类似。

☆ 参考资源

[ 1] http://www.netexpert.cn/viewthread.php?tid=10153&extra=page%3D1

[ 2] <<MSDN系列(14)--"NDIS Protocol Driver"入门>>
     http://www.opencjk.org/~scz/windows/200408171624.txt

[ 3] http://www.opencjk.org/~scz/misc/fakesrcmac.exe