找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2561|回复: 0

如何快速打开注册表指定键

[复制链接]
发表于 2015-2-21 12:47:09 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
作为程序员,你是否经常遇到,在查找某注册表设置时,在网上查到某个超长的注册表路径,但是打开regedit后你需要一个个点开每个子项?
这样十分费事也无聊,所以这里我花了10分钟进行了研究,已取得成果:
首先想到的是reg命令,结果一看之下发现reg只是操作“真正的”注册表,对于regedit这种界面没有直接关系。那么如何让regedit打开某一个特定键值呢?
要分析regedit!
分析的第一步,自然想到看看regedit 的command怎么解析的,找到text:002A9498 ; __stdcall ParseCommandLine(x)
  1. signed int __thiscall ParseCommandLine(void *this)
  2. {
  3.   LPWSTR v1; // eax@1
  4.   const WCHAR *v2; // esi@1
  5.   unsigned __int16 v3; // ax@1
  6.   LPWSTR v4; // eax@2
  7.   WCHAR v5; // ax@2
  8.   int (__cdecl *v6)(const wchar_t *, const wchar_t *, size_t); // ebx@12
  9.   int v7; // eax@16
  10.   LPWSTR v8; // eax@18
  11.   int v9; // eax@22
  12.   bool v10; // zf@23
  13.   int v11; // eax@23
  14.   int v12; // eax@25
  15.   int v13; // eax@26
  16.   int v14; // eax@27
  17.   int v15; // eax@28
  18.   signed int result; // eax@42
  19.   int v17; // eax@44
  20.   LPARAM v18; // esi@44
  21.   DWORD v19; // eax@48
  22.   const WCHAR *v20; // esi@53
  23.   int v21; // eax@53
  24.   const WCHAR *v22; // edi@53
  25.   int v23; // [sp-8h] [bp-230h]@31
  26.   char v24; // [sp+0h] [bp-228h]@0
  27.   void *v25; // [sp+Ch] [bp-21Ch]@1
  28.   signed int bEnable; // [sp+10h] [bp-218h]@1
  29.   signed int v27; // [sp+14h] [bp-214h]@1
  30.   WCHAR szLongPath; // [sp+18h] [bp-210h]@48

  31.   v25 = this;
  32.   bEnable = 0;
  33.   v27 = 0;
  34.   v1 = GetCommandLineW();
  35.   v2 = v1;
  36.   v3 = *v1;
  37.   if ( v3 != '"' )
  38.   {
  39.     if ( v3 > ' ' )
  40.     {
  41.       do
  42.         v2 = CharNextW(v2);
  43.       while ( *v2 > ' ' );
  44.     }
  45.     goto LABEL_11;
  46.   }
  47.   do
  48.   {
  49.     v4 = CharNextW(v2);
  50.     v2 = v4;
  51.     v5 = *v4;
  52.   }
  53.   while ( v5 && v5 != '"' );
  54.   if ( *v2 != '"' )
  55.     goto LABEL_11;
  56.   do
  57.   {
  58.     v2 = CharNextW(v2);
  59. LABEL_11:
  60.     ;
  61.   }
  62.   while ( *v2 && *v2 <= ' ' );
  63.   v6 = __wcsnicmp;
  64.   while ( 1 )
  65.   {
  66. LABEL_13:
  67.     if ( *v2 == ' ' )
  68.     {
  69.       do
  70.         v2 = CharNextW(v2);
  71.       while ( *v2 == 32 );
  72.       v6 = __wcsnicmp;
  73.     }
  74.     v7 = *v2;
  75.     if ( v7 != 47 && v7 != 45 )
  76.       break;
  77.     v8 = CharNextW(v2);
  78.     v2 = v8;
  79.     LOWORD(v8) = *v8;
  80.     if ( (_WORD)v8 )
  81.     {
  82.       while ( 1 )
  83.       {
  84.         if ( (_WORD)v8 == ' ' )
  85.           goto LABEL_13;
  86.         v8 = (LPWSTR)(unsigned __int16)v8;
  87.         if ( (signed int)(unsigned __int16)v8 > 'a' )
  88.         {
  89.           v11 = (int)((char *)v8 - 101);
  90.           v10 = v11 == 0;
  91.         }
  92.         else
  93.         {
  94.           if ( (unsigned __int16)v8 == 'a' || (v9 = (int)((char *)v8 - 'A')) == 0 )
  95.           {
  96.             dword_2B90CC = 4;
  97.             v27 = 1;
  98.             goto LABEL_37;
  99.           }
  100.           v11 = v9 - 4;
  101.           v10 = v11 == 0;
  102.         }
  103.         if ( v10 )
  104.         {
  105.           v27 = 1;
  106.         }
  107.         else
  108.         {
  109.           v12 = v11 - 7;
  110.           if ( !v12 )
  111.             goto LABEL_59;
  112.           v13 = v12 - 1;
  113.           if ( v13 )
  114.           {
  115.             v14 = v13 - 5;
  116.             if ( !v14 )
  117.             {
  118. LABEL_59:
  119.               if ( v6(v2, L"regserver", 9u) )
  120.                 return 2;
  121.               v23 = (int)L"RegExe";
  122.               goto LABEL_61;
  123.             }
  124.             v15 = v14 - 1;
  125.             if ( v15 )
  126.             {
  127.               if ( v15 == 2 && !v6(v2, L"unregserver", 0xBu) )
  128.               {
  129.                 v23 = (int)L"UnregExe";
  130. LABEL_61:
  131.                 RegInstallW(g_hInstance, v23, 0);
  132.                 return 2;
  133.               }
  134.             }
  135.             else
  136.             {
  137.               bEnable = 1;
  138.             }
  139.           }
  140.           else
  141.           {
  142.             g_hRegEditWnd = 0;
  143.           }
  144.         }
  145. LABEL_37:
  146.         v8 = CharNextW(v2);
  147.         v2 = v8;
  148.         LOWORD(v8) = *v8;
  149.         if ( !(_WORD)v8 )
  150.           goto LABEL_13;
  151.       }
  152.     }
  153.   }
  154.   if ( v25 == (void *)1 && (!bEnable || !*v2) )
  155.     goto LABEL_56;
  156.   result = v27;
  157.   if ( !v27 )
  158.   {
  159.     if ( *v2 == (_WORD)v27 )
  160.       return result;
  161.     v17 = GetNextSubstring(v2);
  162.     v18 = v17;
  163.     if ( v25 == (void *)1 )
  164.     {
  165.       if ( !v17 )
  166.         goto LABEL_56;
  167.     }
  168.     else if ( !v17 )
  169.     {
  170.       return 1;
  171.     }
  172.     do
  173.     {
  174.       v19 = GetLongPathNameW((LPCWSTR)v18, &szLongPath, 0x104u);
  175.       if ( v19 && v19 < 0x104 )
  176.         v18 = (LPARAM)&szLongPath;
  177.       RegEdit_ImportRegFile(0, bEnable, v18, 0);
  178.       v18 = GetNextSubstring(0);
  179.     }
  180.     while ( v18 );
  181.     return 1;
  182.   }
  183.   v20 = (const WCHAR *)GetNextSubstring(v2);
  184.   v21 = GetNextSubstring(0);
  185.   v22 = (const WCHAR *)v21;
  186.   if ( v25 != (void *)1 || v20 && v21 )
  187.   {
  188.     if ( !GetNextSubstring(0) )
  189.       RegEdit_ExportRegFile(0, v20, v22);
  190.     return 2;
  191.   }
  192. LABEL_56:
  193.   InternalMessageBox(g_hInstance, 0, (LPCVOID)0x28, (LPCWSTR)0x10, 16, v24);
  194.   return 2;
  195. }
