<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>U-Labs Community - Tutorials</title>
		<link>https://u-labs.de/forum/</link>
		<description />
		<language>de</language>
		<lastBuildDate>Tue, 05 May 2026 19:21:04 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>1</ttl>
		<image>
			<url>https://u-labs.de/forum/images/ulabs/misc/rss.png</url>
			<title>U-Labs Community - Tutorials</title>
			<link>https://u-labs.de/forum/</link>
		</image>
		<item>
			<title>JavaScript - KCode Parser</title>
			<link>tutorials-229/javascript-kcode-parser-39849?goto=newpost</link>
			<pubDate>Sat, 18 Aug 2018 09:44:15 GMT</pubDate>
			<description>Knuddels bietet seit geraumer Zeit den KCode-Parser als Eigenständiges Modul in JavaScript an. Dies wird zum Beispiel verwendet, um den KCode im...</description>
			<content:encoded><![CDATA[<div>Knuddels bietet seit geraumer Zeit den KCode-Parser als Eigenständiges Modul in JavaScript an. Dies wird zum Beispiel verwendet, um den KCode im HTMLChat darzustellen oder in SystemApps/UserApps zu nutzen.<br />
<br />
Ich habe mir mal die Mühe gemacht, den kompletten Code zu analysieren und auch &quot;human readable&quot; zu machen. Das ganze habe ich aber bisher nur mit der aller ersten public-version gemacht, da das Package noch ziemlich klein ist und dementsprechend leichter zu analysieren ist. Diese Version beinhaltet aber sicher noch so einige Bugs oder es fehlen Features (logisch).<br />
<br />
Hier erst einmal eine Liste der Versionen:<br />
<br />
<div class="cms_table"><table class="cms_table"><tr valign="top" class="cms_table_tr"><td class="cms_table_td">Version</td>
<td class="cms_table_td">Last Change</td>
<td class="cms_table_td">URL</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.0.1</b></td>
<td class="cms_table_td">22.06.2016 - 13:15:39</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.0.1/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...1/kcode.min.js</a></td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.0.2</b></td>
<td class="cms_table_td">09.06.2016 - 14:04:36</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.0.2/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...2/kcode.min.js</a></td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.0.3</b></td>
<td class="cms_table_td">09.06.2016 - 16:22:10</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.0.3/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...3/kcode.min.js</a></td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.0.4</b></td>
<td class="cms_table_td">20.06.2016 - 09:56:11</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.0.4/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...4/kcode.min.js</a></td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.1.0</b></td>
<td class="cms_table_td">22.06.2016 - 13:20:37</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.1.0/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...0/kcode.min.js</a></td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.1.1</b></td>
<td class="cms_table_td">07.06.2016 - 08:45:08</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.1.1/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...1/kcode.min.js</a></td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.2.0</b></td>
<td class="cms_table_td">20.06.2016 - 15:36:57</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.2.0/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...0/kcode.min.js</a></td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.2.1</b></td>
<td class="cms_table_td">21.06.2016 - 16:21:47</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.2.1/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...1/kcode.min.js</a></td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.2.2</b></td>
<td class="cms_table_td">22.06.2016 - 09:00:05</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.2.2/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...2/kcode.min.js</a></td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.2.3</b></td>
<td class="cms_table_td">22.06.2016 - 09:41:02</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.2.3/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...3/kcode.min.js</a></td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.3.0</b></td>
<td class="cms_table_td">05.08.2016 - 21:21:55</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.3.0/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...0/kcode.min.js</a></td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.3.1</b></td>
<td class="cms_table_td">08.09.2016 - 11:48:45</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.3.1/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...1/kcode.min.js</a></td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.3.2</b></td>
<td class="cms_table_td">22.08.2017 - 10:28:14</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.3.2/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...2/kcode.min.js</a></td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td"><b>1.4.0</b></td>
<td class="cms_table_td">10.11.2017 - 10:59:44</td>
<td class="cms_table_td"><a href="http://cdn.knuddelscom.de/sf/libs/kcode/1.4.0/kcode.min.js" target="_blank" rel="nofollow">http://cdn.knuddelscom.de/sf/libs/kc...0/kcode.min.js</a></td>
</tr>
</table></div>
<br />
Vielleicht gehe ich da irgendwann einmal mit einem Compare durch um die Changes der einzelnen Versionen zu &quot;dokumentieren&quot;. Wäre vielleicht ein nice-to-have, um zu sehen, was für Features die einzelnen Versionen bereits implementiert haben.<br />
<br />
Hier eine Tabelle mit den mutmaßlichen Klassen - Ich habe die vom logischen Resultat benannt; Sprich, das was die jeweilige Funktion bereitstellt. Durch erste Erkenntnisse scheinen es immer 25 Funktionen zu sein. Die werden anhand des Array-Indexes durch die aller erste Function gewrappt und von dort auf instanziiert/aufgerufen. Eigentlich recht simple, auch wenn es am Anfang vielleicht etwas verwirrend ist.<br />
<br />
<a href="https://files.fm/u/e7h7cm7p" target="_blank" rel="nofollow">01 - Extract Classes, Renaming.zip (files.fm)</a><br />
<br />
<div class="cms_table"><table class="cms_table"><tr valign="top" class="cms_table_tr"><td class="cms_table_td">Index</td>
<td class="cms_table_td">Name</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">0</td>
<td class="cms_table_td">Main Entry</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">1</td>
<td class="cms_table_td">Prototypes (Erstellt Polyfills oder erweitert Objekte...)</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">2</td>
<td class="cms_table_td">Parser</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">3</td>
<td class="cms_table_td">Container</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">4</td>
<td class="cms_table_td">Entry</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">5</td>
<td class="cms_table_td">Component</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">6</td>
<td class="cms_table_td">PropertyNames</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">7</td>
<td class="cms_table_td">Properties</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">8</td>
<td class="cms_table_td">StringHelper</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">9</td>
<td class="cms_table_td">ValueHelper</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">10</td>
<td class="cms_table_td">EscapeKCode</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">11</td>
<td class="cms_table_td">ProfileHelper</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">12</td>
<td class="cms_table_td">CodeSnippets</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">13</td>
<td class="cms_table_td">Command</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">14</td>
<td class="cms_table_td">Link</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">15</td>
<td class="cms_table_td">PseudoCSS</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">16</td>
<td class="cms_table_td">Rewriter</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">17</td>
<td class="cms_table_td">LinkingAction</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">18</td>
<td class="cms_table_td">KImage</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">19</td>
<td class="cms_table_td">PropertySet</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">20</td>
<td class="cms_table_td">KCode (Container oder LineEntry?)</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">21</td>
<td class="cms_table_td">Reader</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">22</td>
<td class="cms_table_td">PropertiesLoader</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">23</td>
<td class="cms_table_td">LinkHandler</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">24</td>
<td class="cms_table_td">Destroyer</td>
</tr>
<tr valign="top" class="cms_table_tr"><td class="cms_table_td">25</td>
<td class="cms_table_td">Stylesheets (erstellt einfach ein &lt;style&gt;-Tag mit vordefinierter CSS)</td>
</tr>
</table></div>
<br />
Weitere Source folgt. Ich bin gerade noch dabei, die Klassen einzeln zu bearbeiten. Das ist für das Renaming von Methoden/Variablen notwendig. Schließlich will ich am Ende vernünftigen Code haben. Nach dem der ganze KCode-Parser auseinander genommen wurde, werde ich vllt. basierend auf ES6 (mal schauen) einen neuen auf OpenSource-Basis erstellen, mal sehen.<br />
<br />
Um ein Beispiel zu nennen, wie das ganze nachher aussehen wird, hier mal ein Beispiel:<br />
<b>Main</b><br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJScript.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: js;">
<br />
g = d(1).Dc;<br />
a = d(2);<br />
var e = d(16),<br />
    b = d(22),<br />
    h = d(17),<br />
    n = d(23).Qc,<br />
    c = d(3),<br />
    G = d(24);<br />
d = d(25);<br />
g();<br />
b.tb();<br />
d.Ec();<br />
window.KCode = {<br />
    setRelativeURLRewriteFunction: e.Cb,<br />
    Parser: a,<br />
    LinkingAction: h,<br />
    processLinkingActions: n,<br />
    destroy: G.Qb,<br />
    setCommonImageIDPrefix: c.bd,<br />
    setHTMLIdPrefix: c.cd,<br />
    version: &quot;1.0.1&quot;<br />
}<br />

</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script><br />
<br />
Resultat:<br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJScript.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: js;">
<br />
Prototypes.String();<br />
PropertiesLoader.init();<br />
StyleSheets.init();<br />
<br />
window.KCode = {<br />
    setRelativeURLRewriteFunction:  Rewriter.setRelativeURLRewriteFunction,<br />
    Parser:                         Parser,<br />
    LinkingAction:                  LinkingAction,<br />
    processLinkingActions:          LinkHandler.processLinkingActions,<br />
    destroy:                        Destroyer.destroy,<br />
    setCommonImageIDPrefix:         Container.setCommonImageIDPrefix,<br />
    setHTMLIdPrefix:                Container.setHTMLIdPrefix,<br />
    version:                        &quot;1.0.1&quot;<br />
}<br />

</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script><br />
<br />
<b>Prototypes</b><br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJScript.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: js;">
<br />
function(g) {<br />
        g.b = {<br />
            Dc: function() {<br />
                String.prototype.endsWith ||<br />
                    (String.prototype.endsWith = function(a) {<br />
                        return -1 !== this.indexOf(a, this.length - a.length)<br />
                    });<br />
                String.prototype.startsWith || (String.prototype.startsWith = function(a) {<br />
                    return 0 === this.indexOf(a)<br />
                })<br />
            }<br />
        }<br />
    }<br />

</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script><br />
<br />
Resultat:<br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJScript.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: js;">
<br />
function Prototypes() {<br />
    this.String = function String() {<br />
        String.prototype.endsWith || (String.prototype.endsWith = function(input) {<br />
            return (this.indexOf(input, this.length - input.length) !== -1);<br />
        });<br />
<br />
        String.prototype.startsWith || (String.prototype.startsWith = function(input) {<br />
            return (this.indexOf(input) === 0);<br />
        })<br />
    }<br />
}<br />

</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script></div>

]]></content:encoded>
			<category domain="tutorials-229">Tutorials</category>
			<dc:creator>Bubble Gum</dc:creator>
			<guid isPermaLink="true">tutorials-229/javascript-kcode-parser-39849</guid>
		</item>
		<item>
			<title>Patching Net Seal with Confuser</title>
			<link>tutorials-229/patching-net-seal-with-confuser-27246?goto=newpost</link>
			<pubDate>Sun, 13 Oct 2013 10:47:28 GMT</pubDate>
			<description>EPsA5fSi-WQ 
 
