易语言api hook GetAdaptersAddresses 劫持网卡物理地址

GetAdaptersAddresses是获取物理网卡的MAC,这里我们通过HOOK,随机的改变它,效果如下图,获取本节MAC可以采用精易模块的MAC_取本机MAC (1)

511遇见

GetAdaptersAddresses

.版本 2 
.DLL命令 GetAdaptersAddresses, 整数型, "iphlpapi", "GetAdaptersAddresses"
    .参数 Family
    .参数 Flags
    .参数 Reserved
    .参数 AdapterAddresses
    .参数 SizePointer, , 传址

hook

.版本 2
 
h.安装Hook (“iphlpapi.dll”, “GetAdaptersAddresses”, 到整数 (&macaddress))
h.开始Hook ()

macaddress回调

我们采用了取随机字母来改变物理网课的MAC

.版本 2
.支持库 spec
 
.子程序 macaddress, 整数型
.参数 Family
.参数 Flags
.参数 Reserved
.参数 AdapterAddresses, , 参考
.参数 SizePointer, , 参考, 数据大小
.局部变量 ret, 整数型
.局部变量 buf, 字节集
.局部变量 lodsiz, 整数型
.局部变量 IPAA, IP_ADAPTER_ADDRESSES
.局部变量 s, 整数型
.局部变量 macdatee, 字节集
.局部变量 MAC_S, 文本型, , "6"
 
h.停止Hook ()
lodsiz = SizePointer
ret = GetAdaptersAddresses2 (Family, Flags, Reserved, AdapterAddresses, SizePointer)
 
.如果真 (lodsiz ≠ 0)
    ' 在这里任意修改网卡信息。
 
    拷贝内存_IP_ADAPTER (IPAA, 取变量数据地址 (AdapterAddresses), Len_IP_ADAPTER (IPAA))
    拷贝内存_IP_ADAPTER (lens, 取变量数据地址 (AdapterAddresses), Len_IP_ADAPTER (IPAA))  ' 复制一个新的网卡数据组
 
    lens.pNext = 0
    ' MAC_S = { “1C”, “B7”, “2C”, “DD”, “FF”, “B1” }
    MAC_S [1] = 随机数母2 ()
    MAC_S [2] = 随机数母2 ()
    MAC_S [3] = 随机数母2 ()
    MAC_S [4] = 随机数母2 ()
    MAC_S [5] = 随机数母2 ()
    MAC_S [6] = 随机数母2 ()
 
    .计次循环首 (6, s)
        IPAA.PhysicalAddress [s] = 进制_十六到十 (MAC_S [s])  ' 修改网卡1 的网卡mac
    .计次循环尾 ()
 
    .计次循环首 (6, s)
        lens.PhysicalAddress [s] = 进制_十六到十 (MAC_S [s])  ' 修改网卡2 的网卡mac
    .计次循环尾 ()
 
    拷贝内存 (IPAA.pNext, lens, Len_IP_ADAPTER (IPAA))  ' 将之前拷贝出的新数据地址写入pNext 提供枚举获取
    拷贝内存 (取变量数据地址 (AdapterAddresses), IPAA, Len_IP_ADAPTER (IPAA))
 
.如果真结束
h.开始Hook ()
返回 (ret)

hook dll 源码

我们也可以写一个注入的DLL,采用了EIP注入和远程线程注入来演示,以下是源码:

.版本 2
.支持库 spec
hook ()
_临时子程序 ()  ' 在初始化代码执行完毕后调用测试代码
返回 (0)  ' 返回值被忽略。
.子程序 _临时子程序
 
' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
 
.子程序 hook, , 公开
 
h.安装Hook (“iphlpapi.dll”, “GetAdaptersAddresses”, 到整数 (&macaddress))
h.开始Hook ()
 
.子程序 macaddress, 整数型
.参数 Family
.参数 Flags
.参数 Reserved
.参数 AdapterAddresses, , 参考
.参数 SizePointer, , 参考
.局部变量 ret, 整数型
.局部变量 buf, 字节集
.局部变量 lodsiz, 整数型
.局部变量 IPAA, IP_ADAPTER_ADDRESSES
.局部变量 s, 整数型
.局部变量 macdatee, 字节集
.局部变量 MAC_S, 文本型, , "6"
 
h.停止Hook ()
lodsiz = SizePointer
ret = GetAdaptersAddresses (Family, Flags, Reserved, AdapterAddresses, SizePointer)
 
