Program za enkripciju "u letu"

poruka: 7
|
čitano: 2.764
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
Program za enkripciju "u letu"

Znate kako imate one programe kojima date neku vrjednost i oni skeniraju ram dodjeljen nekom programu u potrazi za adresom koja drži tu vrijednost. Kada dobijete tu adresu onda možete je mjenjati. Ja sam želio napraviti neki način da se od toga zaštitim. Evo ga:

 

http://www.box.com/s/sgktymysnbi1gnps9ipt

 

To je konzolni program i lib za enkripciju. Taj lib ima jednu klasu koja čuva jedan enkriptiran int. Dakle vi njemu prosljedite int i on ga enkriptira, te ima metodu get koja ga vraća nazad u prvobitno stanje, ali ne mjenja taj enkriptirani int. Dakle jedino kad možeš pronaći taj int u svojoj normalnoj formi je prilikom inicijalizacije i izvršavanju linije u kojoj se poziva get metoda. I ako znaš algoritam. Ja sam umetnuo neki glupo jednostavni, samo za test.

 

I šta mislite, bili to upalilo?

Moj PC  
0 0 hvala 0
17 godina
protjeran
offline
Program za enkripciju "u letu"

Na žalost samo si označio dio memorije da sadrži nekakav tajni podatak. Ipak se pokušaj cijeni.

Stvar je u načinu kako manged heap i garbage collector radi. U native heapu bi to moglo proći kod neiskusnijih hakera/crackera. Al ne u managed heapu. Taj se podatak bez problema može pronaći. Nemam kod sebe stroj s Visual Studiom da buildam solution. Pa ću sutra postati mali tutorial kako se taj podatak može pronaći i dešifrirati.

Za takve stvari proući http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx i Windows Data Protection API (DPAPI)

Programko http://programko.bloger.hr
 
2 0 hvala 1
15 godina
neaktivan
offline
Re: Program za enkripciju "u letu"
Programko kaže...

Na žalost samo si označio dio memorije da sadrži nekakav tajni podatak. Ipak se pokušaj cijeni.

Stvar je u načinu kako manged heap i garbage collector radi. U native heapu bi to moglo proći kod neiskusnijih hakera/crackera. Al ne u managed heapu. Taj se podatak bez problema može pronaći. Nemam kod sebe stroj s Visual Studiom da buildam solution. Pa ću sutra postati mali tutorial kako se taj podatak može pronaći i dešifrirati.

Za takve stvari proući  http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx  i  Windows Data Protection API (DPAPI)

 

Dobro, dobro, to je bio onako malo "pucanj u prazno". Da se nemučim stim. Nisam trenutno voljan uložiti ni najmanju količinu truda u učenje toga, ako nekad bude bilo zgodno, proučit ću.

17 godina
protjeran
offline
Program za enkripciju "u letu"

A čuj ideja je Ok, samo treba promjeniti algoritam za enkripciju, i konstruktoru slati već kriptirani podatak. Dio memorije oznaćiti kao read only. napraviti tip podatka koji se nasljeđuje is stringa, a ne iz int, jer int nema neku korist. Možda još par detalja pa da imaš vlastitu verziju secureStringa.

Programko http://programko.bloger.hr
 
0 0 hvala 1
17 godina
protjeran
offline
Program za enkripciju "u letu"

Evo mali tutorial kako se može doći u .NET-u do enkriptiranog podatka.

Dakle da bi mogao vidjeti što CLR radi u pozadini treba nam Visual Studio Professional ili jača verzija. Ili WinDBG. I nešto što se zove SOS extenzija, to nam služi da možemo pratiti kako .NET radi "ispod hube" WinDBG je GUI za najmočniji Microsoftov debugger. Kako sam vidio da koristiš Express verziju koristit ću WinDBG.

WinDBG dolazi s Debugging Tools for Windows. Prije svega sam malo pogledao kod dotnetPeekom, to sam mogao napraviti i s ILDASM ili ILSPY-om.

Dakle. pokrene se WinDBG i otvorimo Enkriptiraj.exe file. I Unosimo komande

 

 

 

Microsoft (R) Windows Debugger Version 6.12.0002.633 X86

Copyright (c) Microsoft Corporation. All rights reserved.

 

CommandLine: D:\Temp\Enkripcija\Enkripcija\bin\Debug\Enkripcija.exe

Symbol search path is: *** Invalid ***

****************************************************************************

* Symbol loading may be unreliable without a symbol search path.       *

* Use .symfix to have the debugger choose a symbol path.           *

* After setting your symbol path, use .reload to refresh symbol locations. *