Das Video ist nicht von mir!!!!  Ich habe gedacht vielleicht kann Jemand was damit anfangen.  
 
Quelle: http://codemplosion.co.uk/</description>
			<content:encoded><![CDATA[<div><div style="text-align: center;"><br />
<object width="640" height="360"><param name="movie" value="//www.youtube.com/v/EPsA5fSi-WQ"></param><embed src="//www.youtube.com/v/EPsA5fSi-WQ" type="application/x-shockwave-flash" width="640" height="360"></embed></object><br />
<br />
<font size="5">Das Video ist nicht von mir!!!!  Ich habe gedacht vielleicht kann Jemand was damit anfangen. </font></div><br />
Quelle: <a href="http://codemplosion.co.uk/" target="_blank" rel="nofollow">http://codemplosion.co.uk/</a></div>

]]></content:encoded>
			<category domain="tutorials-229">Tutorials</category>
			<dc:creator>Sploxfreak</dc:creator>
			<guid isPermaLink="true">tutorials-229/patching-net-seal-with-confuser-27246</guid>
		</item>
		<item>
			<title><![CDATA[[Tutorial] Advanced EXE Modding von DizzY_D]]></title>
			<link>tutorials-229/tutorial-advanced-exe-modding-dizzy-d-17300?goto=newpost</link>
			<pubDate>Tue, 16 Oct 2012 05:59:35 GMT</pubDate>
			<description>Hey Leute, 
 
