elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [PoC] kPreprocessor - Capa extra de preprocesado Python en Visual Studio
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [PoC] kPreprocessor - Capa extra de preprocesado Python en Visual Studio  (Leído 1,822 veces)
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
[PoC] kPreprocessor - Capa extra de preprocesado Python en Visual Studio
« en: 12 Mayo 2013, 21:12 pm »

Se trata de una capa extra de preprocesado que se ejecuta antes que la propia del lenguaje. La utilidad principal es generar constantes complejas en tiempo de compilación. Yo lo uso, entre otras cosas, para el cifrado de cadenas en mis proyectos malignos 8) Es mucho más flexible que los templates de C++


Necesitarás Python.

Para instalarla en tu proyecto debes de editar el fichero de proyecto (.vcxproj en el caso de VC) añadiendo este código XML:
Código
  1.  <Import Project="C:\Users\Karcrack\Desktop\kPreprocessor\kPreprocessor.targets" />
Obviamente la ruta hay que cambiarla para que apunte al fichero .targets que aquí adjunto:
Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" TreatAsLocalProperty="OutDir">
  3.    <Target Name="kPreprocessor" BeforeTargets="CLCompile">
  4.        <Exec Command='python "C:\Users\Karcrack\Desktop\kPreprocessor\kPreprocessor.py" %(CLInclude.FullPath) %(CLCompile.FullPath)' />
  5.    </Target>
  6.    <Target Name="kCleanPreProc" AfterTargets="Link">
  7.        <Exec Command='python "C:\Users\Karcrack\Desktop\kPreprocessor\kPreprocessor.py" -clean' />
  8.    </Target>
  9. </Project>
En este fichero hay que cambiar las rutas para que apunten a este fichero .py:
Código
  1. # -*- coding: utf8 -*-
  2. from sys import argv
  3. from shutil import copyfile
  4. import os, re
  5.  
  6. def save2dump(s):
  7.    f = open("./dump","a")
  8.    f.write(s)
  9.    f.close()
  10.  
  11. if __name__ == "__main__":
  12.    if argv[1] == "-clean":
  13.        print "[kP] Limpiando y restaurando ficheros."
  14.  
  15.        for file_name in os.listdir("./"):
  16.            root, ext = os.path.splitext(file_name)
  17.            if ext == ".kbak":
  18.                os.remove(os.path.join("./", root))
  19.                os.rename(os.path.join("./", file_name), os.path.join("./", root))
  20.  
  21.        os.remove("./dump")
  22.    else:
  23.        file_path = argv[1]
  24.        print "[kP] Trabajando sobre el fichero '%s'" % (file_path)
  25.        #Backup
  26.        copyfile(file_path, file_path+".kbak")
  27.        #Read SRC
  28.        with open(file_path, "r") as r:
  29.            raw = r.read()
  30.        #INCLUDE_PYSRC()
  31.        for i in re.findall("(?<=INCLUDE_PYSRC\()(.*?)(?=\)\n)", raw, re.DOTALL):
  32.            with open(os.path.abspath(i), 'r') as fi:
  33.                save2dump(fi.read()+"\n")
  34.        #DEFINE_PYSRC()
  35.        r = re.findall("(?<=DEFINE_PYSRC\(\n)(.*?)(?=\)DEFINE_END\(\))", raw, re.DOTALL)
  36.        if len(r)>0:
  37.            save2dump(''.join(r) + "\n")
  38.        #Load src
  39.        try:
  40.            exec open("./dump", "r")
  41.        except IOError as e:
  42.            pass
  43.        #Resolve macros
  44.        for fu in re.findall("(?<=#define)(.*?)(?=\(\.\.\.\) *PYTHON_FUNCTION\(\))", raw, re.DOTALL):
  45.            raw = re.sub("("+fu+"\([^\.?].*?\)(?=[^\:]))", lambda m:str(eval(m.group(1))), raw)
  46.        #Save file
  47.        with open(file_path, "w+") as f:
  48.            f.write(raw)
  49.  



Después de la instalación podéis hacer cosas como ésta:
Header.h:
Código
  1. #ifndef PRETEST
  2. #define PRETEST
  3. #include <Windows.h>
  4. #include "../../kPreprocessor/kPreprocessor.h"
  5.  
  6. INCLUDE_PYSRC(.\test.py)
  7. DEFINE_PYSRC(
  8.  
  9. def TEST():
  10.    return 12
  11.  
  12. )DEFINE_END()
  13. #endif
Main.cpp:
Código
  1. #pragma comment(linker, "/ENTRY:main")
  2. #include "Header.h"
  3.  
  4. #define XOR_STR(...) PYTHON_FUNCTION()
  5. #define MD5(...) PYTHON_FUNCTION()
  6. #define TEST(...) PYTHON_FUNCTION()
  7.  
  8. void main(){
  9.    MessageBoxA(0, XOR_STR("karcrack", 0xFF), MD5("karcrack"), TEST( ));
  10. }
test.py:
Código:
#Glenn Maynard
def string_to_c(s, max_length = 140, unicode=False):
    ret = []

    # Try to split on whitespace, not in the middle of a word.
    split_at_space_pos = max_length - 10
    if split_at_space_pos < 10:
        split_at_space_pos = None

    position = 0
    if unicode:
        position += 1
        ret.append('L')

    ret.append('"')
    position += 1
    for c in s:
        newline = False
        if c == "\n":
            to_add = "\\\n"
            newline = True
        elif ord(c) < 32 or 0x80 <= ord(c) <= 0xff:
            to_add = "\\x%02x" % ord(c)
        elif ord(c) > 0xff:
            if not unicode:
                raise ValueError, "string contains unicode character but unicode=False"
            to_add = "\\u%04x" % ord(c)
        elif "\\\"".find(c) != -1:
            to_add = "\\%c" % c
        else:
            to_add = c

        ret.append(to_add)
        position += len(to_add)
        if newline:
            position = 0

        if split_at_space_pos is not None and position >= split_at_space_pos and " \t".find(c) != -1:
            ret.append("\\\n")
            position = 0
        elif position >= max_length:
            ret.append("\\\n")
            position = 0

    ret.append('"')

    return "".join(ret)

def XOR_STR(str, c):
    s = ""
    for x in str:
        s+= chr(ord(x)^c)

    return string_to_c(s)

def MD5(s):
    import md5
    return string_to_c(md5.new(s).hexdigest())

 ;D ;D ;D ;D ;D

Hay errores en la detección de tokens ya que se hace con expresiones regulares algo chapuzas :-X

Todavía sigo trabajando en esto, así que seguid atentos para mejoras y arreglo de errores... y una explicación más elaborada en cuanto tenga tiempo xD

Nota: No se expandirán macros originales (C/C++ es en ejemplo) en la llamada a funciones. [Debido al diseño, no será reparado]

Saludos :-*


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines