
第一步,我先从简单的调用出发,定义了一个简单的函数,该函数仅仅实现一个整数加法求和:
LIBEXPORT_API int mySum(int a,int b){ return a+b;}
C# 导入定义:
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAuto,CallingConvention=CallingConventionStdCall)]
public static extern int mySum (int a,int b);
}
在C#中调用测试:
int iSum = RefCommmySum(,);
运行查看结果iSum为5,调用正确。第一步试验完成,说明在C#中能够调用自定义的动态链接库函数。
第二步,我定义了字符串 *** 作的函数(简单起见,还是采用前面的函数名),返回结果为字符串:
LIBEXPORT_API char mySum(char a,char b){sprintf(b,"%s",a); return a;}
C# 导入定义:
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAuto,
CallingConvention=CallingConventionStdCall)]
public static extern string mySum (string a, string b);
}
在C#中调用测试:
string strDest="";
string strTmp= RefCommmySum("45", strDest);
运行查看结果 strTmp 为"45",但是strDest为空。我修改动态链接库实现,返回结果为串b:
LIBEXPORT_API char mySum(char a,char b){sprintf(b,"%s",a) return b;}
修改 C# 导入定义,将串b修改为ref方式:
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAuto,CallingConvention=CallingConventionStdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中再调用测试:
string strDest="";
string strTmp= RefCommmySum("45", ref strDest);
运行查看结果 strTmp 和 strDest 均不对,含不可见字符。再修改 C# 导入定义,将CharSet从Auto修改为Ansi:
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAnsi,CallingConvention=CallingConventionStdCall)]
public static extern string mySum (string a, string b);
}
在C#中再调用测试:
string strDest="";
string strTmp= RefComm mySum("45", ref strDest);
运行查看结果 strTmp 为"45",但是串 strDest 没有赋值。第二步实现函数返回串,但是在函数出口参数中没能进行输出。再次修改 C# 导入定义,将串b修改为引用(ref):
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAnsi,CallingConvention=CallingConventionStdCall)]
public static extern string mySum (string a, ref string b);
}
运行时调用失败,不能继续执行。
第三步,修改动态链接库实现,将b修改为双重指针:
LIBEXPORT_API char mySum(char a,char b){sprintf((b),"%s",a); return b;}
C#导入定义:
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAnsi,CallingConvention=CallingConventionStdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中调用测试:
string strDest="";
string strTmp= RefComm mySum("45", ref strDest);
运行查看结果 strTmp 和 strDest 均为"45",调用正确。第三步实现了函数出口参数正确输出结果。
第四步,修改动态链接库实现,实现整数参数的输出:
LIBEXPORT_API int mySum(int a,int b,int c){ c=a+b; return c;}
C#导入的定义:
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAnsi,CallingConvention=CallingConventionStdCall)]
public static extern int mySum (int a, int b,ref int c);
}
在C#中调用测试:
int c=0;
int iSum= RefComm mySum(,, ref c);
运行查看结果iSum 和c均为5,调用正确。
经过以上几个步骤的试验,基本掌握了如何定义动态库函数以及如何在 C# 定义导入,有此基础,很快我实现了变长加密函数在 C# 中的调用,至此目标实现。
三、结论
在 C# 中调用 C++ 编写的动态链接库函数,如果需要出口参数输出,则需要使用指针,对于字符串,则需要使用双重指针,对于 C# 的导入定义,则需要使用引用(ref)定义。
对于函数返回值,C# 导入定义和 C++ 动态库函数声明定义需要保持一致,否则会出现函数调用失败。定义导入时,一定注意 CharSet 和 CallingConvention 参数,否则导致调用失败或结果异常。运行时,动态链接库放在 C# 程序的目录下即可,我这里是一个 C# 的动态链接库,两个动态链接库就在同一个目录下运行。
一、ARP攻击原理:调用系统里的npptoolsdll文件。
1、网络执法官、彩影arp防火墙等ARP攻防软件也用这个,如果把这个DLL文件删除了,之后随便弄个DLL改名为npptoolsdll即可。
2、如果C盘是NTFS分区格式就把权限都去掉,如果是FAT格式弄个只读就可以了。
3、防攻击文件:C:\WINDOWS\system32\ npptoolsdll
4、处理方法:新建一个空文本文档,改名为npptoolsdll然后把它复制到system32文件夹里,覆盖原有的npptoolsdll,如果没关闭文件保护,先关闭。再把system32\dllcache里的npptoolsdll也覆盖了,然后把它们的属性改为只读、隐藏,最后再把它们的everyone权限都去掉,即可!
5、npptoolsdll文件的属性改为只读、隐藏后,再把它们的everyone的权限去掉,病毒就不能替换也不能使用它了,arp就不会起作用,从而达到防范ARP的目的。
二、定位ARP攻击源头
1、主动定位方式:因为所有的ARP攻击源都会有其特征——网卡会处于混杂模式,可以通过ARPKiller这样的工具扫描网内有哪台机器的网卡是处于混杂模式的,从而判断这台机器有可能就是“元凶”。定位好机器后,再做病毒信息收集,提交给趋势科技做分析处理。
标注:网卡可以置于一种模式叫混杂模式(promiscuous),在这种模式下工作的网卡能够收到一切通过它的数据,而不管实际上数据的目的地址是不是它。这实际就是Sniffer工作的基本原理:让网卡接收一切它所能接收的数据。
2、被动定位方式:在局域网发生ARP攻击时,查看交换机的动态ARP表中的内容,确定攻击源的MAC地址;也可以在局域居于网中部署Sniffer工具,定位ARP攻击源的MAC。
也可以直接Ping网关IP,完成Ping后,用ARP –a查看网关IP对应的MAC地址,此MAC地址应该为欺骗的,使用NBTSCAN可以取到PC的真实IP地址、机器名和MAC地址,如果有”ARP攻 击”在做怪,可以找到装有ARP攻击的PC的IP、机器名和MAC地址。
命令:“nbtscan -r 192168160/24”(搜索整个192168160/24网段, 即192168161-19216816254);或“nbtscan 1921681625-137”搜索1921681625-137 网段,即1921681625-19216816137。输出结果第一列是IP地址,最后一列是MAC地址。 3、3、NBTSCAN的使用范例:
假设查找一台MAC地址为“000d870d585f”的病毒主机。
1)将压缩包中的nbtscanexe 和cygwin1dll解压缩放到c:下。
2)在Windows开始—运行—打开,输入cmd(windows98输入“command”),在出现的DOS窗口中输入:C: btscan -r 192168161/24(这里需要根据用户实际网段输入),回车。
3)通过查询IP–MAC对应表,查出“000d870d585f”的病毒主机的IP地址为“19216816223”。
通过上述方法,我们就能够快速的找到病毒源,确认其MAC——〉机器名和IP地址。
4、防御方法
a、使用可防御ARP攻击的三层交换机,绑定端口-MAC-IP,限制ARP流量,及时发现并自动阻断ARP攻击端口,合理划分VLAN,彻底阻止盗用IP、MAC地址,杜绝ARP的攻击。
b、对于经常爆发病毒的网络,进行Internet访问控制,限制用户对网络的访问。此类ARP攻击程序一般都是从Internet下载到用户终端,如果能够加强用户上网的访问控制,就能极大的减少该问题的发生。
当运行软件或游戏时,系统提示“没有找到packetdll”、“丢失packetdll”等类似错误信息可通过以下方法解决: 1、在搜索引擎中输入“packetdll下载”,找到packetdll文件下载并解压; 2、把“packetdll”文件复制到系统目录下
《Packetdll》百度网盘免费资源下载
链接: https://panbaiducom/s/1Wvg6xuUQfCktAYIAkae-Gg
提取码:wznc系统文件packetdll是存放在Windows系统文件夹中的重要文件,通常情况下是在安装 *** 作系统过程中自动创建的,对于系统正常运行来说至关重要。在正常情况下不建议用户对该类文件进行随意的修改,它的存在对维护计算机系统的稳定具有重要作用。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)