****************************************************************************

Executable search path is: 

ModLoad: 01370000 01378000   Enkripcija.exe

ModLoad: 77bc0000 77cfd000   ntdll.dll

ModLoad: 717e0000 7182a000   C:\Windows\SYSTEM32\MSCOREE.DLL

ModLoad: 76200000 762d4000   C:\Windows\system32\KERNEL32.dll

ModLoad: 75e60000 75eaa000   C:\Windows\system32\KERNELBASE.dll

(10f4.abc): Break instruction exception - code 80000003 (first chance)

eax=00000000 ebx=00000000 ecx=002bf764 edx=77c06344 esi=fffffffe edi=00000000

eip=77c5ebbe esp=002bf780 ebp=002bf7ac iopl=0      nv up ei pl zr na pe nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000        efl=00000246

*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll - 

ntdll!LdrVerifyImageMatchesChecksum+0x633:

77c5ebbe cc        int    3

0:000> .symfix // Ovo služi da bi podesili path za simbole na MS Symbol server

0:000> .reload // Ova naredba učitava simbole za module koji su več učitani

Reloading current modules

.....

0:000> sxe ld clrjit // zaustavi izvršavanje kada se učita modul clrjit - Služi da možemo s SOSom postaviti break point

0:000> g // Nastavi izvršavanje

(10f4.abc): Unknown exception - code 04242420 (first chance)

ModLoad: 6be70000 6bed0000   C:\Windows\Microsoft.NET\Framework\v4.0.30319\clrjit.dll

eax=ffffffff ebx=00000000 ecx=00000000 edx=5cc3ac88 esi=7ffdf000 edi=002be63c

eip=77c06344 esp=002be554 ebp=002be5a8 iopl=0      nv up ei pl zr na pe nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000        efl=00000246

ntdll!KiFastSystemCallRet:

77c06344 c3        ret

0:000> .loadby sos.dll clr // Učitaj sos iz foldera gdje se nalazi clr. U Frameworku 2.0 umjesto clr upiše se mscorwrk

0:000> !bpmd Enkripcija.exe Enkripcija.Program.Main // Postavi breakpoint na Main funkciju

Found 1 methods in module 00152e9c...

MethodDesc = 001537f0

Adding pending breakpoints...

0:000> g // Nastavi izvršavanje dok se ne dođe do prvog breakpointa

(10f4.abc): CLR notification exception - code e0444143 (first chance)

JITTED Enkripcija!Enkripcija.Program.Main(System.String[])

Setting breakpoint: bp 00640070 [Enkripcija.Program.Main(System.String[])]

Breakpoint 0 hit

eax=001537f0 ebx=00000000 ecx=01f8b3b0 edx=002bf110 esi=003da710 edi=002bf060

eip=00640070 esp=002bf038 ebp=002bf044 iopl=0      nv up ei pl nz ac po nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000        efl=00000212

00640070 55        push   ebp

0:000> !ClrStack -a // Ispiši Stack s svim informacijama 

OS Thread Id: 0xabc (0)

Child SP IP     Call Site

002bf038 00640070 Enkripcija.Program.Main(System.String[])*** WARNING: Unable to verify checksum for Enkripcija.exe

 [C:\temp\Enkripcija\Enkripcija\Program.cs @ 12]

   PARAMETERS:

     args (<CLR reg>) = 0x01f8b3b0

   LOCALS:

     <no data>

 

002bf268 5c6521bb [GCFrame: 002bf268] 

 

 

0:000> !u 00640070 // disasemliraj kod koji se nalazi u blizini instruction pointera (IP registar)

Normal JIT generated code

Enkripcija.Program.Main(System.String[])

Begin 00640070, size 68

 

C:\temp\Enkripcija\Enkripcija\Program.cs @ 12:

>>> 00640070 55        push   ebp

00640071 8bec       mov    ebp,esp

00640073 83ec1c      sub    esp,1Ch

00640076 894dfc      mov    dword ptr [ebp-4],ecx

00640079 833d3c31150000  cmp    dword ptr ds:[15313Ch],0

00640080 7405       je    00640087

00640082 e8c0672c5c    call   clr!JIT_DbgIsJustMyCode (5c906847)

00640087 33d2       xor    edx,edx

00640089 8955e8      mov    dword ptr [ebp-18h],edx

0064008c 90        nop

 

C:\temp\Enkripcija\Enkripcija\Program.cs @ 13:

0064008d b9c03d1500    mov    ecx,153DC0h (MT: Enkripcija.Infrastracture.EnkINT)