ist zwar schon bisschen älter das Tutorial aber an der Technick hat sich eigentlich nichts verändert und ist gut zum lernen. 
 
Es wird...</description>
			<content:encoded><![CDATA[<div>Hey Leute,<br />
<br />
ist zwar schon bisschen älter das Tutorial aber an der Technick hat sich eigentlich nichts verändert und ist gut zum lernen.<br />
<br />
Es wird anhand eines Beispiels erklärt wie man auseiner Detected Exe eine Undetected Exe macht. Decreasing the detection rate.<br />
<br />
bitte sehr :)</div>


	<div style="padding:10px">

	

	

	

	
		<fieldset class="fieldset">
			<legend>Angehängte Dateien</legend>
			<ul>
			<li>
	<img class="inlineimg" src="https://u-labs.de/forum/images/attach/pdf.gif" alt="Dateityp: pdf" />
	<a href="https://u-labs.de/forum/attachment.php?attachmentid=418&amp;d=1350386910">Advanced_EXE_Modding_by_DizzY_D.pdf</a> 
(1,96 MB)
</li>
			</ul>
		</fieldset>
	

	</div>
]]></content:encoded>
			<category domain="tutorials-229">Tutorials</category>
			<dc:creator>Skyter</dc:creator>
			<guid isPermaLink="true">tutorials-229/tutorial-advanced-exe-modding-dizzy-d-17300</guid>
		</item>
		<item>
			<title><![CDATA[[Tutorial] Reverse Engineering - Teil II - Cracking (.NET)]]></title>
			<link>tutorials-229/tutorial-reverse-engineering-teil-ii-cracking-net-16992?goto=newpost</link>
			<pubDate>Thu, 04 Oct 2012 00:37:49 GMT</pubDate>
			<description>Reverse Engineering 