复制代码

几个子函数都进去看了看,发现除了regserver unregserver,便无任何字符串比较过程,于是通过给regedit传命令的方式打开注册表项的方法失败了,因为regedit没提供接口。既然如此在往上层看看,因为在记忆中,好像某些时候打开注册表时,给的并不是主界面,有时候也会打开某些位置。。。
进到主函数WinMain中:
  1. int __stdcall __noreturn WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  2. {
  3.   void *v4; // eax@1
  4.   int v5; // eax@3
  5.   HWND v6; // eax@8
  6.   HWND v7; // esi@8
  7.   HACCEL v8; // esi@13
  8.   char v9; // [sp+0h] [bp-30h]@0
  9.   INITCOMMONCONTROLSEX picce; // [sp+Ch] [bp-24h]@1
  10.   struct tagMSG Msg; // [sp+14h] [bp-1Ch]@17

  11.   HeapSetInformation(0, HeapEnableTerminationOnCorruption, 0, 0);
  12.   GetThreadLocale();
  13.   g_hInstance = GetModuleHandleW(0);
  14.   picce.dwSize = 8;
  15.   picce.dwICC = 0xFFFF;
  16.   InitCommonControlsEx(&picce);
  17.   g_hRegEditWnd = FindWindowW(L"RegEdit_RegEdit", 0);
  18.   v4 = (void *)GetRegEditMode();
  19.   if ( v4 == (void *)2 )
  20.   {
  21.     InternalMessageBox(g_hInstance, 0, (LPCVOID)0x28, (LPCWSTR)0x10, 16, v9);
  22.   }
  23.   else
  24.   {
  25.     v5 = ParseCommandLine(v4) - 1;
  26.     if ( v5 )
  27.     {
  28.       if ( v5 != 1 )
  29.       {
  30.         if ( g_hRegEditWnd )
  31.         {
  32.           if ( IsIconic(g_hRegEditWnd) )
  33.           {
  34.             ShowWindow(g_hRegEditWnd, 9);
  35.           }
  36.           else
  37.           {
  38.             BringWindowToTop(g_hRegEditWnd);
  39.             v6 = GetLastActivePopup(g_hRegEditWnd);
  40.             v7 = v6;
  41.             if ( v6 != g_hRegEditWnd )
  42.               BringWindowToTop(v6);
  43.             SetForegroundWindow(v7);
  44.           }
  45.         }
  46.         else if ( RegisterRegEditClass() )
  47.         {
  48.           if ( RegisterHexEditClass() )
  49.           {
  50.             v8 = LoadAcceleratorsW(g_hInstance, (LPCWSTR)0x64);
  51.             if ( v8 )
  52.             {
  53.               g_hRegEditWnd = CreateRegEditWnd();
  54.               if ( g_hRegEditWnd )
  55.               {
  56.                 RegisterApplicationRestart(0, 0);
  57.                 while ( GetMessageW(&Msg, 0, 0, 0) )
  58.                 {
  59.                   if ( g_fDisableAccelerators || !TranslateAcceleratorW(g_hRegEditWnd, v8, &Msg) )
  60.                   {
  61.                     TranslateMessage(&Msg);
  62.                     DispatchMessageW(&Msg);
  63.                   }
  64.                 }
  65.               }
  66.             }
  67.           }
  68.         }
  69.       }
  70.     }
  71.     else if ( g_hRegEditWnd )
  72.     {
  73.       PostMessageW(g_hRegEditWnd, 0x111u, 0x288u, 0);
  74.     }
  75.   }
  76.   ExitProcess(0);
  77. }
