追捕檔案WRY.DLL的淺顯分析及程式示例 (轉)
大家都知道wry.dll這個吧,它就是一張全球的分配表,裡邊有IP地址對應的地理位置,利用這張表,可以輕鬆的根據你知道的IP查到它的地址位置.它雖然定義成了一個DLL檔案,但是實際上它是一個,這篇文章就是告訴大家它的結構,並且寫一個查詢的例子.如果你已經知道了,或者不屑知道這麼簡單的玩藝,呵呵,請離開.^_^
程式的主要思路很簡單,根據IP或者HOST來逐條比較每條WRY.DLL中的資料,若符合條件,則顯示資訊.此程式必須有WRY.DLL檔案.
wry.dll由若千條記錄組成,既然是記錄,那麼它就有其結構,實際上每一條記錄包含5個欄位,分別是STARTIP(17),ENDIP(17),COUNTRY(16),LOCAL(54),THANK(23),括號裡邊的是該欄位的長度,以位元組為單位.各個欄位的含義如下:
STARTIP: 一個IP地址段的起始地址
ENDIP: 一個IP地址段的終止地址
COUNTRY: 該地址段所在的國家
LOCAL: 該地址段所在的國家的具體位置
THANK: 此項資訊的提供者
好了,既然知道了記錄的結構,那麼我們就可以定義它的資料結構如下:
struct _wry{
char startip[17];
char endip[17];
char country[16];
char local[54];
char thank[23];
};
接下來,知道了這個最重要的資訊,我們就可以編寫程式來根據IP或者是host來顯示資訊了.
但是,字串的IP地址長度最長為15(xxx.xxx.xxx.xxx),而為什麼記錄中的startip和endip的長度都定義成17了呢?如果呢編寫簡單的程式來測試一些就知道,這兩個欄位的第一個字元都為空格,最後一個字元為NULL,真正的地址是從第二個字元開始的,即&(startip[1]),認識到這一點也非常重要.
此外,每條記錄中的IP字串長度都為15,即是11.123.11.2形式的IP串在裡邊的形式為011.123.011.002,那麼如果不將要查詢的IP串進行轉化,比較起來就比較麻煩,因此需要由一個將IP串轉化成15長度的標準格式.
還有,WRY.DLL檔案中不是所有的記錄都是如上的結構,特殊的就是第一個記錄,經過測試,得知它的長度是320-128=192,而其它的所有記錄的長度均為128.
最後一個問題就是如果單純的這樣查詢比較:if(start< 查詢的i 好了,所有的需要注意的地方都提到了,下邊就開始寫程式吧. #include #pragma comment(lib,"ws2_32.lib") struct _wry{ struct _wry *wry; char str[320]; char* convertip(const char* ip) strcpy(temp,"000.000.000.000"); j = strlen(temp2); for(i = 0; i < 4; i++) return temp; int do_dis(const char *ip) if(strncmp(&(wry->startip [1]),"000.000.000.000",15) == 0) if(strncmp(&(wry->startip [1]),ip,strlen(ip)) <= 0) } void main(int argc,char **argv) if(argc != 2) if(Wtartup(MAKE(2,2),&wsd) != 0) if((fp = fopen("wry.dll","r")) == NULL) while(!feof(fp)) if( i == 0) continue; wry = (struct _wry*)str; fclose(fp); if(count == 0) } . 感謝你看到了最後!^_^. 2002.7.28
寫好的程式碼如下:
**********************************************************************************************
wry.dll,the startip and endip format is :[ 000.000.000.000 ]
= 17,and the first is BLANK and the last is NULL
#include
#include
#include
#include
char startip[17];
char endip[17];
char country[16];
char local[54];
char thank[23];
};
char temp[16];
struct _wry maxw[10];
int count = 0;
{
char *temp2;
int i,j;
temp2 = (char*)malloc(strlen(ip));
strcpy(temp2,ip);
for( i =0 ; i < j; i++)
if(temp2[i] == '.')
temp2[i] = '';
{
strncpy(&temp[i*4+3-strlen(temp2)],temp2,strlen(temp2));
temp2 += strlen(temp2) +1;
}
}
{
if(strncmp(&(wry->endip [1]),ip,strlen(ip)) <= 0)
return 0;
return 0;
memcpy(&maxw[count++],wry,sizeof(struct _wry));
return 1;
{
WSADATA wsd;
struct hostent *h = NULL;
FILE * fp = NULL;
int i = 0;
char cip[16];
{
printf("usage %s [ip | host]n",argv[0]);
return;
}
return;
if(_addr(argv[1]) == INADDR_NONE)
{
if((h = gethostbyname(argv[1])) != NULL)
strcpy(cip,inet_ntoa(*(struct in_addr*)h->h_addr));
else
{
printf("resolve host to ip failedn");
return;
}
}
else
strcpy(cip,argv[1]);
convertip(cip);
printf("n****************************************************n");
printf("convert ip: %sn",temp);
{
printf("can not open file!");
exit(0);
}
{
{
if(fread(str,sizeof(str) - 128,1,fp) != 1)
{
printf("read file errorn");
exit(0);
}
else
i = 1;
}
else
if(fread(str,128,1,fp) != 1)
{
end of file
}
wry->thank [23] = '';
wry->local [53] = '';
wry->country [15] = '';
wry->endip [16] = '';
wry->startip [16] = '';
do_dis(temp);
}
WSACleanup();
printf("not match found!n");
else
{
printf("found %d match,and the best match as follows:n",count);
printf("==========================n");
printf("startip:%sn",maxw[--count].startip );
printf("endip:%sn",maxw[count].endip );
printf("country:%sn",maxw[count].country );
printf("local:%sn",maxw[count].local );
printf("****************************************************nn");
}
***********************************************************************************************
此程式在 2000 和VC6.0下編譯透過,編譯好的程式和程式碼,以及WRY.DLL檔案可以在地址
any problem please to: .
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992093/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- YAML檔案語法及示例YAML
- Unix/ELF檔案格式及病毒分析(轉)
- Unix/ELF檔案格式及病毒分析 (轉)
- 最全MyBatis中XML對映檔案(Mapper)標籤分析及示例MyBatisXMLAPP
- 追捕oicq探測技術 (轉)
- sitemap 檔案填充示例程式碼
- 淺談 PHP 中的多種加密技術及程式碼示例PHP加密
- 利用Java編寫HTML檔案分析程式(轉)JavaHTML
- Linux日誌檔案系統及效能分析(轉)Linux
- 登錄檔檔案修改開啟程式的簡單示例
- MATLAB生成.coe檔案和.mif檔案程式碼示例Matlab
- 淺談Linux的檔案系統(轉)Linux
- C++ 中檔案流(fstream)的使用方法及示例C++
- 限制檔案大小及顯示檔案大小(正規表示式
- Linux系統檔案型別及檔案的副檔名(轉)Linux型別
- 檔案包含漏洞示例
- [linux] fuser程式顯示檔案Linux
- 追捕的OICQ探測技術 ---馮志宏 [撰稿] (轉)
- 將WAV檔案做到EXE檔案的方法及注意事項 (轉)
- DLL檔案在Delphi的建立及呼叫 (轉)
- 資料分析之杜邦分析法的公式及示例公式
- arraylist陣列元素插入及顯示示例陣列
- php檔案重新命名下載程式碼示例PHP
- 檔案上傳的幾個 - 示例
- TListView元件顯示資料夾中的檔案 (轉)View元件
- 認識 Linux 檔案屬性及檔案配置(轉)Linux
- 細說GNU/Linux系統的檔案及檔案系統(轉)Linux
- Nginx配置檔案示例解析Nginx
- iText操作PDF檔案的方法及程式碼
- perl檔案上傳程式,支援多檔案! (轉)
- Java 7:最新特性更新、程式碼示例及效能測試(轉)Java
- 淺談hosts檔案
- 第七篇:兩個經典的檔案IO程式示例
- 虛擬按鍵的總結及示例: (轉)
- linux 搜尋檔案及所有子目錄下的檔案裡的內容 (轉)Linux
- 建設專案管理的重點及分析方法(轉)專案管理
- 轉:使用 Tkprof 分析 ORACLE 跟蹤檔案Oracle
- iOS常見檔案及程式的啟動原理iOS