.如果真 (lodsiz ≠ 0)
    ' 在这里任意修改网卡信息。
    拷贝内存_IP_ADAPTER (IPAA, 取变量数据地址 (AdapterAddresses), Len_IP_ADAPTER (IPAA))
    拷贝内存_IP_ADAPTER (lens, 取变量数据地址 (AdapterAddresses), Len_IP_ADAPTER (IPAA))  ' 复制一个新的网卡数据组
 
    lens.pNext = 0
    ' MAC_S = { “1C”, “B7”, “2C”, “DD”, “FF”, “B1” }
    MAC_S [1] = 随机字母数字 ()
    MAC_S [2] = 随机字母数字 ()
    MAC_S [3] = 随机字母数字 ()
    MAC_S [4] = 随机字母数字 ()
    MAC_S [5] = 随机字母数字 ()
    MAC_S [6] = 随机字母数字 ()
 
    .计次循环首 (6, s)
        IPAA.PhysicalAddress [s] = 进制_十六到十 (MAC_S [s])  ' 修改网卡1 的网卡mac
    .计次循环尾 ()
 
    .计次循环首 (6, s)
        lens.PhysicalAddress [s] = 进制_十六到十 (MAC_S [s])  ' 修改网卡2 的网卡mac
    .计次循环尾 ()
 
    拷贝内存 (IPAA.pNext, lens, Len_IP_ADAPTER (IPAA))  ' 将之前拷贝出的新数据地址写入pNext 提供枚举获取
    拷贝内存 (取变量数据地址 (AdapterAddresses), IPAA, Len_IP_ADAPTER (IPAA))
 
.如果真结束
h.开始Hook ()
返回 (ret)
 
.子程序 进制_十六到十, 长整数型, 公开, 将16进制文件转换到10进制数值(返回十进制数)
.参数 文本, 文本型
.局部变量 i, 整数型
.局部变量 t, 文本型
.局部变量 结果, 长整数型
.局部变量 局_文本, 文本型
 
t = “0123456789ABCDEF”
局_文本 = 到大写 (文本)
.计次循环首 (取文本长度 (文本), i)
    结果 = 结果 × 16 + 寻找文本 (t, 取文本中间 (局_文本, i, 1), , 假) - 1
.计次循环尾 ()
返回 (结果)
 
.子程序 随机字母数字, 文本型
.局部变量 tmp, 字节型, , "2"
.局部变量 i, 整数型
置随机数种子 ()
.计次循环首 (2, i)
 
    tmp [i] = 取代码 (取文本中间 (“0123456789ABCDEF”, 取随机数 (1, 16), 1), )
    .判断开始 (取文本左边 (到文本 (tmp), 1) = “0”)
        tmp [i] = 取代码 (取文本中间 (“123456789ABCDEF”, 取随机数 (1, 15), 1), )
    .默认
    .判断结束
.计次循环尾 ()
返回 (到文本 (tmp))

源码下载:http://www.511yj.com/eyuyan-hook-85.html

以一个D3D为例子,表现DLL劫持 由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件。首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录中查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行。这个过程用个形象的词来描述就是系统DLL被劫持(hijack)了。 利用这种方法取得控制权后,可以对主程序进行补丁。此种方法只对除kernel32.dll、ntdll.dll等核心系统库以外的DLL有效,如网络应用程序的ws2_32.dll、游戏程序中的d3d8.dll,还有大部分应用程序都调用的lpk.dll、sxs.dll,这些DLL都可被劫持。 伪造的dll制作好后,放到程序当前目录下,这样当原程序调用原函数时就调用了伪造的dll的同名函数,进入劫持DLL的代码,处理完毕后,再调用原DLL此函数。 这种补丁技术,对加壳保护的软件很有效,选择挂接的函数最好是在壳中没有被调用的,当挂接函数被执行时,相关的代码已被解压,可以直接补丁了。在有些情况下,必须用计数器统计挂接的函数的调用次数来接近OEP。此方法巧妙地绕过了壳的复杂检测,很适合加壳程序的补丁制作。 一些木马或病毒也会利用DLL劫持技术搞破坏,因此当在应用程序目录下发现系统一些DLL文件存在时,如lpk.dll,应引起注意。 首先 运行exe他会把需要的DLL加载进来,加载的目录如无特别的制定的话,现在当前目录找,然后再去系统目录找 我的附件中自带了一个D3D9的绘图程序,是VC写的 调用的是系统的D3D9.DLL(因为目录下没有) 只解压那个exe文件,是不会有文字出现的 如果把其他的DLL一起解压,就会出现下图文字  hello D3D hook! 那么我们如何劫持了D3D9.dll呢 d3d9_Ex.dll 这个文件其实就是D3D9.dll了,但是我们改名字了,程序就不认识了 我们先用 把D3D9.DLL的输出表找到,弄到易语言里,并且生成D3D9.DLL到目录 这样他调用的就是我们的DLL,但是这样会报错,因为我们的DLL没有内容只是一个壳子 只要我们再把他要调用的函数调用一下不就行了吗 源码中的汇编指令是把函数传递到原来的D3D9。现在的D3D9_Ex里 这样调用就是调用我们的DLL->原来的DLL,中间就可以加些我们需要的代码了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

511遇见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值