Files
metasploit-gs/api/Msf/Util/WindowsRegistry/Sam.html
T
jenkins-metasploit c3f5bd3de2 Reboot gh-pages
2026-05-08 17:08:43 +00:00

509 lines
26 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
Module: Msf::Util::WindowsRegistry::Sam
&mdash; Documentation by YARD 0.9.37
</title>
<link rel="stylesheet" href="../../../css/style.css" type="text/css" />
<link rel="stylesheet" href="../../../css/common.css" type="text/css" />
<script type="text/javascript">
pathId = "Msf::Util::WindowsRegistry::Sam";
relpath = '../../../';
</script>
<script type="text/javascript" charset="utf-8" src="../../../js/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="../../../js/app.js"></script>
</head>
<body>
<div class="nav_wrap">
<iframe id="nav" src="../../../class_list.html?1"></iframe>
<div id="resizer"></div>
</div>
<div id="main" tabindex="-1">
<div id="header">
<div id="menu">
<a href="../../../_index.html">Index (S)</a> &raquo;
<span class='title'><span class='object_link'><a href="../../../Msf.html" title="Msf (module)">Msf</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../../Util.html" title="Msf::Util (module)">Util</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../WindowsRegistry.html" title="Msf::Util::WindowsRegistry (module)">WindowsRegistry</a></span></span>
&raquo;
<span class="title">Sam</span>
</div>
<div id="search">
<a class="full_list_link" id="class_list_link"
href="../../../class_list.html">
<svg width="24" height="24">
<rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
<rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
<rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
</svg>
</a>
</div>
<div class="clear"></div>
</div>
<div id="content"><h1>Module: Msf::Util::WindowsRegistry::Sam
</h1>
<div class="box_info">
<dl>
<dt>Defined in:</dt>
<dd>lib/msf/util/windows_registry/sam.rb</dd>
</dl>
</div>
<h2>Overview</h2><div class="docstring">
<div class="discussion">
<p>This module include helpers for the SAM hive</p>
</div>
</div>
<div class="tags">
</div>
<h2>
Instance Method Summary
<small><a href="#" class="summary_toggle">collapse</a></small>
</h2>
<ul class="summary">
<li class="public ">
<span class="summary_signature">
<a href="#get_hboot_key-instance_method" title="#get_hboot_key (instance method)">#<strong>get_hboot_key</strong>(boot_key) &#x21d2; String </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the HashedBootKey from a given BootKey.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#get_user_keys-instance_method" title="#get_user_keys (instance method)">#<strong>get_user_keys</strong>(&amp;block) &#x21d2; Hash </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns the Users` key information under HKLMSAMDomainsAccountUsers.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#normalize_key-instance_method" title="#normalize_key (instance method)">#<strong>normalize_key</strong>(key) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'></div></span>
</li>
</ul>
<div id="instance_method_details" class="method_details_list">
<h2>Instance Method Details</h2>
<div class="method_details first">
<h3 class="signature first" id="get_hboot_key-instance_method">
#<strong>get_hboot_key</strong>(boot_key) &#x21d2; <tt>String</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the HashedBootKey from a given BootKey.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>boot_key</span>
<span class='type'>(<tt>String</tt>)</span>
&mdash;
<div class='inline'>
<p>The BootKey</p>
</div>
</li>
</ul>
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>String</tt>)</span>
&mdash;
<div class='inline'>
<p>The HashedBootKey or an empty string if the revision number is unknown</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/util/windows_registry/sam.rb', line 19</span>
<span class='kw'>def</span> <span class='id identifier rubyid_get_hboot_key'>get_hboot_key</span><span class='lparen'>(</span><span class='id identifier rubyid_boot_key'>boot_key</span><span class='rparen'>)</span>
<span class='id identifier rubyid_qwerty'>qwerty</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>!@</span><span class='tstring_content'>#$%^&amp;*()qwertyUIOPAzxcvbnmQQQQQQQQQQQQ)(*@&amp;%\0</span><span class='tstring_end'>&quot;</span></span>
<span class='id identifier rubyid_digits'>digits</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>0123456789012345678901234567890123456789\0</span><span class='tstring_end'>&quot;</span></span>
<span class='id identifier rubyid__value_type'>_value_type</span><span class='comma'>,</span> <span class='id identifier rubyid_value_data'>value_data</span> <span class='op'>=</span> <span class='id identifier rubyid_get_value'>get_value</span><span class='lparen'>(</span><span class='id identifier rubyid_normalize_key'>normalize_key</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>HKLM\\SAM\\SAM\\Domains\\Account</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>F</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='id identifier rubyid_revision'>revision</span> <span class='op'>=</span> <span class='id identifier rubyid_value_data'>value_data</span><span class='lbracket'>[</span><span class='int'>0x68</span><span class='comma'>,</span> <span class='int'>4</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_unpack'>unpack</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>V</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span>
<span class='kw'>case</span> <span class='id identifier rubyid_revision'>revision</span>
<span class='kw'>when</span> <span class='int'>1</span>
<span class='id identifier rubyid_hash'>hash</span> <span class='op'>=</span> <span class='const'>Digest</span><span class='op'>::</span><span class='const'>MD5</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
<span class='id identifier rubyid_hash'>hash</span><span class='period'>.</span><span class='id identifier rubyid_update'>update</span><span class='lparen'>(</span><span class='id identifier rubyid_value_data'>value_data</span><span class='lbracket'>[</span><span class='int'>0x70</span><span class='comma'>,</span> <span class='int'>16</span><span class='rbracket'>]</span> <span class='op'>+</span> <span class='id identifier rubyid_qwerty'>qwerty</span> <span class='op'>+</span> <span class='id identifier rubyid_boot_key'>boot_key</span> <span class='op'>+</span> <span class='id identifier rubyid_digits'>digits</span><span class='rparen'>)</span>
<span class='id identifier rubyid_rc4'>rc4</span> <span class='op'>=</span> <span class='const'>OpenSSL</span><span class='op'>::</span><span class='const'>Cipher</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>rc4</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='id identifier rubyid_rc4'>rc4</span><span class='period'>.</span><span class='id identifier rubyid_decrypt'>decrypt</span>
<span class='id identifier rubyid_rc4'>rc4</span><span class='period'>.</span><span class='id identifier rubyid_key'>key</span> <span class='op'>=</span> <span class='id identifier rubyid_hash'>hash</span><span class='period'>.</span><span class='id identifier rubyid_digest'>digest</span>
<span class='id identifier rubyid_hboot_key'>hboot_key</span> <span class='op'>=</span> <span class='id identifier rubyid_rc4'>rc4</span><span class='period'>.</span><span class='id identifier rubyid_update'>update</span><span class='lparen'>(</span><span class='id identifier rubyid_value_data'>value_data</span><span class='lbracket'>[</span><span class='int'>0x80</span><span class='comma'>,</span> <span class='int'>32</span><span class='rbracket'>]</span><span class='rparen'>)</span>
<span class='id identifier rubyid_hboot_key'>hboot_key</span> <span class='op'>&lt;&lt;</span> <span class='id identifier rubyid_rc4'>rc4</span><span class='period'>.</span><span class='id identifier rubyid_final'>final</span>
<span class='id identifier rubyid_hboot_key'>hboot_key</span>
<span class='kw'>when</span> <span class='int'>2</span>
<span class='id identifier rubyid_aes'>aes</span> <span class='op'>=</span> <span class='const'>OpenSSL</span><span class='op'>::</span><span class='const'>Cipher</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>aes-128-cbc</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='id identifier rubyid_aes'>aes</span><span class='period'>.</span><span class='id identifier rubyid_decrypt'>decrypt</span>
<span class='id identifier rubyid_aes'>aes</span><span class='period'>.</span><span class='id identifier rubyid_key'>key</span> <span class='op'>=</span> <span class='id identifier rubyid_boot_key'>boot_key</span>
<span class='id identifier rubyid_aes'>aes</span><span class='period'>.</span><span class='id identifier rubyid_padding'>padding</span> <span class='op'>=</span> <span class='int'>0</span>
<span class='id identifier rubyid_aes'>aes</span><span class='period'>.</span><span class='id identifier rubyid_iv'>iv</span> <span class='op'>=</span> <span class='id identifier rubyid_value_data'>value_data</span><span class='lbracket'>[</span><span class='int'>0x78</span><span class='comma'>,</span> <span class='int'>16</span><span class='rbracket'>]</span>
<span class='id identifier rubyid_aes'>aes</span><span class='period'>.</span><span class='id identifier rubyid_update'>update</span><span class='lparen'>(</span><span class='id identifier rubyid_value_data'>value_data</span><span class='lbracket'>[</span><span class='int'>0x88</span><span class='comma'>,</span> <span class='int'>16</span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='comment'># we need only 16 bytes
</span> <span class='kw'>else</span>
<span class='id identifier rubyid_elog'><span class='object_link'><a href="../../../top-level-namespace.html#elog-instance_method" title="#elog (method)">elog</a></span></span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>[Msf::Util::WindowsRegistry::Sam::get_hboot_key] Unknown hbootKey revision: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_revision'>revision</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
<span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span><span class='period'>.</span><span class='id identifier rubyid_b'>b</span>
<span class='kw'>end</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="get_user_keys-instance_method">
#<strong>get_user_keys</strong>(&amp;block) &#x21d2; <tt>Hash</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns the Users` key information under HKLMSAMDomainsAccountUsers. This includes the RID, name and `V` value for each user.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>Hash</tt>)</span>
&mdash;
<div class='inline'>
<p>A hash with the following structure: {</p>
<pre class="code ruby"><code class="ruby">&lt;User RID&gt;: { V: &lt;V value&gt;, Name: &lt;User name&gt; },
...
</code></pre>
<p>}</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/util/windows_registry/sam.rb', line 56</span>
<span class='kw'>def</span> <span class='id identifier rubyid_get_user_keys'>get_user_keys</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='id identifier rubyid_block'>block</span><span class='rparen'>)</span>
<span class='id identifier rubyid_users'>users</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
<span class='id identifier rubyid_users_key'>users_key</span> <span class='op'>=</span> <span class='id identifier rubyid_normalize_key'>normalize_key</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>HKLM\\SAM\\SAM\\Domains\\Account\\Users</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='id identifier rubyid_rids'>rids</span> <span class='op'>=</span> <span class='id identifier rubyid_enum_key'>enum_key</span><span class='lparen'>(</span><span class='id identifier rubyid_users_key'>users_key</span><span class='rparen'>)</span>
<span class='kw'>if</span> <span class='id identifier rubyid_rids'>rids</span>
<span class='id identifier rubyid_rids'>rids</span><span class='period'>.</span><span class='id identifier rubyid_delete'>delete</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Names</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='id identifier rubyid_rids'>rids</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_rid'>rid</span><span class='op'>|</span>
<span class='id identifier rubyid_rid'>rid</span> <span class='op'>=</span> <span class='id identifier rubyid_rid'>rid</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span>
<span class='id identifier rubyid_rid'>rid</span><span class='period'>.</span><span class='id identifier rubyid_encode!'>encode!</span><span class='lparen'>(</span><span class='op'>::</span><span class='const'>Encoding</span><span class='op'>::</span><span class='const'>UTF_8</span><span class='rparen'>)</span> <span class='kw'>unless</span> <span class='id identifier rubyid_rid'>rid</span><span class='period'>.</span><span class='id identifier rubyid_encoding'>encoding</span> <span class='op'>==</span> <span class='op'>::</span><span class='const'>Encoding</span><span class='op'>::</span><span class='const'>UTF_8</span>
<span class='id identifier rubyid_key'>key</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_users_key'>users_key</span><span class='embexpr_end'>}</span><span class='tstring_content'>\\</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_rid'>rid</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
<span class='kw'>yield</span> <span class='id identifier rubyid_key'>key</span> <span class='kw'>if</span> <span class='id identifier rubyid_block'>block</span>
<span class='id identifier rubyid__value_type'>_value_type</span><span class='comma'>,</span> <span class='id identifier rubyid_value_data'>value_data</span> <span class='op'>=</span> <span class='id identifier rubyid_get_value'>get_value</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>V</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='kw'>next</span> <span class='kw'>unless</span> <span class='id identifier rubyid_value_data'>value_data</span>
<span class='id identifier rubyid_users'>users</span><span class='lbracket'>[</span><span class='id identifier rubyid_rid'>rid</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span><span class='lparen'>(</span><span class='int'>16</span><span class='rparen'>)</span><span class='rbracket'>]</span> <span class='op'>||=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
<span class='id identifier rubyid_users'>users</span><span class='lbracket'>[</span><span class='id identifier rubyid_rid'>rid</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span><span class='lparen'>(</span><span class='int'>16</span><span class='rparen'>)</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='symbol'>:V</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_value_data'>value_data</span>
<span class='comment'># Attempt to get Hints
</span> <span class='id identifier rubyid__value_type'>_value_type</span><span class='comma'>,</span> <span class='id identifier rubyid_value_data'>value_data</span> <span class='op'>=</span> <span class='id identifier rubyid_get_value'>get_value</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_users_key'>users_key</span><span class='embexpr_end'>}</span><span class='tstring_content'>\\</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_rid'>rid</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>UserPasswordHint</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='kw'>next</span> <span class='kw'>unless</span> <span class='id identifier rubyid_value_data'>value_data</span>
<span class='id identifier rubyid_users'>users</span><span class='lbracket'>[</span><span class='id identifier rubyid_rid'>rid</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span><span class='lparen'>(</span><span class='int'>16</span><span class='rparen'>)</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='symbol'>:UserPasswordHint</span><span class='rbracket'>]</span> <span class='op'>=</span>
<span class='id identifier rubyid_value_data'>value_data</span><span class='period'>.</span><span class='id identifier rubyid_dup'>dup</span><span class='period'>.</span><span class='id identifier rubyid_force_encoding'>force_encoding</span><span class='lparen'>(</span><span class='op'>::</span><span class='const'>Encoding</span><span class='op'>::</span><span class='const'>UTF_16LE</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_encode'>encode</span><span class='lparen'>(</span><span class='op'>::</span><span class='const'>Encoding</span><span class='op'>::</span><span class='const'>UTF_8</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_strip'>strip</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='comment'># Retrieve the user names for each RID
</span> <span class='comment'># TODO: use a proper structure to do this, since the user names are included in V data
</span> <span class='id identifier rubyid_names'>names</span> <span class='op'>=</span> <span class='id identifier rubyid_enum_key'>enum_key</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_users_key'>users_key</span><span class='embexpr_end'>}</span><span class='tstring_content'>\\Names</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
<span class='kw'>if</span> <span class='id identifier rubyid_names'>names</span>
<span class='id identifier rubyid_names'>names</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_name'>name</span><span class='op'>|</span>
<span class='id identifier rubyid_name'>name</span> <span class='op'>=</span> <span class='id identifier rubyid_name'>name</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span>
<span class='id identifier rubyid_name'>name</span><span class='period'>.</span><span class='id identifier rubyid_encode!'>encode!</span><span class='lparen'>(</span><span class='op'>::</span><span class='const'>Encoding</span><span class='op'>::</span><span class='const'>UTF_8</span><span class='rparen'>)</span> <span class='kw'>unless</span> <span class='id identifier rubyid_name'>name</span><span class='period'>.</span><span class='id identifier rubyid_encoding'>encoding</span> <span class='op'>==</span> <span class='op'>::</span><span class='const'>Encoding</span><span class='op'>::</span><span class='const'>UTF_8</span>
<span class='id identifier rubyid_key'>key</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_users_key'>users_key</span><span class='embexpr_end'>}</span><span class='tstring_content'>\\Names\\</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_name'>name</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
<span class='kw'>yield</span> <span class='id identifier rubyid_key'>key</span> <span class='kw'>if</span> <span class='id identifier rubyid_block'>block</span>
<span class='id identifier rubyid_value_type'>value_type</span><span class='comma'>,</span> <span class='id identifier rubyid__value_data'>_value_data</span> <span class='op'>=</span> <span class='id identifier rubyid_get_value'>get_value</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='id identifier rubyid_users'>users</span><span class='lbracket'>[</span><span class='id identifier rubyid_value_type'>value_type</span><span class='rbracket'>]</span> <span class='op'>||=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
<span class='comment'># Apparently, key names are ISO-8859-1 encoded
</span> <span class='id identifier rubyid_users'>users</span><span class='lbracket'>[</span><span class='id identifier rubyid_value_type'>value_type</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='symbol'>:Name</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_name'>name</span><span class='period'>.</span><span class='id identifier rubyid_dup'>dup</span><span class='period'>.</span><span class='id identifier rubyid_force_encoding'>force_encoding</span><span class='lparen'>(</span><span class='op'>::</span><span class='const'>Encoding</span><span class='op'>::</span><span class='const'>ISO_8859_1</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_encode'>encode</span><span class='lparen'>(</span><span class='op'>::</span><span class='const'>Encoding</span><span class='op'>::</span><span class='const'>UTF_8</span><span class='rparen'>)</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='id identifier rubyid_users'>users</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="normalize_key-instance_method">
#<strong>normalize_key</strong>(key) &#x21d2; <tt>Object</tt>
</h3><table class="source_code">
<tr>
<td>
<pre class="lines">
10
11
12</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/util/windows_registry/sam.rb', line 10</span>
<span class='kw'>def</span> <span class='id identifier rubyid_normalize_key'>normalize_key</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
<span class='ivar'>@root</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span> <span class='op'>?</span> <span class='id identifier rubyid_key'>key</span> <span class='op'>:</span> <span class='id identifier rubyid_key'>key</span><span class='period'>.</span><span class='id identifier rubyid_delete_prefix'>delete_prefix</span><span class='lparen'>(</span><span class='ivar'>@root</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
</div>
</div>
<div id="footer">
Generated on Fri May 8 17:01:37 2026 by
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
0.9.37 (ruby-3.1.5).
</div>
</div>
</body>
</html>