复制代码



可以看到,winmain也就是parse了下command,之后做消息循环去了,和普通的winmain没区别,只不过禁止双开是用FindWindow实现的!!!
regedit的界面相比都很熟悉,左边一个treeview右边一个listview,我们看下treeview怎么初始化的,以便寻找突破点:发现RegisterRegEditClass
里面肯定调用了RegisterWindowClass函数,该函数用于注册窗口类,里面一定有窗口回调,找到了回调就好办了
  1. int __stdcall RegisterRegEditClass()
  2. {
  3.   WNDCLASSEXW Dst; // [sp+0h] [bp-30h]@1

  4.   memset(&Dst.style, 0, 0x2Cu);
  5.   Dst.cbSize = 48;
  6.   Dst.style = 16392;
  7.   Dst.lpfnWndProc = (WNDPROC)RegEditWndProc;
  8.   Dst.hInstance = g_hInstance;
  9.   Dst.hIcon = LoadIconW(g_hInstance, (LPCWSTR)0x64);
  10.   Dst.hCursor = LoadCursorW(g_hInstance, (LPCWSTR)0x64);
  11.   Dst.hbrBackground = (HBRUSH)16;
  12.   Dst.lpszMenuName = (LPCWSTR)103;
  13.   Dst.lpszClassName = L"RegEdit_RegEdit";
  14.   Dst.hIconSm = (HICON)LoadImageW(g_hInstance, (LPCWSTR)0x64, 1u, 16, 16, 0);
  15.   return RegisterClassExW(&Dst);
  16. }