Teil II - Cracking (.NET) 
Teil I (http://u-hacks.net/tutorials-107/tutorial-reverse-engineering-teil-i-grundlagen-16944/) 
 
...</description>
			<content:encoded><![CDATA[<div><div style="text-align: center;"><font size="5">Reverse Engineering</font><br />
<font size="4">Teil II - Cracking (.NET)</font><br />
<a href="http://u-hacks.net/tutorials-107/tutorial-reverse-engineering-teil-i-grundlagen-16944/" target="_blank" rel="nofollow">Teil I</a></div><br />
<br />
Im zweiten Teil meiner Tutorialreihe über Reverse Engineering beschäftigen wir uns erstmals mit Cracking. Dazu habe ich zwei relativ simple, nicht virtualisierte oder obfuskierte (zu Deobfuskation kommen wir aber auch noch) <a href="http://en.wikipedia.org/wiki/Crackme" target="_blank" rel="nofollow">Crackmes</a> vorbereitet. Wir werden uns diese erstmal zusammen anschauen, zum Üben werde ich euch später dann noch weitere zur Verfügung stellen.<br />
<br />
<br />
<span style="text-shadow: 0px 0px 10px #8d8d8d"><font size="3">.NET Reflector installieren und konfigurieren</font></span><br />
<br />
Zuerst solltet ihr Visual C# 2010 Express (wird in diesem Teil noch nicht benötigt, höchstwahrscheinlich aber schon im nächsten) und Redgate .NET Reflector installieren, die Download-Links findet ihr im ersten Teil. Im Archiv von .NET Reflector sind auch ein Keygen und eine Anleitung zum Aktivieren enthalten, entweder aktiviert ihr es wie dort beschrieben oder ihr kauft euch eine Lizenz. Sofern ihr zukünftig nicht mit diesem Programm arbeiten wollt, sondern lieber ein anderes bevorzugt oder euch gar nicht auf's Cracken von .NET-Anwendungen spezialisieren wollt, reicht es wenn ihr es als Testversion nutzt (sind glaube ich 14 Tage, möglicherweise schließen wir das Thema .NET bis dahin auch schon komplett ab). Dann braucht ihr auch noch das Add-In Reflexil (kommt beim zweiten Crackme zum Einsatz), den Download-Link findet ihr ebenfalls im ersten Teil. Um das Add-In zu laden geht ihr in .NET Reflector auf Tools -&gt; Add-Ins... und fügt dann Reflexil.Reflector.dll hinzu.<br />
<br />
<br />
<span style="text-shadow: 0px 0px 10px #8d8d8d"><font size="3">Crackme #1</font></span><br />
<br />
<b>Download:</b> <a href="http://www22.zippyshare.com/v/19682167/file.html" target="_blank" rel="nofollow">Zippyshare.com - Crackme1.exe</a><br />
<br />
Beim unserem ersten Crackme geht es darum das Passwort herauszufinden. Wie schon im ersten Teil erwähnt haben wir zwei Möglichkeiten, wir können versuchen es zu erraten oder wir dekompilieren das Programm und schauen dann was wir hier an Möglichkeiten haben. Da wir keinerlei Hinweise haben probieren wir gar nicht erst es zu erraten, also schauen wir uns mal an wie das Crackme in .NET Reflector aussieht (File -&gt; Open Assembly...).<br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i50.tinypic.com/j10hu0.png"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
<i>An dieser Stelle würde ich euch empfehlen erst einmal ein wenig rumzuspielen (möglichst ohne etwas zu verstellen) bevor ihr weiter lest, ich persönlich halte nämlich sehr viel von <a href="http://de.wikipedia.org/wiki/Learning_by_Doing" target="_blank" rel="nofollow">Learning by Doing</a>.</i><br />
<br />
Crackmes bestehen meist, sowie auch dieses, nur aus ein oder zwei Klassen. Von daher sind sie recht überschaulich und wer jetzt schon ewtas rumgespielt hat der kennt auch schon das Passwort. Aber wir wollen hier ja was lernen, deshalb stellen wir uns einfach mal vor, dass das Programm aus 100 Klassen besteht. Wie finden wir jetzt die Klasse, in der sich das Passwort befindet? Wir haben zwei Möglichkeiten, erste wäre zum Einstiegspunkt zu gehen und sich von dort aus durch den Quelltext zu arbeiten, die andere Möglichkeit (gerade dann nützlich wenn das Programm tatsächlich so viele Klassen aufweist) ist den Quelltext nach uns bekannten Hinweisen zu durchsuchen. Ich würde vorschlagen, dass wir bei diesem Crackme erst einmal ersteres versuchen, beim nächsten wenden wir dann die andere Methode an. Dazu klicken wir mit der rechten Maustaste auf unser geladenes Assembly und wählen Go To Entry Point.<br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i45.tinypic.com/plkqe.png"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
Jetzt müsstet ihr in der Methode Main() der Klasse Program gelandet sein.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">[STAThread]<br />
private static void Main()<br />
{<br />
&nbsp; &nbsp; Application.EnableVisualStyles();<br />
&nbsp; &nbsp; Application.SetCompatibleTextRenderingDefault(false);<br />
&nbsp; &nbsp; Application.Run(new Form1());<br />
}</code><hr />
</div>Den Code sollte jeder einigermaßen verstehen, habe ja im letzten Teil schon gesagt gehabt, dass grundlegende C#-Kentnisse erforderlich sind. Ihr könnt oben auch die Sprache ändern, es wird unter anderem auch Visual Basic unterstützt, da kann ich euch bei Fragen aber nicht weiterhelfen.<br />
Was sofort auffällt ist <b>new Form1()</b>, hier wird ein neues Form1-Objekt erstellt. Wenn wir im Editor auf Form1 klicken landen wir im Konstruktor der Klasse, wo wir das Passwort schon sehen können. Leider ist das nicht immer so einfach, beispielsweise dann wenn die Variablen nicht password heißt, das Passwort nicht im Konstruktor zugewiesen wird, es verschlüsselt ist oder wenn das gar nicht die Klasse ist, die wir suchen. Um das Ganze noch etwas zu vertiefen schauen wir uns die Klasse mal etwas genauer an, obwohl wir das Passwort jetzt schon kennen. Um den Quelltext der ganzen Klasse anzuzeigen, klicken wir links im Assembly Browser (nenn ich jetzt mal so) auf Form1.<br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i50.tinypic.com/540m0.png"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
Wir sehen jetzt alle Datenfelder (auch globale Variablen genannt) und Methoden der Klasse, aber keine zugewiesenen Werte oder <a href="http://wiki.byte-welt.net/wiki/Methode_%28Java%29#Methodenrumpf" target="_blank" rel="nofollow">Rümpfe</a>. Um auch diese anzuzeigen, klicken wir im Editor auf <b>Expand Methods</b>. Das Ganze ist jetzt recht überschaulich und die Methode, die wir suchen. sticht sofort ins Auge. Hier wird überprüft, ob der Wert der Eigenschaft Text unserer TextBox mit dem Wert des Datenfeldes password übereinstimmt und der Wert sollte euch spätestens jetzt bekannt sein, steht ziemlich Weit oben im Quelltext.<br />
<br />
<br />
<span style="text-shadow: 0px 0px 10px #8d8d8d"><font size="3">Crackme #2</font></span><br />
<br />
<b>Download:</b> <a href="http://www22.zippyshare.com/v/8693022/file.html" target="_blank" rel="nofollow">Zippyshare.com - Crackme2.exe</a><br />
<br />
Beim zweiten Crackme gehen wir etwas anders vor, dieses mal öffnen wir es in .NET Reflector und suchen im Quellcode nach Hinweise. Dazu klicken wir in der Menüleiste auf die Lupe bzw. drücken auf unserer Tastatur die Taste F3. (Bitte sicherstellen, dass im Assembly Browser auch Crackme2 ausgewählt ist, dieses Assembly wollen wir schließlich auch durchsuchen). Jetzt müssen wir nur noch wissen wonach wir eigentlich suchen, dazu überlegen wir was wir eigentlich über das Crackme wissen. Wir wissen, dass eine Nachricht (&quot;Falsch&quot;) ausgegeben wird wenn wir ein falsches Passwort eingeben. Nach dieser Nachricht suchen wir, also geben wir im Suchfeld <b>Falsch</b> ein und da es sich um ein String handelt müssen wir auch nach einem String suchen (dazu rechts vom Suchfeld das vorletzte Symbol auswählen bzw. STRG + S drücken). Die Suche kann bei größeren Assemblies etwas Zeit in Anspruch nehmen, bei unserem Crackme geht das aber relativ schnell.<br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i47.tinypic.com/2r7n0h4.png"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
Voila! Wir sind fündig geworden. Wenn wir jetzt doppelt auf das Suchergebnis klicken landen wir in der gesuchten Methode. (Das Suchfenster könnt ihr jetzt wieder schließen, brauchen wir nicht mehr).<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">private void button1_Click(object sender, EventArgs e)<br />
{<br />
&nbsp; &nbsp; MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();<br />
&nbsp; &nbsp; byte[] bytes = Encoding.Default.GetBytes(this.textBox1.Text);<br />
&nbsp; &nbsp; if (BitConverter.ToString(provider.ComputeHash(bytes)).Replace(&quot;-&quot;, string.Empty).ToLower().Equals(this.password.ToLower()))<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; MessageBox.Show(&quot;Richtig&quot;);<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; else<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; MessageBox.Show(&quot;Falsch&quot;);<br />
&nbsp; &nbsp; }<br />
}</code><hr />
</div>Wir sehen, dass das Passwort wieder im Datenfeld password gespeichert ist. Wir sehen aber auch, dass es ein MD5-Hash ist. Ein Hash lässt sich anders als eine Verschlüsselung nicht entschlüsseln, stattdessen können wir das Passwort aber ändern und hier kommt das Add-In Reflexil im Spiel. Um das Passwort zu ändern müssen wir den Konstruktor manipulieren, denn hier wird dem Datenfeld password ein Wert zugewiesen. Wir klicken im Assembly Browser auf <b>Form1</b> und dann im Editor unter Methoden auf <b>Form1()</b> (im Assembly Browser heißt der Konstruktor sonst auch <b>.ctor()</b>). Dann rufen wir Reflexil hervor indem wir in der Menüleiste Tools -&gt; Reflexil v1.5 auswählen.<br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i50.tinypic.com/33tnyty.png"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
Wir sehen sogenannte Instruktionen, um ein Programm zu manipulieren müssen wir solche hinzufügen, löschen, austauschen, verschieben oder verändern. Dabei ist es gar nicht so wichtig, dass wir die Bedeutungen aller Instruktionen kennen, dafür zeige ich euch später noch Trick 93. Für uns ist gerade nur die zweite Instruktion interessant, deren Operand mit dem Wert übereinstimmt, den wir manipulieren wollen. Relativ einleuchtend, dass es sich hier um die Zuweisung des Werts innerhalb des Konstruktors handelt. Wir klicken mit der rechten Maustaste auf die Instruktion -&gt; Edit und es öffnet sich ein Fenster, in welches wir einen neuen Wert festlegen können. Ich ändere das Passwort zu <b>Flav-ist-geil</b>, der <a href="http://www.php-einfach.de/sonstiges_generator_md5.php" target="_blank" rel="nofollow">MD5-Hash</a> lautet demnach <b>d207abfb46670eb135e0c314f7c56dce</b>. Nachdem wir den Wert geändert haben klicken wir im Assembly Browser mit der rechten Maustaste auf unser Assembly und wählen Reflexil v1.5 -&gt; Save As... und speichern es.<br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i46.tinypic.com/1pw07n.png"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
Wer will kann auch noch versuchen den Fenstertitel zu bearbeiten (Klasse: Form1, Methode: InitializeComponents(), Instruction: [#: 129, Offset: 450]).<br />
<br />
Statt das Passwort zu ändern hätten wir den Check auch komplett entfernen können, dazu müssen wir uns im nächsten Teil aber erst noch etwas näher mit Instruktionen auseinandersetzen (Trick 93 klärt). Thema des nächsten Teils wird wahrscheinlich auch Deobfuskation.</div>

]]></content:encoded>
			<category domain="tutorials-229">Tutorials</category>
			<dc:creator>Flav</dc:creator>
			<guid isPermaLink="true">tutorials-229/tutorial-reverse-engineering-teil-ii-cracking-net-16992</guid>
		</item>
		<item>
			<title><![CDATA[[Tutorial] Reverse Engineering - Teil I - Grundlagen]]></title>
			<link>tutorials-229/tutorial-reverse-engineering-teil-i-grundlagen-16944?goto=newpost</link>
			<pubDate>Mon, 01 Oct 2012 23:51:10 GMT</pubDate>
			<description>Reverse Engineering 
Teil I - Grundlagen 
Teil II (http://u-hacks.net/tutorials-107/tutorial-reverse-engineering-teil-ii-cracking-net-16992/) 
 
...</description>
			<content:encoded><![CDATA[<div><div style="text-align: center;"><font size="5">Reverse Engineering</font><br />
<font size="4">Teil I - Grundlagen</font><br />
<a href="http://u-hacks.net/tutorials-107/tutorial-reverse-engineering-teil-ii-cracking-net-16992/" target="_blank" rel="nofollow">Teil II</a></div><br />
<br />
Hallo,<br />
<br />
schön, dass ihr zu meiner Tutorialreihe über Reverse Engineering gefunden habt. In diesem ersten Teil möchte ich darauf eingehen was Reverse Engineering ist, wofür es eingesetzt wird, wie man vorgeht, welche Voraussetzungen gefordert werden und womit wir zukünftig arbeiten.<br />
<br />
<br />
<span style="text-shadow: 0px 0px 10px #8d8d8d"><font size="3">Was ist Reverse Engineering und wofür wird es eingesetzt?</font></span><br />
<br />
Bevor wir ein Produkt (hier eine Software) anfertigen, entwickeln wir für gewöhnlich erst einmal einen Plan. Reverse Engineering (engl. für umgekehrt entwickeln, rekonstrurieren) bezeichnet in der Informatik den Vorgang, einen Plan <u>für ein bereits bestehendes Produkt</u> zu entwickeln. Dafür kann es verschiedene Anlässe geben:<br />
<br />
<ul><li style="">Plan und Source Code eines möglicherweise schon älteren Projektes, das nun wieder aufgegriffen werden soll, sind nicht mehr vorhanden. Um fortzufahren, müssen wir den bisherigen Fortschritt erst einmal rekonstrurieren.</li><li style="">Eine bereits bestehende, nicht mehr funktionierende Software, deren Source Code uns nicht zur Verfügung steht, soll aufgearbeitet werden. Wir kennen möglicherweise schon die Ursache des Problems und wollen die Software entsprechend manipulieren (patchen, cracken), um sie wieder zum Laufen zu kriegen. Bevor wir das Programm manipulieren können, müssen wir gewisse Teile aber erst einmal rekonstruieren.</li><li style="">Ein Produkt soll nachgeahmt werden (in der Informatik sprechen wir von Emulation), hierzu müssen gewisse Vorgänge wie z. B. Verschlüsselungen rekonstruriert werden.</li></ul><br />
Ersteres ist eher selten der Fall, meist hängt Reverse Engineering tatsächlich mit Cracking und Emulation zusammen. Cracking wird auch Thema des nächsten Teils sein.<br />
<br />
<br />
<span style="text-shadow: 0px 0px 10px #8d8d8d"><font size="3">Wie geht man vor und welche Voraussetzungen sind gefordert?</font></span><br />
<br />
Zum Rekonstrurieren eines Plans haben wir zwei Möglichkeiten:<br />
<br />
<ol class="decimal"><li style="">Wir analysieren das Produkt durch Ausprobieren.</li><li style="">Wir zerlegen das Produkt in seine Einzelteile, beim Zerlegen einer Software sprechen wir von Dekompilieren.</li></ol><br />
Die erste Möglichkeit fordert keine Voraussetzungen, höchstens ein paar hunderte Tests, die sehr viel Zeit in Anspruch nehmen. Leider ist diese Möglichkeit aber oft nicht Erfolg versprechend, wenn man bspw. ein Passwort oder eine Verschlüsselung rekonstruieren will kommt man hier meist nicht weit und muss zur zweiten Möglichkeit greifen, welche grundlegende Kentnisse in einer Programmiersprache voraussetzt. Welche Programmiersprache beherrscht werden muss hängt davon ab was für ein Produkt wir zerlegen, ob bspw. eine .NET- oder eine Java-Applikation. Wenn wir uns im nächsten Teil mit Cracking beschäftigen werden grundlegende C#-Kentnisse vorausgesetzt (vorerst wirklich nur einfache Dinge wie Variablen, Methoden-Aufrufe und Bedingungen).<br />
<br />
<br />
<span style="text-shadow: 0px 0px 10px #8d8d8d"><font size="3">Womit arbeiten wir in Zukunft?</font></span><br />
<br />
Wie schon gesagt wollen wir uns im nächsten Teil mit Cracking von .NET-Anwendungen beschäftigen, dazu benötigen wir folgende Programme:<br />
<br />
<ul><li style=""><b>Visual C# 2010 Express</b> - <a href="http://www.microsoft.com/visualstudio/deu/downloads" target="_blank" rel="nofollow">Download | Microsoft Visual Studio 2012</a><br />
Dank Visual C# 2010 Express und Trick 93 (dazu komm ich dann noch) brauchen wir Bytecode so gut wie gar nicht verstehen, um eine Methode auszutauschen.</li><li style=""><b>Redgate .NET Reflector 7.6.0.808</b> - <a href="http://www44.zippyshare.com/v/7884352/file.html" target="_blank" rel="nofollow">Zippyshare.com - Redgate .NET Reflector 7.6.0.808.rar</a><br />
Mit .NET Reflector können wir eine Anwendung dekompilieren und erhalten einigermaßen gut verständlichen Source Code.</li><li style=""><b>Reflexil</b> - <a href="http://sourceforge.net/projects/reflexil/files/" target="_blank" rel="nofollow">Reflexil - Browse Files at SourceForge.net</a><br />
Mit diesem .NET Reflector Add-In können wir eine Anwendung manipulieren.</li></ul><br />
<br />
<br />
Ich hoffe ich konnte euch im ersten Teil Grundlegendes über Reverse Engineering näher bringen und euer Interesse wecken. Anfangs scheint es natürlich noch etwas trocken, aber Theorie gehört nunmal dazu und im nächsten Teil gehen wir ja auch schon zur Praxis über.</div>

]]></content:encoded>
			<category domain="tutorials-229">Tutorials</category>
			<dc:creator>Flav</dc:creator>
			<guid isPermaLink="true">tutorials-229/tutorial-reverse-engineering-teil-i-grundlagen-16944</guid>
		</item>
	</channel>
</rss>
