追捕檔案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
- 最全MyBatis中XML對映檔案(Mapper)標籤分析及示例MyBatisXMLAPP
- MATLAB生成.coe檔案和.mif檔案程式碼示例Matlab
- sitemap 檔案填充示例程式碼
- [linux] fuser程式顯示檔案Linux
- 限制檔案大小及顯示檔案大小(正規表示式
- 轉:vscode 檔案標籤欄多行顯示VSCode
- 轉:使用 Tkprof 分析 ORACLE 跟蹤檔案Oracle
- 資料分析之杜邦分析法的公式及示例公式
- Python中檔案讀取與儲存程式碼示例Python
- 用 spring boot, 並將pem 檔案轉換成 jks 檔案,然後連線 AWS 的 DocumentDB 的詳細示例Spring Boot
- SQL server資料庫建立程式碼 filegroup檔案組修改的示例程式碼SQLServer資料庫
- 淺談hosts檔案
- class檔案的基本結構及proxy原始碼分析二原始碼
- 【淺出 PHP】PHP 檔案操作 寫檔案PHP
- GBFF檔案轉GFF檔案
- java中的JAR檔案淺析JavaJAR
- 在檔案上使用 SQL 查詢的示例SQL
- mac顯示隱藏檔案,取消顯示隱藏檔案Mac
- 淺談 Android Dex 檔案Android
- 管理(002):建立密碼檔案示例密碼
- 淺談JavaScript程式碼預解析 + 示例詳解JavaScript
- 多元統計之因子分析模型及Python分析示例模型Python
- 最簡單的SpringBoot示例之.yml配置檔案Spring Boot
- 安卓應用安全指南4.6.1處理檔案示例程式碼安卓
- Opencv及常用方法示例程式碼OpenCV
- PDF檔案轉換為DWF檔案
- APK 檔案分析APK
- hex檔案分析
- Flutter與Native通訊示例及原始碼分析Flutter原始碼
- 常見的PID的演算法及程式碼示例演算法
- 2.6.1.1 初始化引數檔案示例
- 《Python科學計算最佳實踐:SciPy指南》pdf+隨書檔案(含示例程式碼及彩圖)Python
- Android 檔案儲存淺析Android
- 淺析檔案上傳漏洞
- 淺嘗Node檔案系統
- 【轉】大檔案上傳原理及C#實現方案C#
- 標頭檔案的作用分析
- 基於檔案的表合併及行轉列實現參考