复制代码


进到RegEditWndProc中看看:
int __stdcall RegEditWndProc(HWND hWnd, unsigned int Msg, unsigned int wParam, unsigned int lParam)
{
  HWND v5; // eax@21
  HWND v6; // esi@21
  int v7; // edx@25
  HWND v8; // [sp-10h] [bp-20h]@0
  UINT v9; // [sp-Ch] [bp-1Ch]@0
  int v10; // [sp+0h] [bp-10h]@0

  if ( Msg > WM_CONTEXTMENU )
  {
    if ( Msg > WM_MENUSELECT )
    {
      if ( Msg == WM_LBUTTONDOWN )
      {
        RegEdit_OnLButtonDown(hWnd, 0, (signed __int16)lParam, SHIWORD(lParam), wParam);
        return 0;
      }
      if ( Msg == WM_DROPFILES )
      {
        RegEdit_OnDropFiles(hWnd, (HDROP)wParam);
        return 0;
      }
      if ( Msg == SB_SETTEXT )
      {
        RegEdit_UpdateStatusBar();
        return 0;
      }
    }
    else
    {
      if ( Msg == WM_MENUSELECT )
      {
        RegEdit_OnMenuSelect(hWnd, wParam, lParam);
        return 0;
      }
      if ( Msg == WM_COMMAND )
      {
        RegEdit_OnCommand(hWnd, (unsigned __int16)wParam, lParam, wParam >> 16);
        return 0;
      }
      if ( Msg == WM_TIMER )
      {
        RegEdit_OnSelChangedTimer(hWnd, v10);
        return 0;
      }
      if ( Msg == WM_INITMENU )
      {
        dword_2B90BC = hMainMenu == (HMENU)wParam;
        return 0;
      }
      if ( Msg == 279 )
      {
        RegEdit_OnInitMenuPopup((int)hWnd, (HMENU)wParam, (unsigned __int16)lParam, lParam >> 16);
        return 0;
      }
    }
    return DefWindowProcW(hWnd, Msg, wParam, lParam);
  }
  if ( Msg == WM_CONTEXTMENU )
  {
    v7 = lParam == -1;
    if ( (HWND)wParam == g_RegEditData )
    {
      RegEdit_OnKeyTreeContextMenu(wParam, v7);
      return 0;
    }
    if ( (HWND)wParam == g_RegListView )
    {
      RegEdit_OnValueListContextMenu(wParam, v7);
      return 0;
    }
    return DefWindowProcW(hWnd, Msg, wParam, lParam);
  }
  if ( Msg > WM_SETFOCUS )
  {
    if ( Msg == WM_PAINT )
    {
      if ( dword_2B90C4 )
      {
        SendMessageW(g_RegEditData, 0xBu, 1u, 0);
        UpdateWindow(g_RegEditData);
        SendMessageW(g_RegEditData, 0xBu, 0, 0);
      }
      return DefWindowProcW(hWnd, Msg, wParam, lParam);
    }
    if ( Msg != WM_SYSCOLORCHANGE )
    {
      if ( Msg != WM_WININICHANGE )
      {
        if ( Msg == WM_NOTIFY )
          return RegEdit_OnNotify(hWnd, wParam, lParam);
        return DefWindowProcW(hWnd, Msg, wParam, lParam);
      }
      RegEdit_SetImageLists(hWnd);
    }
    RegEdit_SetSysColors();
    while ( 1 )
    {
      v5 = GetWindow(v8, v9);
      v6 = v5;
      if ( !v5 )
        break;
      SendMessageW(v5, Msg, wParam, lParam);
      v9 = 2;
      v8 = v6;
    }
LABEL_22:
    RegEdit_ResizeWindow(hWnd, 0);
    return 0;
  }
  if ( Msg == WM_SETFOCUS )
  {
LABEL_10:
    SetFocus(::hWnd);
    return 0;
  }
  if ( Msg == 1 )
    return (RegEdit_OnCreate(hWnd, (int *)lParam) != 0) - 1;
  if ( Msg == 2 )
  {
    RegEdit_OnDestroy(hWnd);
    return 0;
  }
  if ( Msg == 5 )
    goto LABEL_22;
  if ( Msg != 6 )
    return DefWindowProcW(hWnd, Msg, wParam, lParam);
  if ( wParam )
    goto LABEL_10;
  return 0;
}

