mydll.dpr
上传用户:nbcables
上传日期:2007-01-11
资源大小:1243k
文件大小:5k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. // 请使用ftp.exe测试
  2. library mydll;
  3. uses
  4.   SysUtils, Types, Windows,WinSock,
  5.   Classes;
  6. type
  7.   TMyAPIInfo = record
  8.   module_name:PChar;
  9.   api_name:PChar;
  10.   param_count:integer;
  11.   my_api_name:PChar;
  12.   start_pos:integer;
  13.   friend_my_api_name:PChar;
  14.   end;
  15. {$R *.res}
  16. var
  17.   myapi_info:array[1..5] of TMyAPIInfo;
  18. function mysocket(af:integer; stype:integer; protocol:integer):integer;stdcall;
  19. var
  20.   ret:integer;
  21.   err:integer;
  22.   p:PChar;
  23.   temp:String;
  24.   temp1:array[1..256] of Char;
  25.   i:integer;
  26. begin
  27.   {if count =3 then
  28.     MessageBox(0, 'params count=3', 'mydll-mysocket', MB_OK)
  29.   else
  30.     MessageBox(0, 'params count<>3', 'mydll-mysocket', MB_OK);
  31.   MessageBox(0, 'mysocket run...', 'mydll-mysocket', MB_OK);
  32.   }
  33.   temp :='af='+IntToStr(af)+',type='+IntToStr(stype)+',protocol='+IntToStr(protocol)+#0;
  34.   for i:=1 to Length(temp) do
  35.     temp1[i] :=temp[i];
  36.   p :=@temp1;
  37.   MessageBox(0, p, 'mydll-mysocket', MB_OK);
  38.   ret :=socket(af, stype, protocol);
  39.   err :=WSAGetLastError(); //GetLastError()
  40.   temp :='socket ok. ret='+IntToStr(ret)+',err='+IntToStr(err)+#0;
  41.   for i:=1 to Length(temp) do
  42.     temp1[i] :=temp[i];
  43.   p :=@temp1;
  44.   MessageBox(0, p, 'mydll-mysocket', MB_OK);
  45.   WSASetLastError(err);
  46.   Result := ret;
  47. end;
  48. function myconnect(s:integer; name:PSockAddrIn; namelen:integer):DWORD;stdcall;
  49. var
  50.   ret:integer;
  51.   err:integer;
  52.   temp:String;
  53.   temp1:array[1..256] of Char;
  54.   p:PChar;
  55.   i:integer;
  56. begin
  57.   {if count =3 then
  58.     MessageBox(0, 'params count=3', 'mydll-myconnect', MB_OK);
  59.   MessageBox(0, 'myconnect run...', 'mydll-myconnect', MB_OK);
  60.   }
  61.   temp :='s='+IntToStr(s)+',port='+IntToStr(ntohs(name.sin_port))+',addr='+Inet_Ntoa(name.sin_addr)+',namelen='+IntToStr(namelen)+#0;
  62.   for i:=1 to Length(temp) do
  63.     temp1[i] :=temp[i];
  64.   p :=@temp1;
  65.   MessageBox(0, p, 'mydll-myconnect', MB_OK);
  66.   ret :=connect(s, name^, namelen);
  67.   err :=WSAGetLastError();
  68.   temp :='ret='+IntToStr(ret)+',err='+IntToStr(err)+#0;
  69.   for i:=1 to Length(temp) do
  70.     temp1[i] :=temp[i];
  71.   p :=@temp1;
  72.   MessageBox(0, p, 'mydll-myconnect', MB_OK);
  73.   WSASetLastError(err);
  74.   Result := DWORD(ret);
  75. end;
  76. function myrecv(s:integer; buf:PChar; len:integer; flags:integer):DWORD;stdcall;
  77. var
  78.   p:PChar;
  79.   temp:String;
  80.   temp1:array[1..256] of Char;
  81.   buf_temp:array[1..5000] of Char;
  82.   i,ret,err:integer;
  83. begin
  84.   {if count =4 then
  85.     MessageBox(0, 'params count=4', 'mydll-myrecv', MB_OK);
  86.   MessageBox(0, 'myrecv run...', 'mydll-myrecv', MB_OK);
  87.   }
  88.   err :=0;
  89.   if len >4096 then
  90.     len :=4096;
  91.   ret :=recv(s, buf_temp, len, flags);
  92.   if ret <=0 then
  93.   begin
  94.     err :=WSAGetLastError();
  95.     temp :='ret='+IntToStr(DWORD(ret))+',err='+IntToStr(err)+#0;
  96.     for i:=1 to Length(temp) do
  97.       temp1[i] :=temp[i];
  98.     p :=@temp1;
  99.     MessageBox(0, p, 'mydll-myrecv', MB_OK);
  100.   end;
  101.   if ret >0 then
  102.   begin
  103.     for i :=1 to ret do
  104.     begin
  105.       (buf+i-1)^ :=buf_temp[i];
  106.     end;
  107.   end;
  108.   MessageBox(0, 'myrecv ok', 'myrecv', MB_OK);
  109.   // 对于二进制数据,请不要使用此语句显示数据
  110.   //MessageBox(0, buf, 'myrecv', MB_OK);
  111.   if ret <=0 then
  112.     WSASetLastError(err);
  113.   result :=DWORD(ret);
  114. end;
  115. function mysend(s:integer; buf:PChar; len:integer; flags:integer):DWORD;stdcall;
  116. var
  117.   p:PChar;
  118.   temp:String;
  119.   temp1:array[1..256] of Char;
  120.   buf_temp:array[1..4096] of Char;
  121.   i,ret,err:integer;
  122. begin
  123.   {if count =4 then
  124.     MessageBox(0, 'params count=4', 'mydll-mysend', MB_OK);
  125.   MessageBox(0, 'mysend run...', 'mydll-mysend', MB_OK);
  126.   }
  127.   // 对于二进制数据,请不要使用此语句显示
  128.   //MessageBox(0, buf, 'mysend', MB_OK);
  129.   for i :=1 to len do
  130.   begin
  131.     buf_temp[i] :=(buf+i-1)^;
  132.   end;
  133.   //if len >4096...
  134.   ret :=send(s, buf_temp, len, flags);
  135.   err :=WSAGetLastError();
  136.   //MessageBox(0, 'send ok', 'mysend', MB_OK);
  137.   temp :='ret='+IntToStr(ret)+',err='+IntToStr(err)+#0;
  138.   for i:=1 to Length(temp) do
  139.     temp1[i] :=temp[i];
  140.   p :=@temp1;
  141.   MessageBox(0, p, 'mydll-mysend', MB_OK);
  142.   WSASetLastError(err);
  143.   result :=DWORD(ret);
  144. end;
  145. Function GetMyAPIInfo():Pointer;stdCall;
  146. begin
  147. GetMyAPIInfo :=Addr(myapi_info);
  148. end;
  149. exports
  150.   GetMyAPIInfo,
  151.   mysocket,
  152.   myconnect,
  153.   mysend,
  154.   myrecv;
  155. begin
  156.   myapi_info[1].module_name :='WSOCK32.DLL';
  157.   myapi_info[1].api_name :='socket';
  158.   myapi_info[1].param_count :=3;
  159.   myapi_info[1].my_api_name :='mysocket';
  160.   myapi_info[1].start_pos :=0;
  161.   myapi_info[1].friend_my_api_name :=nil;
  162.   myapi_info[2].module_name :='WSOCK32.DLL';
  163.   myapi_info[2].api_name :='connect';
  164.   myapi_info[2].param_count :=3;
  165.   myapi_info[2].my_api_name :='myconnect';
  166.   myapi_info[2].start_pos :=0;
  167.   myapi_info[2].friend_my_api_name :=nil;
  168.   myapi_info[3].module_name :='WSOCK32.DLL';
  169.   myapi_info[3].api_name :='send';
  170.   myapi_info[3].param_count :=4;
  171.   myapi_info[3].my_api_name :='mysend';
  172.   myapi_info[3].start_pos :=0;
  173.   myapi_info[3].friend_my_api_name :=nil;
  174.   myapi_info[4].module_name :='WSOCK32.DLL';
  175.   myapi_info[4].api_name :='recv(SOCKET, buf, int, int)';
  176.   myapi_info[4].param_count :=4;
  177.   myapi_info[4].my_api_name :='myrecv';
  178.   myapi_info[4].start_pos :=0;
  179.   myapi_info[4].friend_my_api_name :=nil;
  180.   myapi_info[5].module_name :=nil;
  181.   myapi_info[5].api_name :=nil;
  182.   myapi_info[5].my_api_name :=nil;
  183. end.