邪恶八进制信息安全团队技术讨论组's Archiver

金州 2005-12-16 00:28

[转载]一个获取网络适配器信息的例子

文章作者:罗云彬<BR><BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; Sample code for < Win32ASM Programming ><BR>; by 罗云彬, [url]http://asm.yeah.net[/url]<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; NetInfo.asm<BR>; 获取本地计算机的网络配置信息<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; 使用 nmake 或下列命令进行编译和链接:<BR>; ml /c /coff NetInfo.asm<BR>; rc NetInfo.rc<BR>; Link /subsystem:windows NetInfo.obj NetInfo.res<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>   .386<BR>   .model flat, stdcall<BR>   option casemap :none<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; Include 文件定义<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>include    windows.inc<BR>include    user32.inc<BR>includelib  user32.lib<BR>include    kernel32.inc<BR>includelib  kernel32.lib<BR>include    IpTypes.inc<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; Equ 等值定义<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>ICO_MAIN  equ  1000<BR>DLG_MAIN  equ  1000<BR>IDC_ADPT  equ  1001<BR>IDC_TYPE  equ  1002<BR>IDC_MAC    equ  1003<BR>IDC_IP    equ  1004<BR>IDC_GATEWAY  equ  1005<BR>IDC_WINS  equ  1006<BR>IDC_DHCP  equ  1007<BR>IDC_REFRESH  equ  1008<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; 数据段<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>   .data?<BR>hInstance  dd  ?<BR>hWinMain  dd  ?<BR>hDll    dd  ?<BR>lpGetInfo  dd  ?<BR>dwStructSize  dd  ?<BR>lpInfo    dd  ?<BR>lpMemory  dd  ?<BR>szBuffer  db  1024 dup (?)<BR>szBuffer1  db  1024 dup (?)<BR>   .const<BR>szDll    db  'Iphlpapi.dll',0<BR>szGetInfo  db  'GetAdaptersInfo',0<BR>szErrNoAdapter  db  '没有安装网络适配器!',0<BR>szNA    db  'N/A',0<BR>szMac    db  '%02X:%02X:%02X:%02X:%02X:%02X',0<BR>szSpar    db  '/',0<BR>szCrLf    db  0dh,0ah,0<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; 代码段<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>   .code<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; 将IP地址字符串整理到缓冲区中<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>_GetIPString  proc  _lpIP,_lpOut,_dwSize,_dwIfMask<BR><BR>   pushad<BR>   invoke  RtlZeroMemory,_lpOut,_dwSize<BR>   mov  esi,_lpIP<BR>   assume  esi:ptr IP_ADDR_STRING<BR>   @@:<BR>   .if  byte ptr [esi].IpAddress<BR>     invoke  lstrcat,_lpOut,addr [esi].IpAddress<BR>     .if  (byte ptr [esi].IpMask) && _dwIfMask<BR>       invoke  lstrcat,_lpOut,addr szSpar<BR>       invoke  lstrcat,_lpOut,addr [esi].IpMask<BR>     .endif<BR>   .endif<BR>   mov  esi,[esi].Next<BR>   .if  esi<BR>     invoke  lstrcat,_lpOut,addr szCrLf<BR>     jmp  @B<BR>   .endif<BR>   assume  esi:nothing<BR>   popad<BR>   ret<BR><BR>_GetIPString  endp<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>_ShowInfo  proc<BR><BR>   pushad<BR>   mov  esi,lpInfo<BR>;********************************************************************<BR>; 根据有没有下一个适配器激活或灰化“下一个”按钮<BR>;********************************************************************<BR>   assume  esi:ptr IP_ADAPTER_INFO<BR>   .if  [esi].Next<BR>     invoke  GetDlgItem,hWinMain,IDOK<BR>     invoke  EnableWindow,eax,TRUE<BR>   .else<BR>     invoke  GetDlgItem,hWinMain,IDOK<BR>     invoke  EnableWindow,eax,FALSE<BR>   .endif<BR>   invoke  SetDlgItemText,hWinMain,IDC_ADPT,addr [esi].Description<BR>   invoke  SetDlgItemInt,hWinMain,IDC_TYPE,[esi]._Type,FALSE<BR>;********************************************************************<BR>; 转换 MAC 地址<BR>;********************************************************************<BR>   lea  edi,[esi].Address<BR>   mov  ebx,6<BR>   .while  ebx<BR>     movzx  eax,byte ptr [edi+ebx-1]<BR>     push  eax<BR>     dec  ebx<BR>   .endw<BR>   invoke  wsprintf,addr szBuffer,addr szMac<BR>   add  esp,6 * 4<BR>   invoke  SetDlgItemText,hWinMain,IDC_MAC,addr szBuffer<BR>;********************************************************************<BR>; 转换 IP 地址、网关、DHCP 等信息<BR>;********************************************************************<BR>   invoke  _GetIPString,addr [esi].IpAddressList,addr szBuffer,sizeof szBuffer,TRUE<BR>   invoke  SetDlgItemText,hWinMain,IDC_IP,addr szBuffer<BR>   invoke  _GetIPString,addr [esi].GatewayList,addr szBuffer,sizeof szBuffer,FALSE<BR>   .if  szBuffer<BR>     invoke  SetDlgItemText,hWinMain,IDC_GATEWAY,addr szBuffer<BR>   .endif<BR>   .if  [esi].DhcpEnabled<BR>     invoke  _GetIPString,addr [esi].DhcpServer,addr szBuffer,sizeof szBuffer,FALSE<BR>     invoke  SetDlgItemText,hWinMain,IDC_DHCP,addr szBuffer<BR>   .endif<BR>   .if  [esi].HaveWins<BR>     invoke  _GetIPString,addr [esi].PrimaryWinsServer,addr szBuffer,sizeof szBuffer,FALSE<BR>     invoke  _GetIPString,addr [esi].SecondaryWinsServer,addr szBuffer1,sizeof szBuffer,FALSE<BR>     .if  szBuffer1<BR>       invoke  lstrcat,addr szBuffer,addr szCrLf<BR>       invoke  lstrcat,addr szBuffer,addr szBuffer1<BR>     .endif<BR>     invoke  SetDlgItemText,hWinMain,IDC_WINS,addr szBuffer<BR>   .endif<BR>   assume  esi:nothing<BR>   popad<BR>   ret<BR><BR>_ShowInfo  endp<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>_GetInfo  proc<BR><BR>;********************************************************************<BR>; 分配一块 IP_ADAPTER_INFO 结构大小的内存<BR>;********************************************************************<BR>   .if  lpMemory<BR>     invoke  GlobalFree,lpMemory<BR>     mov  lpMemory,0<BR>   .endif<BR>   mov  ebx,IDC_ADPT<BR>   .while  ebx <=  IDC_DHCP<BR>     invoke  SetDlgItemText,hWinMain,ebx,addr szNA<BR>     inc  ebx<BR>   .endw<BR>   invoke  GetDlgItem,hWinMain,IDOK<BR>   invoke  EnableWindow,eax,FALSE<BR>   invoke  GlobalAlloc,GPTR,sizeof IP_ADAPTER_INFO<BR>   .if  eax<BR>     mov  lpMemory,eax<BR>     mov  dwStructSize,sizeof IP_ADAPTER_INFO<BR>     @@:<BR>     push  offset dwStructSize<BR>     push  lpMemory<BR>     call  lpGetInfo<BR>;********************************************************************<BR>; 如果缓冲区不够大,则重新修改内存块的大小<BR>;********************************************************************<BR>     .if  eax ==  ERROR_BUFFER_OVERFLOW<BR>       invoke  GlobalReAlloc,lpMemory,dwStructSize,GMEM_MOVEABLE<BR>       .if  ! eax<BR>         jmp  @F<BR>       .endif<BR>       mov  lpMemory,eax<BR>       jmp  @B<BR>     .elseif  eax ==  ERROR_SUCCESS<BR>       push  lpMemory<BR>       pop  lpInfo<BR>       invoke  _ShowInfo<BR>     .elseif  eax ==  ERROR_NO_DATA<BR>       invoke  MessageBox,NULL,addr szErrNoAdapter,NULL,MB_OK or MB_ICONWARNING<BR>     .endif<BR>   .endif<BR>   @@:<BR>   ret<BR><BR>_GetInfo  endp<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>_ProcDlgMain  proc  uses ebx edi esi hWnd,wMsg,wParam,lParam<BR><BR>   mov  eax,wMsg<BR>;********************************************************************<BR>   .if  eax ==  WM_COMMAND<BR>     mov  eax,wParam<BR>     .if  ax ==  IDOK<BR>       mov  eax,lpInfo<BR>       mov  eax,[eax]<BR>       mov  lpInfo,eax<BR>       invoke  _ShowInfo<BR>     .elseif  ax ==  IDC_REFRESH<BR>       invoke  _GetInfo<BR>     .endif<BR>;********************************************************************<BR>   .elseif  eax ==  WM_CLOSE<BR>     invoke  EndDialog,hWnd,NULL<BR>;********************************************************************<BR>   .elseif  eax ==  WM_INITDIALOG<BR>     push  hWnd<BR>     pop  hWinMain<BR>     invoke  LoadIcon,hInstance,ICO_MAIN<BR>     invoke  SendMessage,hWnd,WM_SETICON,ICON_BIG,eax<BR>     invoke  _GetInfo<BR>;********************************************************************<BR>   .else<BR>     mov  eax,FALSE<BR>     ret<BR>   .endif<BR>   mov  eax,TRUE<BR>   ret<BR><BR>_ProcDlgMain  endp<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>start:<BR>   invoke  LoadLibrary,addr szDll<BR>   .if  eax<BR>     mov  hDll,eax<BR>     invoke  GetProcAddress,eax,offset szGetInfo<BR>     .if  eax<BR>       mov  lpGetInfo,eax<BR>     .endif<BR>   .endif<BR>   invoke  GetModuleHandle,NULL<BR>   mov  hInstance,eax<BR>   invoke  DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL<BR>   invoke  ExitProcess,NULL<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>   end  start

页: [1]
© 1999-2008 EvilOctal Security Team