我们最先关心的应该是WM_OnCreate消息,窗口初始化时就做好普通任务了以便展示给我们:所以进到RegEdit_OnCreate中
  1. signed int __stdcall RegEdit_OnCreate(HWND hWndParent, int *a2)
  2. {
  3.   int v2; // eax@1
  4.   DWORD v3; // esi@1
  5.   signed int result; // eax@2
  6.   HWND tree; // eax@13
  7.   HWND list; // eax@14
  8.   unsigned int v7; // esi@15
  9.   HWND v8; // ecx@15
  10.   int v9; // eax@17
  11.   int v10; // esi@21
  12.   HMENU v11; // edi@22
  13.   int v12; // edx@25
  14.   TVINSERTSTRUCTW Dst; // [sp+10h] [bp-A98h]@17
  15.   LPARAM lParam; // [sp+58h] [bp-A50h]@21
  16.   int v15; // [sp+60h] [bp-A48h]@21
  17.   HLOCAL hMem; // [sp+64h] [bp-A44h]@21
  18.   int v17; // [sp+84h] [bp-A24h]@1
  19.   DWORD pdwDefaultLayout; // [sp+88h] [bp-A20h]@1
  20.   int v19; // [sp+8Ch] [bp-A1Ch]@17
  21.   HKEY phkResult; // [sp+90h] [bp-A18h]@23
  22.   BYTE v21[4]; // [sp+94h] [bp-A14h]@1
  23.   DWORD Type; // [sp+98h] [bp-A10h]@24
  24.   DWORD cbData; // [sp+9Ch] [bp-A0Ch]@24
  25.   BYTE Data; // [sp+A0h] [bp-A08h]@24
  26.   WCHAR Name; // [sp+8A0h] [bp-208h]@19

  27.   v2 = *a2;
  28.   v3 = 512;
  29.   *(_DWORD *)v21 = 0;
  30.   pdwDefaultLayout = 0;
  31.   v17 = v2;
  32.   dword_2B9094 = (LPCWSTR)LoadDynamicString(0x14u);
  33.   if ( !dword_2B9094 )
  34.     goto LABEL_39;
  35.   dword_2B9098 = LoadDynamicString(0x1Bu);
  36.   if ( !dword_2B9098 )
  37.     goto LABEL_39;
  38.   dword_2B909C = LoadDynamicString(0x16u);
  39.   if ( !dword_2B909C )
  40.     goto LABEL_39;
  41.   dword_2B90A0 = (LPCWSTR)LoadDynamicString(0x19u);
  42.   if ( !dword_2B90A0 )
  43.     goto LABEL_39;
  44.   dword_2B90A4 = (LPCWSTR)LoadDynamicString(0x1Au);
  45.   if ( !dword_2B90A4 )
  46.     goto LABEL_39;
  47.   lpNewItem = (LPCWSTR)LoadDynamicString(0x15u);
  48.   if ( !lpNewItem )
  49.     goto LABEL_39;
  50.   pszFormat = (STRSAFE_LPCWSTR)LoadDynamicString(0x17u);
  51.   if ( !pszFormat )
  52.     goto LABEL_39;
  53.   dword_2B90B0 = (STRSAFE_LPCWSTR)LoadDynamicString(0x18u);
  54.   if ( !dword_2B90B0 )
  55.     goto LABEL_39;
  56.   if ( GetProcessDefaultLayout(&pdwDefaultLayout) && pdwDefaultLayout & 1 )
  57.     v3 = 8704;
  58.   tree = CreateWindowExW(v3, L"SysTreeView32", 0, 0x5001003Fu, 0, 0, 0, 0, hWndParent, (HMENU)1, g_hInstance, 0);
  59.   g_RegEditData = tree;
  60.   if ( tree
  61.     && (SetWindowTheme(tree, L"Explorer", 0),
  62.         SendMessageW(g_RegEditData, TVM_SETEXTENDEDSTYLE, 4u, 4),
  63.         list = CreateWindowExW(v3, L"SysListView32", 0, 0x52018A41u, 0, 0, 0, 0, hWndParent, (HMENU)2, g_hInstance, 0),
  64.         (g_RegListView = list) != 0)
  65.     && (SendMessageW(list, LVM_SETEXTENDEDLISTVIEWSTYLE, 0x4000u, 0x4000),
  66.         v7 = 0,
  67.         v8 = CreateStatusWindowW(1073742096, 0, hWndParent, 3u),
  68.         (hwndStatus = v8) != 0)
  69.     && (dword_2B9090 = (*(_DWORD *)(v17 + 0x3C) & 1) != 0 ? 5 : 0,
  70.         ShowWindow(v8, dword_2B9090),
  71.         RegEdit_SetImageLists(hWndParent)) )
  72.   {
  73.     RegEdit_SetSysColors();
  74.     memset(&Dst, 0, 0x44u);
  75.     Dst.hParent = (HTREEITEM)-65536;
  76.     Dst.hInsertAfter = (HTREEITEM)-65534;
  77.     Dst.itemex.mask = 103;
  78.     *(_QWORD *)&Dst.item.iImage = 0i64;
  79.     *(_QWORD *)&Dst.item.cChildren = 1i64;
  80.     Dst.itemex.pszText = (LPWSTR)LoadDynamicString(19u);
  81.     Dst.hParent = (HTREEITEM)SendMessageW(g_RegEditData, TVM_INSERTITEMW, 0, (LPARAM)&Dst);
  82.     LocalFree(Dst.itemex.pszText);
  83.     *(_QWORD *)&Dst.item.iImage = 0x300000002i64;
  84.     v9 = 0;
  85.     v19 = 0;
  86.     do
  87.     {
  88.       if ( v9 != 5 )
  89.       {
  90.         Dst.itemex.pszText = *(wchar_t **)((char *)&g_RegistryRoots + v7);
  91.         Dst.itemex.lParam = *(int *)((char *)&dword_2A1494 + v7);
  92.         Dst.itemex.cChildren = RegEnumKeyW((HKEY)Dst.itemex.lParam, 0, &Name, 0x100u) == 0;
  93.         SendMessageW(g_RegEditData, TVM_INSERTITEMW, 0, (LPARAM)&Dst);
  94.         v9 = v19;
  95.       }
  96.       ++v9;
  97.       v7 += 12;
  98.       v19 = v9;
  99.     }
  100.     while ( v7 < 72 );
  101.     SendMessageW(g_RegEditData, TVM_EXPAND, 2u, (LPARAM)Dst.hParent);
  102.     SendMessageW(g_RegEditData, TVM_SELECTITEM, 9u, (LPARAM)Dst.hParent);
  103.     v10 = v17;
  104.     dword_2B908C = 0;
  105.     hWnd = g_RegEditData;
  106.     dword_2B9080 = *(_DWORD *)(v17 + 44);
  107.     lParam = 6;
  108.     v15 = *(_DWORD *)(v17 + 48);
  109.     hMem = (HLOCAL)LoadDynamicString(0x11u);
  110.     SendMessageW(g_RegListView, LVM_INSERTCOLUMNW, 0, (LPARAM)&lParam);
  111.     LocalFree(hMem);
  112.     v15 = *(_DWORD *)(v10 + 52);
  113.     hMem = (HLOCAL)LoadDynamicString(0x1Fu);
  114.     SendMessageW(g_RegListView, LVM_INSERTCOLUMNW, 1u, (LPARAM)&lParam);
  115.     LocalFree(hMem);
  116.     v15 = *(_DWORD *)(v10 + 56);
  117.     hMem = (HLOCAL)LoadDynamicString(0x12u);
  118.     SendMessageW(g_RegListView, LVM_INSERTCOLUMNW, 2u, (LPARAM)&lParam);
  119.     LocalFree(hMem);
  120.     memset(&g_PrintDlg, 0, 0x54u);
  121.     hMainMenu = GetMenu(hWndParent);
  122.     LOBYTE(dword_2B90C0) = GetSystemMetrics(63) & 1;
  123.     dword_2B90C0 = (unsigned __int8)dword_2B90C0;
  124.     if ( !(_BYTE)dword_2B90C0 )
  125.     {
  126.       v11 = GetSubMenu(hMainMenu, 0);
  127.       DeleteMenu(v11, 0x291u, 0);
  128.       DeleteMenu(v11, 0x300u, 0);
  129.       DeleteMenu(v11, 0x2A1u, 0);
  130.     }
  131.     pszSrc = (STRSAFE_LPCWSTR)SendMessageW(g_RegEditData, TVM_GETNEXTITEM, 9u, 0);
  132.     if ( !RegOpenKeyW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit", &phkResult) )
  133.     {
  134.       cbData = 2048;
  135.       if ( !RegQueryValueExW(phkResult, L"LastKey", 0, &Type, &Data, &cbData)
  136.         && !RegEdit_QueryValueEx(&cbData)
  137.         && Type == 1
  138.         && cbData > 0 )
  139.         RegEdit_ExpandKeyPath(v12);
  140.       cbData = 4;
  141.       if ( !RegQueryValueExW(phkResult, L"MultiStrings", 0, &Type, v21, &cbData)
  142.         && !RegEdit_QueryValueEx(&cbData)
  143.         && Type == 4
  144.         && cbData > 0 )
  145.       {
  146.         if ( *(_DWORD *)v21 )
  147.           g_fMultiLineStrings = 1;
  148.       }
  149.       RegCloseKey(phkResult);
  150.     }
  151.     result = 1;
  152.   }
  153.   else
  154.   {
  155. LABEL_39:
  156.     result = 0;
  157.   }
  158.   return result;
  159. }
复制代码



这里分别创建了TreeView和ListView,我们只关心前者,该函数中操作为:
加载某些字符串
创建和设置TreeView窗口,根节点设置为“计算机”
将HKEY_CLASS_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS HKEY_CURRENT_CONFIG循环加入根节点中
检查Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit的值并执行RegEdit_ExpandKeyPath
这个就是我们感兴趣的!!!
我们只要设置该键值,再启动regedit,就可以达到目的!!
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-25 18:10 , Processed in 0.032723 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表