<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Probleme mit Nullen im String und Logikfehler]]></title><description><![CDATA[<p>Hallo ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Ich habe mir eine Funktion gebastelt um im Prozesspeichers eines Windows-Prozesses nach einem binären Pattern zu suchen (mit einer x/? -Maske modifizierbar).</p>
<p>Nun ja...das größte Problem ist gleich mal dass \x00 in einem String ihn mir gleich terminiert und ich nicht length() aufrufen kann.<br />
Das selbe Problem habe ich auch mit den Daten die ich aus dem Speicher lese.</p>
<p>Ich könnte auch eine DLL in meinen Prozess injecten und per Zeigerspielereien auf mein Pattern-Offset zu kommen doch das kommt mir zu &quot;wuchtig&quot; rüber.</p>
<p>Außerdem glaube ich dass ich einige Logikfehler im Code habe. Wäre nett wenn mal jemand durch den Code schauen würde bzw mir sagen könnte wie ich einen string mit binären Daten füllen kann ohne dass ein \x00 ihn mir gleich terminiert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Hier mal mein aktueller Code:</p>
<p>So wird der Code verwendet:</p>
<pre><code class="language-cpp">Process* proc = new Process;
    proc-&gt;SetByProcessName(&quot;pinball.exe&quot;);
    proc-&gt;Open();

    cout &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Process-ID:     &quot; &lt;&lt; proc-&gt;ID() &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Process-Handle: &quot; &lt;&lt; proc-&gt;Handle() &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Scanning for score offset...\n&quot;;

    string pattern  = &quot;\xC2\x00\x00\x00\x00\x00\x0A\x00\x05\x00\x92\x01\x08\x01\x5A\x44\x00\x00&quot;;
    string mask     = &quot;xxxxxxxxxxxxxxxxxx&quot;;

    DWORD score_offset = proc-&gt;FindBinaryPattern(0x400000, 0x1000000, 18, pattern, mask);

    cout &lt;&lt; &quot;Score-Offset:   &quot; &lt;&lt;  score_offset &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Und hier die Implementation der Funktion:</p>
<p>&quot;int patternlength&quot; wird nur benötig da pattern.length() nicht aufrufbar ist...wäre doch deutlich praktischer mit der anderen Lösung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
<pre><code class="language-cpp">bool Process::DataCompare(string data, int index, int patternlength,string pattern, string mask)
{
    for (int i = 0; i &lt; patternlength; i++)
    {
        if (mask[i] == 'x' &amp;&amp; data[index + i] != pattern[i])
            return false;
    }

    return true;
}

DWORD Process::FindBinaryPattern(DWORD StartAddress, int Length, int patternlength, string pattern, string mask)
{
    int index = 0;
    string buffer;

    if(FINDBINARYPATTERN_BYTESTOREAD &gt; Length)
    {
        buffer = ReadMemString(StartAddress, Length);

        for(int i = 0; i &lt; (Length - patternlength); i++)
        {
            if(DataCompare(buffer, i, patternlength, pattern, mask))
                return static_cast&lt;DWORD&gt;(StartAddress + i);
        }
    }
    else
    {
        while (index &lt; Length)
        {
            buffer = ReadMemString(StartAddress + index, FINDBINARYPATTERN_BYTESTOREAD + patternlength);

            for (int i = 0; i &lt; FINDBINARYPATTERN_BYTESTOREAD; i++)
            {
                if(DataCompare(buffer, i, patternlength, pattern, mask))
                    return static_cast&lt;DWORD&gt;(StartAddress + index + i);

                index += FINDBINARYPATTERN_BYTESTOREAD;
            }
        }
    }

    return static_cast&lt;DWORD&gt;(NULL);
}
</code></pre>
<p>Ich setze Hoffnung in euch^^</p>
<p>Grüße und Danke im Vor-raus ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/244218/probleme-mit-nullen-im-string-und-logikfehler</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 12:15:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244218.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 26 Jun 2009 20:05:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit Nullen im String und Logikfehler on Fri, 26 Jun 2009 21:21:29 GMT]]></title><description><![CDATA[<p>Hallo ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Ich habe mir eine Funktion gebastelt um im Prozesspeichers eines Windows-Prozesses nach einem binären Pattern zu suchen (mit einer x/? -Maske modifizierbar).</p>
<p>Nun ja...das größte Problem ist gleich mal dass \x00 in einem String ihn mir gleich terminiert und ich nicht length() aufrufen kann.<br />
Das selbe Problem habe ich auch mit den Daten die ich aus dem Speicher lese.</p>
<p>Ich könnte auch eine DLL in meinen Prozess injecten und per Zeigerspielereien auf mein Pattern-Offset zu kommen doch das kommt mir zu &quot;wuchtig&quot; rüber.</p>
<p>Außerdem glaube ich dass ich einige Logikfehler im Code habe. Wäre nett wenn mal jemand durch den Code schauen würde bzw mir sagen könnte wie ich einen string mit binären Daten füllen kann ohne dass ein \x00 ihn mir gleich terminiert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Hier mal mein aktueller Code:</p>
<p>So wird der Code verwendet:</p>
<pre><code class="language-cpp">Process* proc = new Process;
    proc-&gt;SetByProcessName(&quot;pinball.exe&quot;);
    proc-&gt;Open();

    cout &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Process-ID:     &quot; &lt;&lt; proc-&gt;ID() &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Process-Handle: &quot; &lt;&lt; proc-&gt;Handle() &lt;&lt; &quot;\n&quot;;
    cout &lt;&lt; &quot;Scanning for score offset...\n&quot;;

    string pattern  = &quot;\xC2\x00\x00\x00\x00\x00\x0A\x00\x05\x00\x92\x01\x08\x01\x5A\x44\x00\x00&quot;;
    string mask     = &quot;xxxxxxxxxxxxxxxxxx&quot;;

    DWORD score_offset = proc-&gt;FindBinaryPattern(0x400000, 0x1000000, 18, pattern, mask);

    cout &lt;&lt; &quot;Score-Offset:   &quot; &lt;&lt;  score_offset &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Und hier die Implementation der Funktion:</p>
<p>&quot;int patternlength&quot; wird nur benötig da pattern.length() nicht aufrufbar ist...wäre doch deutlich praktischer mit der anderen Lösung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
<pre><code class="language-cpp">bool Process::DataCompare(string data, int index, int patternlength,string pattern, string mask)
{
    for (int i = 0; i &lt; patternlength; i++)
    {
        if (mask[i] == 'x' &amp;&amp; data[index + i] != pattern[i])
            return false;
    }

    return true;
}

DWORD Process::FindBinaryPattern(DWORD StartAddress, int Length, int patternlength, string pattern, string mask)
{
    int index = 0;
    string buffer;

    if(FINDBINARYPATTERN_BYTESTOREAD &gt; Length)
    {
        buffer = ReadMemString(StartAddress, Length);

        for(int i = 0; i &lt; (Length - patternlength); i++)
        {
            if(DataCompare(buffer, i, patternlength, pattern, mask))
                return static_cast&lt;DWORD&gt;(StartAddress + i);
        }
    }
    else
    {
        while (index &lt; Length)
        {
            buffer = ReadMemString(StartAddress + index, FINDBINARYPATTERN_BYTESTOREAD + patternlength);

            for (int i = 0; i &lt; FINDBINARYPATTERN_BYTESTOREAD; i++)
            {
                if(DataCompare(buffer, i, patternlength, pattern, mask))
                    return static_cast&lt;DWORD&gt;(StartAddress + index + i);

                index += FINDBINARYPATTERN_BYTESTOREAD;
            }
        }
    }

    return static_cast&lt;DWORD&gt;(NULL);
}
</code></pre>
<p>Ich setze Hoffnung in euch^^</p>
<p>Grüße und Danke im Vor-raus ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733494</guid><dc:creator><![CDATA[Icematix]]></dc:creator><pubDate>Fri, 26 Jun 2009 21:21:29 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Nullen im String und Logikfehler on Fri, 26 Jun 2009 22:01:06 GMT]]></title><description><![CDATA[<p>1. voraus</p>
<p>2. versteh ich nicht genau, was du möchtest</p>
<blockquote>
<p>Nun ja...das größte Problem ist gleich mal dass \x00 in einem String ihn mir gleich terminiert und ich nicht length() aufrufen kann.</p>
</blockquote>
<p>das stimmt (falls ich es nich falsch verstehe) nicht:</p>
<pre><code class="language-cpp">std::string foo;
assert(foo.size() == 0);
foo.push_back(0);
assert(foo.size() == 1);
foo.push_back(1);
assert(foo.size() == 2);
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733546</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 26 Jun 2009 22:01:06 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Nullen im String und Logikfehler on Sat, 27 Jun 2009 13:20:05 GMT]]></title><description><![CDATA[<p>Die Klasse <code>std::string</code> betrachtet vorkommende <code>'\0'</code> -Zeichen nicht als Terminierungen. Anders sieht es aus, wenn du den C-String über <code>c_str()</code> holst.</p>
<p>Da <code>std::string</code> speziell für Zeichenkettenverwaltung konzipiert ist und du eher einen Container für Daten brauchst, rate ich dir zu <code>std::vector&lt;char&gt;</code> . Da hast du zum Beispiel auch die Garantie, dass alle Elemente hintereinander im Speicher liegen, was bei <code>std::string</code> nicht sein muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733693</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 27 Jun 2009 13:20:05 GMT</pubDate></item></channel></rss>