追捕檔案WRY.DLL的淺顯分析及程式示例 (轉)

worldblog發表於2007-12-12
追捕檔案WRY.DLL的淺顯分析及程式示例 (轉)[@more@]

大家都知道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

好了,所有的需要注意的地方都提到了,下邊就開始寫程式吧.
寫好的程式碼如下:
**********************************************************************************************
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
#include

#pragma comment(lib,"ws2_32.lib")

struct _wry{
 char startip[17];
 char endip[17];
 char country[16];
 char local[54];
 char thank[23];
 };

struct _wry *wry;

char str[320];
char temp[16];
struct _wry maxw[10];
int count = 0;

char* convertip(const char* ip)
{
 char *temp2;
 int i,j;

 strcpy(temp,"000.000.000.000");
 temp2 = (char*)malloc(strlen(ip));
 strcpy(temp2,ip);

 j = strlen(temp2);
 for( i =0 ; i < j; i++)
 if(temp2[i] == '.')
 temp2[i] = '';

 for(i = 0; i < 4; i++)
 {
 strncpy(&temp[i*4+3-strlen(temp2)],temp2,strlen(temp2));
 temp2 += strlen(temp2) +1;
 }

 return temp;
}

int do_dis(const char *ip)
{
 
 if(strncmp(&(wry->endip [1]),ip,strlen(ip)) <= 0)
 return 0;

 if(strncmp(&(wry->startip [1]),"000.000.000.000",15) == 0)
 return 0;

 if(strncmp(&(wry->startip [1]),ip,strlen(ip)) <= 0)
 memcpy(&maxw[count++],wry,sizeof(struct _wry));
 
 return 1;

}

void main(int argc,char **argv)
{
 WSADATA wsd;
 struct hostent *h = NULL;
 FILE * fp = NULL;
 int i = 0;
 char cip[16];

 if(argc != 2)
 {
 printf("usage %s [ip | host]n",argv[0]);
 return;
 }

 if(Wtartup(MAKE(2,2),&wsd) != 0)
 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);

 if((fp = fopen("wry.dll","r")) == NULL)
 {
 printf("can not open file!");
 exit(0);
 }

 while(!feof(fp))
 {

 if( i == 0)
 {
 if(fread(str,sizeof(str) - 128,1,fp) != 1)
 {
 printf("read file errorn");
 exit(0);
 }
 else
 i = 1;

 continue;
 }
 else
 if(fread(str,128,1,fp) != 1)
 {
  end of file
 }

 wry = (struct _wry*)str;
 
 wry->thank [23] = '';
 wry->local [53] = '';
 wry->country [15] = '';
 wry->endip [16] = '';
 wry->startip [16] = '';
 
 do_dis(temp);
 
 }

 fclose(fp);
 WSACleanup();

 if(count == 0)
 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: .
 

  2002.7.28

 

 

 

 


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992093/,如需轉載,請註明出處,否則將追究法律責任。

相關文章