00640092 e8891fb0ff    call   00142020 (JitHelp: CORINFO_HELP_NEWSFAST)

00640097 8945e4      mov    dword ptr [ebp-1Ch],eax

0064009a 8b4de4      mov    ecx,dword ptr [ebp-1Ch]

0064009d ba0b020000    mov    edx,20Bh

006400a2 ff15a43d1500   call   dword ptr ds:[153DA4h] (Enkripcija.Infrastracture.EnkINT..ctor(Int32), mdToken: 06000001)

006400a8 8b45e4      mov    eax,dword ptr [ebp-1Ch]

006400ab 8945e8      mov    dword ptr [ebp-18h],eax

 

C:\temp\Enkripcija\Enkripcija\Program.cs @ 14:

006400ae 8b4de8      mov    ecx,dword ptr [ebp-18h]

006400b1 3909       cmp    dword ptr [ecx],ecx

006400b3 ff15bc3d1500   call   dword ptr ds:[153DBCh] (Enkripcija.Infrastracture.EnkINT.Get(), mdToken: 06000003)

006400b9 8945f8      mov    dword ptr [ebp-8],eax

006400bc 8b4df8      mov    ecx,dword ptr [ebp-8]

*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_32\mscorlib\44dd4dc744d897fd912815d478988f16\mscorlib.ni.dll

006400bf e8f4b3a65b    call   mscorlib_ni+0x82b4b8 (5c0ab4b8) (System.Console.WriteLine(Int32), mdToken: 0600094f)

006400c4 90        nop

 

C:\temp\Enkripcija\Enkripcija\Program.cs @ 15:

006400c5 8d4dec      lea    ecx,[ebp-14h]

006400c8 ba01000000    mov    edx,1

006400cd e842a7a65b    call   mscorlib_ni+0x82a814 (5c0aa814) (System.Console.ReadKey(Boolean), mdToken: 06000932)

006400d2 90        nop

 

C:\temp\Enkripcija\Enkripcija\Program.cs @ 16:

006400d3 90        nop

006400d4 8be5       mov    esp,ebp

006400d6 5d        pop    ebp

006400d7 c3        ret

0:000> bp 006400b3  // Postavi "native" breakpoint na adresu 006400b3  (Enkripcija.Infrastracture.EnkINT.Get())

0:000> g  //Nastavi izvršavanje

Breakpoint 1 hit

eax=01f8c038 ebx=00000000 ecx=01f8c038 edx=00000a40 esi=003da710 edi=002bf060

eip=006400b3 esp=002bf018 ebp=002bf034 iopl=0      nv up ei ng nz ac pe cy

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000        efl=00000297

006400b3 ff15bc3d1500   call   dword ptr ds:[153DBCh] ds:0023:00153dbc=0015c045

0:000> !ClrStack -a // Ispiši Stack

OS Thread Id: 0xabc (0)

Child SP IP     Call Site

002bf018 006400b3 Enkripcija.Program.Main(System.String[]) [C:\temp\Enkripcija\Enkripcija\Program.cs @ 14]

   PARAMETERS:

     args (0x002bf030) = 0x01f8b3b0

   LOCALS:

     0x002bf01c = 0x01f8c038 // na ovoj adresi se nalazi EnkINT lokalna varijabla

 

002bf268 5c6521bb [GCFrame: 002bf268] 

0:000> !do 0x01f8c038 // dump objekta koji se nalazi na Heapu. Tu se nalazi enkriptirani podatak :-))

Name:     Enkripcija.Infrastracture.EnkINT

MethodTable: 00153dc0

EEClass:    00631128

Size:     12(0xc) bytes

File:     D:\Temp\Enkripcija\Enkripcija\bin\Debug\Enkripcija.Infrastracture.dll

Fields:

    MT   Field   Offset          Type VT    Attr   Value Name

5bba28f8  4000001     4      System.Int32  1 instance    2624 hiddenInt

0:000> !ClrStack -a // ponovno ispisujemo Stack

OS Thread Id: 0xabc (0)

Child SP IP     Call Site

002bf018 006400b3 Enkripcija.Program.Main(System.String[]) [C:\temp\Enkripcija\Enkripcija\Program.cs @ 14]

   PARAMETERS:

     args (0x002bf030) = 0x01f8b3b0

   LOCALS:

     0x002bf01c = 0x01f8c038 // Primjeti kako je GC sada pomakao adresu EnkINT klase

 

002bf268 5c6521bb [GCFrame: 002bf268] 

0:000> r // Ispisujem vrijednost registara procesora. Ovo mi u biti netreba

