不执行ipconfig /displaydns这个命令,而是想找是否有这个命令所对应的api代码
解决方案 »
- GetClassFile问题 得到的CLSID总是空的
- 我的对话框属性里面怎么没有child?
- SetTimer(1,500,NULL)为什么会每隔1000ms刷新一下
- VC动态链接程序转静态链接编译出错!
- 关于序列化和RuntimeClass宏的并用
- 如何把模态或非模态对话框限制在单文档的客户区之中
- 如何用 VC 写 VXD??????????????????
- 傅立叶变换后的实部和虚部值都很大,这是怎么回事,请帮忙解决?
- 请问在windows上怎么用mapi读出outlook及exchange server里的联系人
- sqldmo 如何还原差异数据库备份呀,以下代码可以还原整个数据库
- 请教一个socket中的buffer问题?
- VC修改控件背景色的问题。
这个命令是用来查看客户端解析程序缓存,GetAdaptersInfo并没有这个功能
#include <iphlpapi.h>
#include <stdio.h>
#include <time.h>void main(void) { DWORD Err; PFIXED_INFO pFixedInfo;
DWORD FixedInfoSize = 0; PIP_ADAPTER_INFO pAdapterInfo, pAdapt;
DWORD AdapterInfoSize;
PIP_ADDR_STRING pAddrStr; if ((Err = GetNetworkParams(NULL, &FixedInfoSize)) != 0)
{
if (Err != ERROR_BUFFER_OVERFLOW)
{
printf("GetNetworkParams sizing failed with error %d\n", Err);
return;
}
} if ((pFixedInfo = (PFIXED_INFO) GlobalAlloc(GPTR, FixedInfoSize)) == NULL)
{
printf("Memory allocation error\n");
return;
} if ((Err = GetNetworkParams(pFixedInfo, &FixedInfoSize)) == 0)
{
printf("\tHost Name . . . . . . . . . : %s\n", pFixedInfo->HostName);
printf("\tDNS Servers . . . . . . . . : %s\n", pFixedInfo->DnsServerList.IpAddress.String);
pAddrStr = pFixedInfo->DnsServerList.Next;
while(pAddrStr)
{
printf("%52s\n", pAddrStr->IpAddress.String);
pAddrStr = pAddrStr->Next;
} printf("\tNode Type . . . . . . . . . : ");
switch (pFixedInfo->NodeType)
{
case 1:
printf("%s\n", "Broadcast");
break;
case 2:
printf("%s\n", "Peer to peer");
break;
case 4:
printf("%s\n", "Mixed");
break;
case 8:
printf("%s\n", "Hybrid");
break;
default:
printf("\n");
} printf("\tNetBIOS Scope ID. . . . . . : %s\n", pFixedInfo->ScopeId);
printf("\tIP Routing Enabled. . . . . : %s\n", (pFixedInfo->EnableRouting ? "yes" : "no"));
printf("\tWINS Proxy Enabled. . . . . : %s\n", (pFixedInfo->EnableProxy ? "yes" : "no"));
printf("\tNetBIOS Resolution Uses DNS : %s\n", (pFixedInfo->EnableDns ? "yes" : "no"));
} else
{
printf("GetNetworkParams failed with error %d\n", Err);
return;
} AdapterInfoSize = 0;
if ((Err = GetAdaptersInfo(NULL, &AdapterInfoSize)) != 0)
{
if (Err != ERROR_BUFFER_OVERFLOW)
{
printf("GetAdaptersInfo sizing failed with error %d\n", Err);
return;
}
} if ((pAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, AdapterInfoSize)) == NULL)
{
printf("Memory allocation error\n");
return;
} if ((Err = GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize)) != 0)
{
printf("GetAdaptersInfo failed with error %d\n", Err);
return;
} pAdapt = pAdapterInfo; while (pAdapt)
{
switch (pAdapt->Type)
{
case MIB_IF_TYPE_ETHERNET:
printf("\nEthernet adapter ");
break;
case MIB_IF_TYPE_TOKENRING:
printf("\nToken Ring adapter ");
break;
case MIB_IF_TYPE_FDDI:
printf("\nFDDI adapter ");
break;
case MIB_IF_TYPE_PPP:
printf("\nPPP adapter ");
break;
case MIB_IF_TYPE_LOOPBACK:
printf("\nLoopback adapter ");
break;
case MIB_IF_TYPE_SLIP:
printf("\nSlip adapter ");
break;
case MIB_IF_TYPE_OTHER:
default:
printf("\nOther adapter ");
}
printf("%s:\n\n", pAdapt->AdapterName); printf("\tDescription . . . . . . . . : %s\n", pAdapt->Description); printf("\tPhysical Address. . . . . . : ");
for (UINT i=0; i<pAdapt->AddressLength; i++)
{
if (i == (pAdapt->AddressLength - 1))
printf("%.2X\n",(int)pAdapt->Address[i]);
else
printf("%.2X-",(int)pAdapt->Address[i]);
} printf("\tDHCP Enabled. . . . . . . . : %s\n", (pAdapt->DhcpEnabled ? "yes" : "no")); pAddrStr = &(pAdapt->IpAddressList);
while(pAddrStr)
{
printf("\tIP Address. . . . . . . . . : %s\n", pAddrStr->IpAddress.String);
printf("\tSubnet Mask . . . . . . . . : %s\n", pAddrStr->IpMask.String);
pAddrStr = pAddrStr->Next;
} printf("\tDefault Gateway . . . . . . : %s\n", pAdapt->GatewayList.IpAddress.String);
pAddrStr = pAdapt->GatewayList.Next;
while(pAddrStr)
{
printf("%52s\n", pAddrStr->IpAddress.String);
pAddrStr = pAddrStr->Next;
} printf("\tDHCP Server . . . . . . . . : %s\n", pAdapt->DhcpServer.IpAddress.String);
printf("\tPrimary WINS Server . . . . : %s\n", pAdapt->PrimaryWinsServer.IpAddress.String);
printf("\tSecondary WINS Server . . . : %s\n", pAdapt->SecondaryWinsServer.IpAddress.String); struct tm *newtime; // Display coordinated universal time - GMT
newtime = gmtime(&pAdapt->LeaseObtained);
printf( "\tLease Obtained. . . . . . . : %s", asctime( newtime ) ); newtime = gmtime(&pAdapt->LeaseExpires);
printf( "\tLease Expires . . . . . . . : %s", asctime( newtime ) ); pAdapt = pAdapt->Next;
}
}
DNS_STATUS WINAPI DnsQuery(
__in PCSTR lpstrName,
__in WORD wType,
__in DWORD fOptions,
__in_out_opt PVOID pExtra,
__in_out PDNS_RECORD* ppQueryResultsSet,
__in_out PVOID* pReserved
);PDNS_RECORD结构体中的内容很丰富,而且它是个链表,成员函数中有指向PDNS_RECORD结构体类型的指针
typedef struct _DnsCacheEntry
{
struct _DnsCacheEntry* pNext; // Pointer to next entry
PWSTR pszName; // DNS Record Name
unsigned short wType; // DNS Record Type
unsigned short wDataLength; // Not referenced
unsigned long dwFlags; // DNS Record Flags
}DNS_CACHE_ENTRY;
可能的调用方式应该是这样
DNS_CACHE_ENTRY fooEntry;
DnsGetCacheDataTable(&pEntry));
以上都为推算,正确性80%。
顶下trojan
{
struct _DnsCacheEntry* pNext; // Pointer to next entry
PWSTR pszName; // DNS Record Name
unsigned short wType; // DNS Record Type
unsigned short wDataLength; // Not referenced
unsigned long dwFlags; // DNS Record Flags
}DNS_CACHE_ENTRY;int main()
{
HMODULE hM = ::LoadLibrary(TEXT("dnsapi.dll"));
typedef int (WINAPI *_DnsGetCacheDataTable)(DNS_CACHE_ENTRY * par); _DnsGetCacheDataTable dnsGetCacheDataTable = (_DnsGetCacheDataTable)::GetProcAddress(hM, "DnsGetCacheDataTable");
DNS_CACHE_ENTRY fooEntry = {};
int nRes = dnsGetCacheDataTable(&fooEntry);
DNS_CACHE_ENTRY* _fooEntry = &fooEntry; while (_fooEntry)
{
PDNS_RECORD dnsr;
DNS_STATUS status = DnsQuery(_fooEntry->pszName, _fooEntry->wType, DNS_QUERY_BYPASS_CACHE, NULL, &dnsr, NULL);
if (status == 0)
{
printf("%S:%s,%d\n", _fooEntry->pszName, inet_ntoa(*(in_addr*)&(dnsr->Data.A.IpAddress)), _fooEntry->wType);
}
DnsRecordListFree(dnsr, DnsFreeRecordListDeep);
_fooEntry = _fooEntry->pNext;
} //DNS_STATUS WINAPI DnsQuery(TEXT); ::FreeLibrary(hM);
system("pause");
return 0;
}[/code]