简介:

    ESET NOD32  是世界排名第三的杀毒软件,其以轻快巧著称,下载地址 :http://www.skycn.com/soft/37962.html     
      
      这个小工具的作用是自动从网上ESET ID发布页获取最新ID,然后用ID到官方进行验证,验证可用就写入本地注册表来修改ESET的ID信息。

    本程序涉及了wininet 函数库,AOGO的正则表达式的使用,托盘气泡提示,配置文件的读取等等,希望对大家有所帮助!

 另外程序可能存在各种BUG,欢迎测试告知,谢谢!


代码:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;  Programmed by nohacks, nohacks@163.com
;  Website: http://hi.baidu.com/nohacks
;           Win32 ASM is Masm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;  版本信息
;     Eset_Nohacks_AUTOID V1.0 - ESET ID自动获取填写工具(适用2.x和3.x版本)  
;     
;      nohacks                   2009年 6 月 26 日
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.586
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive


include ESET_AUTOID.inc

include Express.inc

includelib Express.lib

;#########################################################################

 .Const
 
  RegEset30 db  "SOFTWARE\Eset\ESET Security\CurrentVersion\Plugins\01000400\Profiles\@My profile\",0
  RegEset27 db "SOFTWARE\Eset\Nod\CurrentVersion\Modules\Update\Settings\Config000\Settings\",0
  Express db  'username?*[%]{[a-z]+-[0-9]+}?*<\>>password?*[%]{[a-z,0-9]+}',0        
.data
  PassBytes  db 97, 214, 212, 233, 221, 240, 251, 242, 91, 100, 53, 173, 183, 200, 25, 117, 236, 49, 43, 188 
  UserPass   db '%s--%s',0
  template db '%1d',0
  ininame db  ".\ESET_AUTOID.ini",0
  Section db "SETUP",0
  keyname db "ECHO",0
  myecho  db "NO",0
  
.data?

  hInstance   dd ?
  Winhwnd        dd ? 
  hwnd    dd  ?
  @echo       dd ?
  @hKey       dd ?
  lpRet        POINT 10 dup(<?>)             
  iCount       dd ?
  iecho        db 10 dup(0)     
note mNOTIFYICONDATA <>  
 
;#########################################################################
.code

start:
   invoke GetModuleHandle,NULL
   mov hInstance,eax
   invoke InitCommonControls   
   invoke  GetPrivateProfileString,addr Section,addr keyname,addr myecho,addr iecho ,size iecho ,addr ininame
   invoke lstrlen, addr iecho                
   invoke CharUpperBuff,addr iecho ,eax          
   invoke lstrcmp,addr iecho,CTEXT("OFF")
  
  .IF  EAX==0
          mov @echo,0
  .else
      mov @echo,1    
  .endif

   invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
   invoke ExitProcess,0


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;文本串去空格拷贝过程, 参数:输入文本,输出缓存
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Trim proc uses esi edi ecx edx ebx , lpstr,Buffer
   mov esi,lpstr
   mov edi ,Buffer
   xor ecx,ecx
   xor edx,edx   
       .while TRUE
                mov al,20h
                mov ah ,byte ptr[esi+ecx]      
               .if  ah==al
                     inc edx                      
         .else             
                  mov ebx, ecx
                  sub ebx,edx 
           mov byte ptr[edi+ebx],ah  
             .if  ah==0
                    ret
             .endif
         .endif
         inc ecx
        .endw                
  ret
Trim endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;调试用,信息框显示数值 参数:标题,待显示数值
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

debugbox proc  text:dword,dwDword:dword
LOCAL posBuffer[10]:byte

invoke wsprintf,addr posBuffer,addr template,dwDword
invoke MessageBox, NULL, addr posBuffer, text, MB_OK 

debugbox  endp



;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;正则表达式取子文本,参数:POINT地址,输出缓存,缓存大小
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
GetRetString proc uses edx , lpPOINT,lpRetString,iSize
    mov edx,lpPOINT
    mov eax,[edx].POINT.y
    sub eax,[edx].POINT.x
    .if eax>iSize
        mov eax,iSize
    .endif
    push eax
    invoke RtlMoveMemory,lpRetString,[edx].POINT.x,eax
    pop eax
    mov edx,lpRetString
    mov BYTE ptr [edx+eax],0
    ret
GetRetString endp


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;NOD32_ID验证过程,参数:用户名,密码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

TestID proc  uses edx  lpuser:dword,lppass:dword

 LOCAL hOpen,hConnect,hRequest,dwSize,status
 
         
          invoke InternetOpen,CTEXT("nohacks_autoid"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
          mov hOpen,eax

        .IF eax==0    
          invoke InternetCloseHandle,hOpen
                mov eax,-1
          ret        
        .endif
      

           invoke InternetConnect,hOpen,CTEXT("download.eset.com"),INTERNET_DEFAULT_HTTP_PORT,lpuser,lppass,INTERNET_SERVICE_HTTP,0,0
          
          mov hConnect,eax
          
                 .IF eax==0  
    
          invoke InternetCloseHandle,hOpen
          invoke InternetCloseHandle,hConnect
                mov eax,-1
          ret        
        .endif
        invoke HttpOpenRequest,hConnect, CTEXT("GET"),CTEXT("/download/win"),NULL, NULL, 0, INTERNET_FLAG_KEEP_CONNECTION, 0           
          mov  hRequest,eax
         .IF eax==0  
    
          invoke InternetCloseHandle,hOpen
          invoke InternetCloseHandle,hConnect
          invoke  HttpEndRequest ,hRequest,NULL, NULL,NULL         
                mov eax,-1
          ret        
         .endif
          
         invoke  HttpSendRequest ,hRequest,NULL,0,NULL,0

           .IF eax==0  
    
          invoke InternetCloseHandle,hOpen
          invoke InternetCloseHandle,hConnect
          invoke  HttpEndRequest ,hRequest,NULL, NULL,NULL                  
                mov eax,-1
          ret        
         .endif

         mov dwSize,4
         mov status,0

         invoke  HttpQueryInfo,hRequest,HTTP_QUERY_STATUS_CODE +  HTTP_QUERY_FLAG_NUMBER , addr status ,  addr dwSize , 0
   
       .IF eax==0  
    
          invoke InternetCloseHandle,hOpen
          invoke InternetCloseHandle,hConnect
          invoke  HttpEndRequest ,hRequest,NULL, NULL,NULL                  
                mov eax,-1
          ret        
         .endif
   
       invoke InternetCloseHandle,hOpen
       invoke InternetCloseHandle,hConnect
       invoke InternetCloseHandle,hRequest
       invoke  HttpEndRequest ,hRequest,NULL, NULL,NULL
       ;invoke  debugbox,CTEXT("status"),status
      
       .if status!=0 

          .if  status!=401
           ; invoke  debugbox,CTEXT("status"),status
         mov eax,TRUE
         
         ret
                    
           .endif
       
       .endif
           
        xor eax,eax
  ret

TestID endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;向系统托盘中写入图标 输入:窗口句柄 图标id 自定义消息 图标句柄  显示文本 标题

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcTaskQiPao  proc  _hWnd,_dwId,_dwWm,_hIcon,_szBuffer,_szTitle
  local @stNid:mNOTIFYICONDATA
 
  .if @echo==0
       ret   
  .endif
 
  mov  @stNid.cbSize,sizeof  mNOTIFYICONDATA
  push  _hWnd
  pop  @stNid.hwnd
  push  _dwId
  pop  @stNid.uID
  mov  @stNid.uFlags,  NIF_INFO
  push  _dwWm
  pop  @stNid.uCallbackMessage
  push  _hIcon
  pop  @stNid.hIcon
  mov @stNid.dwInfoFlags,0
  mov @stNid.uTimeoutOrVersion,3000
  ;invoke  lstrcpy,addr @stNid.szTip,_szText
  invoke  lstrcpy,addr @stNid.szInfo,_szBuffer
  invoke  lstrcpy,addr @stNid.szInfoTitle,_szTitle
  invoke  Shell_NotifyIcon,NIM_MODIFY,addr @stNid
  
  ret
_ProcTaskQiPao  endp 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;ESET ID 密码加密过程,参数:源码,输出缓存
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

EnCode proc uses edi ebx lpEnCode,lpEnDestBuff
    xor edi,edi
    lea eax,PassBytes        
    mov edx,lpEnCode
    mov ebx,lpEnDestBuff
    
    .while edi < 10
    
       mov cl,BYTE ptr [edx+edi]      ;把密码逐位移到CL
       xor cl,BYTE ptr [eax+edi*2]    ;;关键代码: 与编码奇数位进行位异或运算
       mov BYTE ptr [ebx+edi*2],cl    ;奇数位移到缓存
           
       mov cl,BYTE ptr [eax+edi*2-1]  ;偶数位移到缓存
       mov BYTE ptr [ebx+edi*2-1] ,cl
       
       inc edi
    .endw
    mov eax,ebx
    ret
EnCode endp


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;ESET ID 密码解密过程,参数:源码,输出缓存
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

DeCode proc uses edi ebx lpEnCode,lpDeDestBuff
    
    xor edi,edi                       
    lea eax,PassBytes        
    mov edx,lpEnCode
    mov ebx,lpDeDestBuff
    .while edi < 10
        mov cl,BYTE ptr [edx+edi*2] ;把加密后的密码奇数位移到CL
        xor cl,BYTE ptr [eax+edi*2] ;关键代码: 与编码奇数位进行位异或运算
        mov BYTE ptr [ebx+edi],cl   ;奇数位移到缓存
        inc edi
    .endw
    mov eax,ebx
    ret
DeCode endp


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;ESET ID获取过程,返回地址,参数:分发页网址 ,输出用户名,输出密码,获取个数上限,可以为空,默认100
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

GetEsetid proc uses ebx edx, url, lpUser,lpPass,ldNum
LOCAL hOpen,hOpenUrl,dwSize,status,@pMemory,@lpcdData,@start,@end
LOCAL @lpUser[20]:BYTE
LOCAL @lpPass[20]:BYTE
LOCAL @Pass[20]:BYTE
LOCAL  @TEMP[100]:BYTE

   ;开始获取ID分发页源码
     invoke InternetOpen,CTEXT("nohacks_autoid"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
     
                .IF eax==0  
    
          invoke InternetCloseHandle,hOpen                    
          mov eax,-1
          ret        
                .endif
             
      mov hOpen,eax

      invoke InternetOpenUrl,hOpen,url,NULL,0,INTERNET_FLAG_TRANSFER_BINARY+INTERNET_FLAG_PRAGMA_NOCACHE,0
                  .IF eax==0  
    
            invoke InternetCloseHandle,hOpen   
            invoke InternetCloseHandle,hOpenUrl                 
            mov eax,-1
            ret        
                  .endif

       mov hOpenUrl,eax
       mov dwSize,4
       mov status,0

       invoke  HttpQueryInfo,hOpenUrl,HTTP_QUERY_CONTENT_LENGTH +  HTTP_QUERY_FLAG_NUMBER , addr status ,  addr dwSize , 0
                   .IF eax==0  
    
             invoke InternetCloseHandle,hOpen   
             invoke InternetCloseHandle,hOpenUrl                 
             mov eax,-1
             ret        
                   .endif

       invoke  GlobalAlloc,0, status+1
       mov @pMemory,eax 
       .if (!eax) 
        mov eax,-2
        ret       
       .endif                 
    
        invoke  RtlZeroMemory ,@pMemory,status+1

     ;成功获取ID分发页源码,保存在申请的空间 @pMemory
        invoke InternetReadFile,hOpenUrl, @pMemory,status,addr @lpcdData
        .if (!eax)         
        mov eax,-3
        ret        
        .endif       
        invoke InternetCloseHandle,hOpen
        invoke InternetCloseHandle,hOpenUrl     

      ;DebugCode:   invoke debugbox,CTEXT("status"),status
     
             
     ;===========开始循环获取验证ID===================  
   
     
     ;设置搜索开始地址
     push @pMemory          
     pop  @start
     
     ;设置搜索结束地址
     mov eax,status
     add eax,@pMemory
     mov @end,eax
      
     .if  ldNum==NULL
     
         mov ldNum,100
           
     .endif
                       
     .WHILE ldNum>0
           dec ldNum 
       mov iCount,3
       invoke  ExpressSearch,0,@start,@end,addr Express,addr lpRet,addr iCount,EF_USEEXPRESS                
           .BREAK .if (eax==0)
           
           ;后移开始地址到本次找到的位置尾 
           push lpRet.y                         
           pop  @start
                   
       .if SDWORD ptr eax>0 
                                       
          invoke  RtlZeroMemory ,addr @lpUser,sizeof @lpUser
          invoke  RtlZeroMemory ,addr @lpPass,sizeof @lpPass
            invoke GetRetString,addr lpRet[sizeof POINT],addr @lpUser,sizeof @lpUser-1
                invoke GetRetString,addr lpRet[sizeof POINT*2],addr @lpPass,sizeof @lpPass-1                                      
                                           
                 ;输出提示 
                invoke wsprintf,addr @TEMP,addr  UserPass ,addr @lpUser,addr @lpPass  
                invoke   _ProcTaskQiPao,Winhwnd,0,WM_NOTIFYICON ,hwnd,addr @TEMP ,CTEXT("正在验证网络ID")   
               invoke TestID,addr @lpUser  ,addr @lpPass
   
             .if (eax)
                   invoke Trim, addr @lpUser ,lpUser                                           
                  invoke Trim, addr @lpPass ,lpPass  
                   ;释放申请内存
                   invoke GlobalFree, @pMemory
                        mov eax ,TRUE
                        ret
                 .endif
                                                                    
           .endif 
                        
     .endw
      
     invoke GlobalFree, @pMemory
     mov eax ,FALSE
     ret

GetEsetid endp



DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL @lpType,@lpcdData
LOCAL hOpen,hOpenUrl,@pMemory
LOCAL dwSize,status
LOCAL @lpUser[20]:BYTE
LOCAL @lpPass[20]:BYTE
LOCAL @Pass[20]:BYTE
LOCAL  @TEMP[100]:BYTE
LOCAL  temp

 push hWin
 pop Winhwnd 
 mov eax,uMsg
 .if eax==WM_INITDIALOG      ;if 1
     invoke LoadIcon,hInstance,1  
     mov hwnd,eax
     mov note.cbSize,sizeof mNOTIFYICONDATA 
     push hWin
     pop note.hwnd 
     mov note.uID,IDI_TRAY 
     mov note.uFlags,NIF_ICON+NIF_MESSAGE+NIF_TIP 
     mov note.uCallbackMessage,WM_SHELLNOTIFY 
     push  hwnd
     pop note.hIcon
     invoke lstrcpy,addr note.szTip,CTEXT("ESET NOD32 ID自动升级工具")
     invoke Shell_NotifyIcon,NIM_ADD,addr note 
  
      ; 开始读注册表
      invoke   RegOpenKeyEx,HKEY_LOCAL_MACHINE, addr  RegEset30,\      
                NULL, KEY_ALL_ACCESS,ADDR @hKey           
        .if  eax == ERROR_SUCCESS       
            
              ;读取ESET本地用户名
              regurl:  
              invoke  RtlZeroMemory ,addr @lpUser,sizeof @lpUser
              invoke  RegQueryValueEx,@hKey,CTEXT("username"), 0,ADDR @lpType,NULL,addr @lpcdData
              invoke  RegQueryValueEx,@hKey,CTEXT("username"), 0,ADDR @lpType,ADDR @lpUser,addr @lpcdData
 
             ; REG_SZ,REG_BINARY
 
                  .if @lpcdData < 2
         
                      jmp IdNull
           
                  .endif                  
        
               ;读取ESET本地密码
               invoke  RtlZeroMemory ,addr @lpPass,sizeof @lpPass
               invoke  RegQueryValueEx,@hKey,CTEXT("password"), 0,ADDR @lpType,NULL,addr @lpcdData             
               invoke  RegQueryValueEx,@hKey,CTEXT("password"),0,ADDR @lpType,ADDR @lpPass,addr @lpcdData  
    
                   .if @lpcdData < 2
         
                     jmp IdNull
           
                    .endif         
             
               ;解密
               invoke  RtlZeroMemory ,addr @Pass,11
               invoke DeCode,addr @lpPass,addr @Pass
               invoke wsprintf,addr @TEMP,addr UserPass ,addr @lpUser,addr @Pass
               ;输出提示
               invoke   _ProcTaskQiPao,hWin,0,WM_NOTIFYICON ,hwnd,ADDR @TEMP,CTEXT("正在验证ESET本地ID")
                 
              ;联网验证ID
               invoke TestID ,addr @lpUser,addr @Pass

                 .if eax==-1
                       invoke   _ProcTaskQiPao,Winhwnd,0,WM_NOTIFYICON ,hwnd,ADDR @TEMP,CTEXT("连接官网时发生错误,请检查网络!")
                           invoke Sleep,500
                           jmp  exit
                 .endif


                .IF eax==TRUE
                     invoke   _ProcTaskQiPao,hWin,0,WM_NOTIFYICON ,hwnd,ADDR @TEMP,CTEXT("本机ESET ID有效!") 
                      invoke Sleep,100              
                           jmp exit        
                .else
           
                      IdNull:
           
                     invoke   _ProcTaskQiPao,hWin,0,WM_NOTIFYICON ,hwnd,CTEXT("http://www.eset.org.cn"),CTEXT("本机ESET ID无效,获取ID自分发页:")
                     ;数据清零
                     invoke  RtlZeroMemory ,addr @lpUser,sizeof @lpUser
                     invoke  RtlZeroMemory ,addr @lpPass,sizeof @lpPass
                     
                    ;获取有效ID
                     invoke GetEsetid ,CTEXT("http://www.eset.org.cn"),addr @lpUser,addr @lpPass,10
     
                  .if eax
                      
                      ;写到注册表用户名
             
                     invoke lstrlen, addr @lpUser  
                     invoke  RegSetValueEx,@hKey,CTEXT("username"),0,REG_SZ,addr @lpUser,eax
                   
                    ;解密写入密码
                invoke EnCode,addr @lpPass,addr @Pass
                invoke  RegSetValueEx,@hKey,CTEXT("password"), 0,REG_BINARY,addr @Pass , 20
                    
                     .if (!eax)
             
                 ;输出成功提示   
                 invoke   _ProcTaskQiPao,Winhwnd,0,WM_NOTIFYICON ,hwnd,ADDR @TEMP,CTEXT("有效ID已存入电脑!")
                invoke Sleep,100                 
                     .else
                       
                     invoke   _ProcTaskQiPao,Winhwnd,0,WM_NOTIFYICON ,hwnd,ADDR @TEMP,CTEXT("ID存入电脑时发生错误,请检查!")
                invoke Sleep,500     

                     .endif
               
                jmp exit
                    
                .else
                      invoke   _ProcTaskQiPao,Winhwnd,0,WM_NOTIFYICON ,hwnd,ADDR @TEMP,CTEXT("获取ID错误,请检查网络!")
                   invoke Sleep,500     
                      jmp exit                      
                .endif           
             
          .endif
      
        .else
    
              invoke   RegOpenKeyEx,HKEY_LOCAL_MACHINE, addr  RegEset27,\
      
                NULL, KEY_ALL_ACCESS,ADDR @hKey
    
     
        .if  eax == ERROR_SUCCESS

        jmp  regurl
   
         .else
                    
         invoke MessageBox,NULL,CTEXT("本机没有安装ESET NOD32 "),CTEXT("提示"),MB_ICONERROR+MB_OK
         ;invoke   _ProcTaskQiPao,hWin,0,WM_NOTIFYICON ,hwnd,CTEXT("本机没有安装ESET NOD32 "),CTEXT("提示")           
         ;invoke Sleep,500
        
         jmp exit
          .endif               
 
        .endif                    

  .elseif eax==WM_COMMAND          

  .elseif eax==WM_CLOSE           
  
   exit:
          invoke RegCloseKey,@hKey
          invoke Shell_NotifyIcon,NIM_DELETE,addr note
    invoke EndDialog,hWin,0     
  .else                               
    mov    eax,FALSE
    ret
  .endif                                   
  mov    eax,TRUE
  ret

DlgProc endp


end start
==========ESET_NOHACKS_AUTOID.ini=========
[SETUP]
ECHO=ON

;OFF 关闭气泡提示
;ON  显示气泡提示
==========
上传的附件 ESET_AUTOID.rar
Eset_nohacks_AUTOID.rar[解压密码:pediy]