eax=01f8c038 ebx=00000000 ecx=01f8c038 edx=00000a40 esi=003da710 edi=002bf060

eip=006400b3 esp=002bf018 ebp=002bf034 iopl=0      nv up ei ng nz ac pe cy

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000        efl=00000297

006400b3 ff15bc3d1500   call   dword ptr ds:[153DBCh] ds:0023:00153dbc=0015c045

0:000> !u 006400b3 // ponovno disasembliram native kod koji je generirao CLR

Normal JIT generated code

Enkripcija.Program.Main(System.String[])

Begin 00640070, size 68

 

C:\temp\Enkripcija\Enkripcija\Program.cs @ 12:

00640070 55        push   ebp

00640071 8bec       mov    ebp,esp

00640073 83ec1c      sub    esp,1Ch

00640076 894dfc      mov    dword ptr [ebp-4],ecx

00640079 833d3c31150000  cmp    dword ptr ds:[15313Ch],0

00640080 7405       je    00640087

00640082 e8c0672c5c    call   clr!JIT_DbgIsJustMyCode (5c906847)

00640087 33d2       xor    edx,edx

00640089 8955e8      mov    dword ptr [ebp-18h],edx

0064008c 90        nop

 

C:\temp\Enkripcija\Enkripcija\Program.cs @ 13:

0064008d b9c03d1500    mov    ecx,153DC0h (MT: Enkripcija.Infrastracture.EnkINT)

00640092 e8891fb0ff    call   00142020 (JitHelp: CORINFO_HELP_NEWSFAST)

00640097 8945e4      mov    dword ptr [ebp-1Ch],eax

0064009a 8b4de4      mov    ecx,dword ptr [ebp-1Ch]

0064009d ba0b020000    mov    edx,20Bh

006400a2 ff15a43d1500   call   dword ptr ds:[153DA4h] (Enkripcija.Infrastracture.EnkINT..ctor(Int32), mdToken: 06000001)

006400a8 8b45e4      mov    eax,dword ptr [ebp-1Ch]

006400ab 8945e8      mov    dword ptr [ebp-18h],eax

 

C:\temp\Enkripcija\Enkripcija\Program.cs @ 14:

006400ae 8b4de8      mov    ecx,dword ptr [ebp-18h]

006400b1 3909       cmp    dword ptr [ecx],ecx

>>> 006400b3 ff15bc3d1500   call   dword ptr ds:[153DBCh] (Enkripcija.Infrastracture.EnkINT.Get(), mdToken: 06000003)

006400b9 8945f8      mov    dword ptr [ebp-8],eax

006400bc 8b4df8      mov    ecx,dword ptr [ebp-8]

006400bf e8f4b3a65b    call   mscorlib_ni+0x82b4b8 (5c0ab4b8) (System.Console.WriteLine(Int32), mdToken: 0600094f)

006400c4 90        nop

 

C:\temp\Enkripcija\Enkripcija\Program.cs @ 15:

006400c5 8d4dec      lea    ecx,[ebp-14h]

006400c8 ba01000000    mov    edx,1

006400cd e842a7a65b    call   mscorlib_ni+0x82a814 (5c0aa814) (System.Console.ReadKey(Boolean), mdToken: 06000932)

006400d2 90        nop

 

C:\temp\Enkripcija\Enkripcija\Program.cs @ 16:

006400d3 90        nop

006400d4 8be5       mov    esp,ebp

006400d6 5d        pop    ebp

006400d7 c3        ret

0:000> !do 0015c045

<Note: this object has an invalid CLASS field>

Invalid object

0:000> !ip2md 5c0ab4b8 // pretvaram adresu u nešto što se zove MethodDescription, niti ovo nam ne treba u ovom slučaju

MethodDesc:   5b908614

Method Name:  System.Console.WriteLine(Int32)

Class:     5b8dc724

MethodTable:  5bba7574

mdToken:    0600094f

Module:     5b881000

IsJitted:    yes

CodeAddr:    5c0ab4b8

Transparency: Transparent

0:000> !DumpHeap // Dumpam Heap. U stvarnosti se dobije dosta više podataka. Ovaj ispis sam skratio da bude jasniji. Svaki objekt na Heapu ima dodatnih 8 bytova zato se može ovako izlistati. Što je i svrha ovog posta da se pokaže kako se Heap u .NET-u može ljepo analizirati. Sa žutim je označen naša EnkINT klasa, skupa s adresom u memoriji i veličinom

 Address     MT    Size

01f81000 003aa720     12 Free

01f8100c 003aa720     12 Free

01f81018 003aa720     12 Free

01f81024 5bb9fb8c     84    

01f81078 5bb9fcd0     84      

01f8c018 5bb56ba8     32    

01f8c038 00153dc0     12    

02f81000 003aa720     16 Free

 

total 0 objects

Statistics:

    MT   Count   TotalSize Class Name

 

5bba4898     1       12 System.Security.SecurityDocument

5bba27fc     1       12 System.Collections.Generic.GenericEqualityComparer`1[[System.String, mscorlib]]

00153dc0     1       12 Enkripcija.Infrastracture.EnkINT

5bba5ec8     1       16 System.Security.Policy.Evidence+EvidenceLockHolder

 

Total 856 objects

0:000> !DumpMT -md 00153dc0     // Dumpam nešto što se zove MethodTable naše famozne EnkINT klase 

EEClass:    00631128

Module:     001538c4

Name:      Enkripcija.Infrastracture.EnkINT

mdToken:    02000002

File:      D:\Temp\Enkripcija\Enkripcija\bin\Debug\Enkripcija.Infrastracture.dll

BaseSize:     0xc

ComponentSize:   0x0

Slots in VTable: 7

Number of IFaces in IFaceMap: 0

--------------------------------------

MethodDesc Table

  Entry MethodDesc    JIT Name

5baaa7e0   5b884934   PreJIT System.Object.ToString()

5baae2e0   5b88493c   PreJIT System.Object.Equals(System.Object)

5baae1f0   5b88495c   PreJIT System.Object.GetHashCode()

5bb31600   5b884970   PreJIT System.Object.Finalize()

006400f0   00153d9c    JIT Enkripcija.Infrastracture.EnkINT..ctor(Int32)

00640140   00153da8    JIT Enkripcija.Infrastracture.EnkINT.Set(Int32)

0015c045   00153db4    NONE Enkripcija.Infrastracture.EnkINT.Get()

0:000> !DumpIL 00153da8    // Dumpam IL Enkripcija.Infrastracture.EnkINT.Set  funkcije

ilAddr = 005a206a

IL_0000: nop 

IL_0001: ldarg.1 

IL_0002: ldc.i4.1 

IL_0003: add 

IL_0004: starg.s VAR OR ARG 1

IL_0006: ldarg.1 

IL_0007: ldc.i4.5 

IL_0008: mul 

IL_0009: starg.s VAR OR ARG 1

IL_000b: ldarg.1 

IL_000c: ldc.i4.1 

IL_000d: add 

IL_000e: starg.s VAR OR ARG 1

IL_0010: ldarg.1 

IL_0011: ldc.i4.3 

IL_0012: add 

IL_0013: starg.s VAR OR ARG 1

IL_0015: ldarg.0 

IL_0016: ldarg.1 

IL_0017: stfld Enkripcija.Infrastracture.EnkINT::hiddenInt

IL_001c: ret 

0:000> !u 153DA4h

Unmanaged code

00153da4 f000640002    lock add byte ptr [eax+eax+2],ah

00153da9 0003       add    byte ptr [ebx],al

00153dab 61        popad

00153dac 0500000040    add    eax,40000000h

00153db1 01640003     add    dword ptr [eax+eax+3],esp

00153db5 0006       add    byte ptr [esi],al

00153db7 60        pushad

00153db8 06        push   es

00153db9 0000       add    byte ptr [eax],al

00153dbb 0045c0      add    byte ptr [ebp-40h],al

 

 

Programko http://programko.bloger.hr
Poruka je uređivana zadnji put pon 6.2.2012 21:59 (Programko).
 
1 0 hvala 1
15 godina
neaktivan
offline
Re: Program za enkripciju "u letu"
Programko kaže...

Evo mali tutorial kako se može doći u .NET-u do enkriptiranog podatka.

  Ti si lud :)

Rekoh, neželim sad to pokušavati napraviti. Čini se prekomplicirano.

Ali svejedno, definitivno si zaslužio "HVALA"

Poruka je uređivana zadnji put pon 6.2.2012 23:40 (F1-IVO).
17 godina
protjeran
offline
Program za enkripciju "u letu"

Ma malo sam zakržljao u nekim stvarima pa mi je ovaj tvoj primjer poslužio kao idealan poligon da se prisjetim kako koristiti WinDBG i neke egzotične tehnike. Inaće sam gore krivo napisao neke stvari{#}. To sam ostavio ako netko pokuša dešifrirati te švrljotine.

Programko http://programko.bloger.hr
 
0 0 hvala 0
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice