Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

MCode funktion + onlinegenerator (x86 und x64)


  • Please log in to reply
24 replies to this topic
Bentschi
  • Moderators
  • 120 posts
  • Last active: Sep 05 2014 02:12 AM
  • Joined: 26 Nov 2008

Hallo,

Ich hab mal wieder versucht etwas mit MCode zu spielen.

Allerdings musste ich feststellen dass die alten Scripte nur noch bedingt funktionieren.

Ich dachte mal ich mache ein Rewrite der alten Skripte und versuche noch zu verbessern was geht.

 

Das sind die Features:

- Die MCode funktion wählt automatisch den code für x86 oder x64.

- VirtualProtect (ausführungserlaubniss) für x64 (gab da probleme in einigen alten skripten)

- der MCode kann wahlweise in HEX oder Base64 kodiert werden.

- Schnelle Dekodierungsfunktion

- Onlinegenerator

 

Mindestanforderung:

- Windows XP, Windows 2003 oder neuer

- AutoHotkey 1.1+

 

Der Onlinegenerator ist hier zu finden:

http://bentschi.no-ip.org/mcode/

 

Hier die neue MCode funktion:

MCode(mcode)
{
  static e := {1:4, 2:1}, c := (A_PtrSize=8) ? "x64" : "x86"
  if (!regexmatch(mcode, "^([0-9]+),(" c ":|.*?," c ":)([^,]+)", m))
    return
  if (!DllCall("crypt32\CryptStringToBinary", "str", m3, "uint", 0, "uint", e[m1], "ptr", 0, "uint*", s, "ptr", 0, "ptr", 0))
    return
  p := DllCall("GlobalAlloc", "uint", 0, "ptr", s, "ptr")
  if (c="x64")
    DllCall("VirtualProtect", "ptr", p, "ptr", s, "uint", 0x40, "uint*", op)
  if (DllCall("crypt32\CryptStringToBinary", "str", m3, "uint", 0, "uint", e[m1], "ptr", p, "uint*", s, "ptr", 0, "ptr", 0))
    return p
  DllCall("GlobalFree", "ptr", p)
}

Beispiel: (der kompilierte startcode vom onlinegenerator)

MyFunction := MCode("2,x86:aipYww==,x64:uCoAAADD")
MsgBox, % DllCall(MyFunction, "cdecl")

Tutorial:

MCode tutorial von nnnik



IsNull
  • Moderators
  • 990 posts
  • Last active: May 15 2014 11:56 AM
  • Joined: 10 May 2007

Cool! 



ruespe
  • Members
  • 567 posts
  • Last active: Dec 01 2014 07:59 PM
  • Joined: 17 Jun 2008

Bestimmt. Versteh aber leider nur Bahnhof icon_razz.gif



IsNull
  • Moderators
  • 990 posts
  • Last active: May 15 2014 11:56 AM
  • Joined: 10 May 2007

Wie hast du eigentlich das Backend realisiert? - da würden mich Details interessieren :) Hostest du das auf einem IIS?



Bentschi
  • Moderators
  • 120 posts
  • Last active: Sep 05 2014 02:12 AM
  • Joined: 26 Nov 2008

Nein, das ist mein Computer auf dem ich arbeite.

Der läuft ja ohnehin 24/7, also hab ich einfach eine DynDNS dafür eingerichtet.

Da ist XAMPP drauf.

Der Generator ruft per PHP einen kompilierten AHK-Generator auf (Kommandozeile).

 

Der Code der drauf läuft kannst du dir in unkompilierter Form ansehen:

http://bentschi.no-i...e/mcodegen2.ahk

bzw Kompiliert:

http://bentschi.no-i...e/mcodegen2.exe

 

Da es mir selbst probleme bereitet hat VC++ so zu installieren, dass auch x64 korrekt kompiliert wird, bin ich auf die Idee mit dem Onlinegenerator gekommen.

 

Edit: Kleine Änderung:

Der Generator hat jetzt eine Zeilennummerierung und <windows.h> wird inkludiert.



lasso
  • Members
  • 111 posts
  • Last active: May 19 2013 04:19 PM
  • Joined: 02 Nov 2012

hmm irgendwie tut sich nix

oder hab ich was übersehen

/*
int   stringlen(
char  *str     ){
  register char *n;
  for(n = str;*n;++n);
  return (int)(n-str);
}
*/
#include <MCode.lib>

