黑客防线,在攻与防的对立统一中寻求突破!2001年创刊的黑客技术专业刊物!

设为首页
收藏本站
联系我们
网站导航

黑客论坛 - 公共交流区 - 技术交流 - 浏览 - [分享]将特殊环境下获取用户信息进行到底代码完善
用户体验升级,欢迎参与!        您是本贴第 98 位浏览者 本版版主

帖子主题: [分享]将特殊环境下获取用户信息进行到底代码完善

  • 610548422
  • 等级: 银牌VIP
  • 发贴: 30 贴
  • 货币: 0 金币
  • 积分: 412 分
  • 经验: 198 点
  • 体力: 4200 点
  • 注册: 2007-03-08
[分享]将特殊环境下获取用户信息进行到底代码完善
想必大家都看过泪痕的“将特殊环境下获取用户信息进行到底”这个文章吧。这篇文章中有点瑕疵,就是当用户名中有中文字符的时候会打印不出,作者也在文章最后坦然指出了。于是我就来完善下了。

问题出在EnumUser()这个用户定义的函数上,它调用了NetUserEnum这个API函数,这个函数返回用户的一些信息,其中有一项是用户名,是用UNICODE的字符串。泪痕用了printf(%S)来输出,我以为是printf不能处理UNICODE,便自己用wprintf来打印,但是不知道为什么依然不能成功。

于是我便想把UNICODE转成多字节字符串,再用PRINTF打印。

主要用到WideCharToMultiByte这个函数
int WideCharToMultiByte(
UINT CodePage,            // code page
  DWORD dwFlags,            // performance and mapping flags
  LPCWSTR lpWideCharStr,    // wide-character string
  int cchWideChar,          // number of chars in string.
  LPSTR lpMultiByteStr,     // buffer for new string
  int cbMultiByte,          // size of buffer
  LPCSTR lpDefaultChar,     // default for unmappable chars
  LPBOOL lpUsedDefaultChar  // set when default char used
);

转换的过程如下:
第一次调用,并且为cchWideChar设置-1,用来得到UNICODE字符串的大小(是用字节表示的)
第二次调用,并且为cchWideChar设置上面得到的大小,这样就可以转换了。

具体的代码如下:

Code:

void EnumUser()            //枚举用户函数
{
        char szUser[128];
  DWORD dwLevel = 1;
  LPUSER_INFO_1 oUserInfo;  //定义结构体保存帐户信息
  ZeroMemory(&oUserInfo, sizeof(oUserInfo));
  DWORD Maxlen = 1024;
  DWORD Read;              //保存读取的帐户个数
  DWORD Entries;
  DWORD Handle = 0;
  NET_API_STATUS ret;
                  
  bool        istrue;

  ret = NetUserEnum(       //调用NetUserEnum将帐户信息保存到结构体
   NULL,
   dwLevel,
   FILTER_NORMAL_ACCOUNT,
   (LPBYTE *)&oUserInfo,
   Maxlen,
   &Read,
   &Entries,
   &Handle);
  if(NERR_Success == ret)
  {
                for(DWORD i=0; i<Read; i++)      //打印帐户
                {
                DWORD dwSize=WideCharToMultiByte(0,0,oUserInfo->usri1_name,-1,szUser,128,0,0);
                WideCharToMultiByte(0,0,oUserInfo->usri1_name,dwSize,szUser,128,0,0);
                printf("Account Name : %s\n",szUser);
                oUserInfo++;
                }
  }
  else
  {
   printf("User Enum error!\n");
  }
if(oUserInfo != NULL)
        NetApiBufferFree(oUserInfo);
        return;
}


对于对宽字节和多字节字符串不熟悉的朋友来说还有有一定价值的。

只是完善。高手别BS了 。

呵呵


本贴已被 作者2008-8-31 23:9:28 编辑过
2008-8-31 22:57:32
  • 泪の痕
  • 等级: 银牌VIP
  • 发贴: 332 贴
  • 货币: 0 金币
  • 积分: 18437 分
  • 经验: 16492 点
  • 体力: 168495 点
  • 注册: 2007-11-09
Re:[分享]将特殊环境下获取用户信息进行到底代码完善
谢谢楼主帮忙解决问题,学习下~!
开始攒钱买《VC++6.0技术内幕》《深入浅出MFC》《MFC WINDOWS 程序设计》《WINDOWS程序设计》《C++编程思想》《加密解密3》
QQ:451344389
2008-8-31 23:16:01
  • VIP技术支持2
  • 等级: 黑客防线技术团队
  • 勋章:
  • 发贴: 1899 贴
  • 货币: 34 金币
  • 积分: 6821 分
  • 经验: 29086 点
  • 体力: 112770 点
  • 注册: 2007-05-25
Re:[分享]将特殊环境下获取用户信息进行到底代码完善
unciode转ansi用我这个函数吧。。   效率比WideCharToMultiByte要快些。

; eax = 0, function fails 。    eax = 1, Function succeeds

proc        WideCharToAnsiChar  lpAnsiText:DWORD, lpWideText:DWORD
                                        
                                pushad
                                
                                mov                esi, dword [lpWideText]
                                
                                or                esi, esi
                                
                                je                .end0
                                
                                mov                edi, dword [lpAnsiText]
                                
                                or                edi, edi
                                
                                je                .end0
                        
                        @@:        
                                lodsw
                                
                                or                ax, ax
                                
                                je                .end
                                
                                stosb
                                
                                jmp                @b
                        
                        .end0:        
                                
                                xor                eax, eax
                                
                                mov                [esp+4*7], eax
                                
                                jmp                @f
                        
                        .end:

                                stosb
                                
                                xor                eax, eax
                                
                                inc                eax
                                
                                mov                [esp+4*7], eax
                        
                        @@:
                                popad
                                
                                ret
                endp
.....................................
2008-8-31 23:31:30