opcodes in bc++

Intrebari despre programarea cu VC++ incluzand mediul de dezvoltare, instalare, setari, debugger, compilator, linker si documentatie.
Post Reply
viorel2004ro
Membru
Membru
Posts: 67
Joined: 20 Mar 2008, 23:23

opcodes in bc++

Post by viorel2004ro » 20 Mar 2008, 23:46

Salut

Cum aduna 2 date de intrare(numere reale) date de utilizator folosind o functie asemanatoare ca cea de mai jos.
Codul e de pe net,dar as dori mai multe informatii despre aceasta tehnica.As dori ca testFunc sa citeasca 2 date din 2 variabile si sa faca suma lor.Un astfel de cod are aceeasi performanta ca, secventa scrisa in asm?

Code: Select all

//

#include "stdafx.h"

#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include <memory.h>
#include<string.h>

typedef int (*FuncPtr)();

// Create a function:
char testFunc[] = { 0x90,                         // NOP
                               0xB8, 0x10, 0x00, 0x00, 0x00, // MOVL $16,%eax
                               0xC3 };                       // RET
    

int main(int argc, char* argv[])
{
    // Make a copy on the heap, OS doesn't like executing the stack:
FuncPtr         testFuncPtr = (FuncPtr) malloc(7);
memmove( (void*) testFuncPtr, testFunc, 7 );
    
printf("Before function.\n");
int result = (*testFuncPtr)();
printf("Result %d\n", result);
_getch();
    return 0;
	}
O zi buna,
Ionut



neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: opcodes in bc++

Post by neagu_laurentiu » 21 Mar 2008, 08:35

Codul ala e un artificiu pentru sistemele pe 16 biti cand stiva era una si heap-ul alta. In sistemele 32 biti nu mai e la fel !
Asa ca e mai performant sa scrii direct functia aia in _asm decat sa copii de colo-colo octetii corpului functiei respective (memmove( (void*) testFuncPtr, testFunc, 7 ))...
In C/C++ compilatoarele-s atit de optimizate incat pierzi doar cateva tact-uri de procesor pentru o functie scrisa in C comparativ cu faptul sa scrii acea functie in .asm ! Pe cand intre C# si C++ sunt chiar si secunde de pierdere mai ales la prima executie cand trebuie sa compileze masina virtuala (un tact nu-i echivalent cu o secunda :D ).
Asa ca lasa-i pe cei ce scriu compilatoare sa lucreze ei in .asm iar tu ai aceeasi performanta in C/C++

viorel2004ro
Membru
Membru
Posts: 67
Joined: 20 Mar 2008, 23:23

Re: opcodes in bc++

Post by viorel2004ro » 21 Mar 2008, 09:05

codul a fost rulat si merge pe visual c++.
Ideea e ca nu prea este documentatie pe asemena subiect si as vrea sa folosesc aceasta tehnica ca protectie
a programelor.

viorel2004ro
Membru
Membru
Posts: 67
Joined: 20 Mar 2008, 23:23

Re: opcodes in bc++

Post by viorel2004ro » 21 Mar 2008, 09:08

si inca ceva

aceasta tehnica poate fi folosita in c# ptr optimizarea anumitor portiuni de cod.
Mai mult un alt avantaj ar fi acceea ca treci peste limitarile date de c# in a scrie
cod asm(nu exista un keywords _asm),deci aceasta tehnica poate fi folosita

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: opcodes in bc++

Post by neagu_laurentiu » 21 Mar 2008, 09:19

Dar nu-i o tehnica speciala... e aceeasi treaba cu o rutina in asm, doar ca dinamic scrii cod in corpul unei functii !
Are si Windows-ul API functia WriteProcessMemory care face aceeasi treaba... tot asa fac si loadere-le de exe in ram (upx, etc).
Si nu o poti aplica in C#... decat printr-un DLLImport la o functie C !

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: opcodes in bc++

Post by neagu_laurentiu » 21 Mar 2008, 09:24

Despre protectie, incarcare dinamica a unui exe si alte chestii in asm vezi aici: viewtopic.php?f=9&t=447

viorel2004ro
Membru
Membru
Posts: 67
Joined: 20 Mar 2008, 23:23

Re: opcodes in bc++

Post by viorel2004ro » 21 Mar 2008, 10:56

1.rugamintea mea este cum pot face sa citesc 2 numere si sa returnez suma lor.
vrea sa am un astfel de exemplu ca un punct de pornire.

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: opcodes in bc++

Post by neagu_laurentiu » 21 Mar 2008, 11:37

rugamintea mea este cum pot face sa citesc 2 numere si sa returnez suma lor
1. Scrii functia intr-un alt proiect .asm sau .c si-l compilezi;
2. Te uiti cu un assembler debugger (http://www.ollydbg.de/odbg110.zip) in proiectul asta nou la corpul functiei si copii codurile masina (octetii cu instructiunile) in vectorul ala din exemplul tau;
3. Cu memmove muti acei octeti in functia ta si ai ce doresti :yes:

Din ce zici tu reiese ca nu stii asm si asta vrei sa te invatam, nu C/C++ ! Eu pot sa-ti dau 2 linii in asm sa-ti fac o suma, dar mai bine e sa intelegi tu fenomentul decat sa-ti dau ceva fara logica...

Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: opcodes in bc++

Post by Viorel » 21 Mar 2008, 11:53

În Visual Studio 2005, codurile instrucţiunilor pot fi aflate prin activarea opţiunii C/C++ --> Output Files --> Assembler Output --> Assembly, Machine Code and Source (/FAcs) şi investigarea fişierelor *.cod generate.

Încearcă următoarele:

Code: Select all

typedef float (__stdcall * ptrf_aduna)(float f1, float f2);

__declspec(naked)
float __stdcall aduna(float f1, float f2)
{
    __asm
    {
        FLD     4[esp]
        FLD     8[esp]
        FADD
        RET     8
    }
}

unsigned char coduri[] = 
{
    0xd9, 0x44, 0x24, 0x04, // FLD 4[esp]
    0xd9, 0x44, 0x24, 0x08, // FLD 8[esp]
    0xde, 0xc1,             // FADD ST(1), ST(0)
    0xc2, 0x08, 0x00,       // RET 8
};

int _tmain(int argc, _TCHAR* argv[])
{
    float f1 = 1.0;
    float f2 = 2.0;

    float suma;

    unsigned char * c = new unsigned char [sizeof(coduri)];
    memcpy(c, coduri, sizeof(coduri));

    ptrf_aduna p = ptrf_aduna(c);

    suma = p(f1, f2);
    printf("%f\n", suma);

    return 0;
}
Sper să funţioneze, dar nu chiar pe orice procesor.

Post Reply