stringlen := MCode("
(LTrim Join
1,x86:8b4c24048bc180390074064080380075fa2bc1c3,x64:803900488bc1740848ffc080380075f8482bc1c3
)")

VarSetCapacity(string,200)
StrPut(A_ScriptDir "\" A_ScriptName,&string,200,"CP0")
msgbox, % DllCall(stringlen,ptr,&string,"cdecl")
exitapp


Bentschi
  • Moderators
  • 120 posts
  • Last active: Sep 05 2014 02:12 AM
  • Joined: 26 Nov 2008

Versuch mal...

/*
int stringlen(char *str)
{
  int i=0;
  for (; str[i]!=0; i++);
  return i;
}
*/
stringlen := MCode("2,x86:i0wkBDPAOAF0B0CAPAgAdfnD,x64:M8A4AXQKSP/B/8CAOQB19vPD")
MsgBox, % DllCall(stringlen, "astr", "test")

...das funktioniert bei mir.

 

Allerdings ist ein DllCall meistens langsamer, als direkt mit AHK zu berechnen oder AHK-Funktionen zu verwenden.

In diesem Fall würde ich auf jeden Fall StrLen, und keinen MCode empfehlen.



lasso
  • Members
  • 111 posts
  • Last active: May 19 2013 04:19 PM
  • Joined: 02 Nov 2012

würde ich auch denken das der dllcall langsamer ist

war ja nur zum testen smile.png

meine c-funktion ist aber ok so

mit base64 encoding funktioniet es icon_mrgreen.gif

 

obergeile icon_idea.gif  von dir icon_wink.gif



Bentschi
  • Moderators
  • 120 posts
  • Last active: Sep 05 2014 02:12 AM
  • Joined: 26 Nov 2008

Komisch...

Bei mir funktioniert Base64 und HEX problemlos.

Base64 wird ja eigentlich auch aus dem HEX-String konvertiert.

HEX bleibt unverändert (so wie es ausgelesen wird).

Also wenn bei dir bei HEX schon probleme auftreten, warum dann nicht erst recht bei Base64?

Base64 hab ich übrigens hinzugefügt, da man sich damit etwa 1/3 an bytes sparen kann.



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012
Grossartige Arbeit....

Visit the new forum ahkscript.org.

http://ahkscript.org


Alibaba
  • Members
  • 435 posts
  • Last active: Nov 19 2014 04:21 PM
  • Joined: 01 Nov 2012

Cool, das ist echt mal was neues... :)

Und schön zu sehen, dass es noch kostenlose DNS-Dienste gibt, dyndns.org hat das ja nun schon lange abgeschafft...


Find the recent autohotkey version here: ahkscript.org


Bentschi
  • Moderators
  • 120 posts
  • Last active: Sep 05 2014 02:12 AM
  • Joined: 26 Nov 2008

Update:

- Parse-fehler im Generator behoben (danke an guest3456 und Lexicos)

- Optimization "None" und "Default" im Generator hinzugefügt



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Mir ist da grad etwas aufgefallen.

Man soll ja auch mehrere Funktionen auf einmal in MCode verwandeln können oder?

Muss der Code der auf deinem Rechner ausgeführt wird nicht so sein:

  FileRead, code, % v
  f := {} 
 while (RegExMatch(code, "ms)_?([^\s]+?)\s+PROC\s*(.*?)\s*[^\s]+\s*ENDP(.*)", m))
  {
    f.name := regexreplace(m1, "\?(.*?)@@.*", "$1")
    f.code := regexreplace(regexreplace(m2, "m)^[^\t]*\t([^\t\r\n]+)[^\r\n]*", "$1"), "\s+")
    log .= "Extract function: " f.name " [" k "] [" (strlen(f.code)//2) " bytes]`r`n"
    if (opt.enc!=1)
    {
      binlength := StringToBinary(4, f.code, bin)
      if (opt.enc=2)
        f.code := BinaryToString(1, &bin, binlength)
	}
	functions[f.name, k] := f.code
    code := m3
  }
out := ""
width := 100

anstatt:

  FileRead, code, % v
  f := {}
  while (RegExMatch(code, "ms)_?([^\s]+?)\s+PROC\s*(.*?)\s*[^\s]+\s*ENDP(.*)", m))
  {
    f.name := regexreplace(m1, "\?(.*?)@@.*", "$1")
    f.code := regexreplace(regexreplace(m2, "m)^[^\t]*\t([^\t\r\n]+)[^\r\n]*", "$1"), "\s+")
    log .= "Extract function: " f.name " [" k "] [" (strlen(f.code)//2) " bytes]`r`n"
    if (opt.enc!=1)
    {
      binlength := StringToBinary(4, f.code, bin)
      if (opt.enc=2)
        f.code := BinaryToString(1, &bin, binlength)
    }
    code := m3
  }
  functions[f.name, k] := f.code
}
out := ""
width := 100

?


Visit the new forum ahkscript.org.

http://ahkscript.org


Bentschi
  • Moderators
  • 120 posts
  • Last active: Sep 05 2014 02:12 AM
  • Joined: 26 Nov 2008

ja, da hast du recht shy.png



Bentschi
  • Moderators
  • 120 posts
  • Last active: Sep 05 2014 02:12 AM
  • Joined: 26 Nov 2008

Sollte jemand in lezter Zeit den Onlinegenerator verwendet haben, wird derjenige vermutlich enttäuscht gewesen sein.

Ich hatte meinen Computer neu aufgesezt, da dieser jetzt eine SSD verwendet.

Allerdings hab ich VC nicht korrekt installiert, so dass der Generator nicht funktionierte.

Das Problem ist mitlerweile behoben, und der Generator kann wieder verwendet werden.