Kompresja aplikacji .NET

.netshrink v2.2

.netshrink to kompresor (tzw. exe-packer) aplikacji .NET-owych, wykorzystujący kompresję LZMA, DLL binder pozwalający scalić aplikację oraz jej dodatkowe moduły DLL do jednego pliku EXE, .netshrink pozwala także na ochronę aplikacji na hasło przed uruchomieniem.

W zaktualizowanej wersji poprawione zostało uruchamianie skompresowanych aplikacji ze ścieżek UNC (zasoby sieciowe) z linii komend i zachowywanie oryginalnej architektury CPU dla skompresowanych plików.

Strona domowa:
https://www.pelock.com/products/netshrink

Wersje demonstracyjną można ściągnąć z:

Setup:
https://www.pelock.com/download/netshrink.exe (701 kB)

Archiwum zip:
https://www.pelock.com/download/netshrink.exe (415 kB)

DataHASP

DataHASP to system szyfrowania dowolnych plików aplikacji, dzięki któremu oryginalna treść takich zaszyfrowanych plików widoczna jest jedynie dla aplikacji, które zostały zabezpieczone przez Sentinel HASP Envelope (exe-protector HASPa).

HASP pozwala na szyfrowanie pojedynczych plików jak i całych katalogów z danymi aplikacji poprzez dodatkowe narzędzie:

W samym envelope określa się rodzaj plików, które zostały zaszyfrowane:

Zaszyfrowane pliki aplikacji może odczytać jedynie zabezpieczona aplikacja, realizowane jest to poprzez system hooków na funkcje systemu plików na poziomie usera.

Jeśli aplikacja zostanie rozpakowana, dostęp do oryginalnej treści zaszyfrowanych plików będzie niemożliwy (brakuje tych hooków, które w locie deszyfrują dane).

Jak uzyskać zatem dostęp do oryginalnej treści zaszyfrowanych plików?

Należy do działającej i zabezpieczonej aplikacji wstrzyknąć kod, który wykorzysta jej funkcje systemu plików (na które nałożone są hooki HASPa) i po prostu zaemulować czytanie wybranych plików.

Najprościej można to zrealizować poprzez skrypt ODBScript:

; wolna przestrzen po sekcji kodu
	mov	dump_hasp,008864D5

	mov	eip,dump_hasp
	asmtxt	eip,"dumper.asm"

; alokuj 2 bufory na nazwe pliku wyjsciowego i wejsciowego
	alloc	512
	mov	input_file,$RESULT
	alloc	512
	mov	output_file,$RESULT

; zrzuc 1 plik
	mov	x, "C:\PATH\APP\DATA.DAT"
	call	dump_file

; zrzuc 2 plik
	mov	x, "C:\PATH\APP\CONFIG.DAT"
	call	dump_file

	ret

; funkcja do zrzucania zaszyfrowanych plikow
dump_file:

	fill	input_file, 512, 0
	mov	[input_file], x

; plik wyjsciowy bedzie posiadal rozszerzenie .x
	add	x, ".X"
	fill	output_file, 512, 0
	mov	[output_file],x

; ESI -> sciezka pliku wejsciowego
; EDI -> sciezka pliku wyjsciowego
	mov	esi,input_file
	mov	edi,output_file

; ustaw EIP na adres procedury dumpujacej
	mov	eip,dump_hasp

; exec ... ende za chiny nie dziala u mnie... inaczej bym tu dal call dump_hasp?
; uruchom kod z biezacego EIP do napotkania instrukcji RET
	rtr ;run to return

	mov	x, ""

	ret

Pomocniczy kod w assemblerze dla skryptu:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; odczytaj plik wejsciowy
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; zapamietaj na stosie nazwe pliku wyjsciowego
	push	edi

; otworz plik wejsciowy
	push	0				; hTemplate
	push	0				; attribs
	push	3 ;OPEN_EXISTING		; creation
	push	0				; security
	push	1				; share mode
	push	80000000 ;GENERIC_READ
	push	esi				; lpFileName
	call	[0800004] ;CreateFileA
	mov	ebx,eax

	push	0
	push	ebx				; hFile
	call	[0800008] ;GetFileSize
	mov	edi,eax

; zaalokuj pamiec do odczytania danych pliku wejsciowego
	push	4 ;PAGE_READWRITE
	push	3000 ;MEM_RESERVE or MEM_COMMIT
	push	edi				; size
	push	0
	call	VirtualAlloc
	mov	esi,eax
	
; czytaj plik wejsciowy korzystajac z hookowanych API
	push	0
	mov	eax,esp

	push	0				; dwOverlapped
	push	eax				; &dwRead
	push	edi				; dwSize
	push	esi				; lpBuffer
	push	ebx				; hFile
	call	[0800024] ;adres funkcji ReadFile w zabezpieczonym pliku

	pop	edx

; zamknij plik wejsciowy
	push	ebx
	call	[0800088] ;CloseHandle

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; zapisz plik wyjsciowy
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; zdejmij ze stosu nazwe pliku wyjsciowego (odszyfrowany)
	pop	eax

	push	0				; hTemplate
	push	0				; attribs
	push	2 ;CREATE_ALWAYS		; creation
	push	0				; security
	push	0				; share mode
	push	40000000 ;GENERIC_WRITE
	push	eax				; lpFileName
	call	CreateFileA
	mov	ebx,eax

; zapisz odczytana tresc pliku wejsciowego
	push	0
	mov	eax,esp

	push	0				; overlapped
	push	eax				; &dwWritten
	push	edi				; size
	push	esi				; buffer
	push	ebx
	call	WriteFile

	pop	edx

; zamknij plik wyjsciowy
	push	ebx
	call	CloseHandle

; zwolnij pamiec
	push	8000 ;MEM_RELEASE
	push	0
	push	esi
	call	VirtualFree

	ret

Przedstawiona technika pozwala z łatwością odczytać wszystkie zaszyfrowane pliki.

Hakin9 Magazine

Uwaga!

Software Press – chce mnie pozwać za ten artykuł!

Magazyn Hakin9

Miałem tego nie pisać, bo już dawno o nich pisałem, ale ci idioci tak mnie denerwują ciągle nadsyłanymi mailami z prośbą o artykuł (nie rozumieją słowa NIE), że piszę ten tekst na ich własne życzenie.

Software Press

Hakin9 wydawany jest przez Software Press, dawniej Software Wydawnictwo, które prawdopodobnie zmieniło nazwę (jak się dowiedziałem z nadesłanej groźby od ich radcy prawnego jednak nie zmieniło nazwy) po fali negatywnych komentarzy od autorów artykułów, których regularnie robili w bambuko zwlekając po pół roku z wypłatami.

Nowy model biznesowy

Jakiś genialny mózg w tym wydawnictwie wpadł na pomysł, że zamiast wydawać pismo na papierze i tracić setki tysięcy złotych na drukarnie, łatwiej będzie wydawać magazyn w formie PDF, oszczędzając na kosztach przy czym zarabiać pieniądze na reklamach.

Zapewne ten sam geniusz marketingowy po jakimś polskim harvardzie biznesowym ala sieć studiów WSB, które sam miałem nieprzyjemność kończyć wpadł na pomysł, żeby jeszcze zaoszczędzić i NIC NIE PŁACIĆ AUTOROM.

O ich nowym modelu biznesowym napisał tonid, były redaktor naczelny pisma na reddicie:

http://www.reddit.com/r/netsec/comments/10xvgt/hakin9_spam_kings_please_stop_supporting_these/c6hyx18

Spam, spam, spam

W związku z taką polityką, większość autorów odwróciła się od tego wydawnictwa, bo skoro oni zarabiają, a autor dostaje jedynie „możliwość autopromocji”  to każdy szanujący się człowiek wystawi na takie coś środkowy palec.

W związku z wypięciem się większość autorów, kolejni redaktorzy tegoż „szacownego” magazynu zaczęli masowo spamować wszystkie grupy informaytczne na GoldenLine oraz innych portalach informatycznych w poszukiwaniu naiwnych młodych, którzy za możliwość autopromocji mogą łaskawie napisać dla nich artykuł. Trwa to regularnie i kolejni redaktorzy są regularnie banowani z tych portali, ot taka masówka 🙂

Dostałem maila parę dni temu, w którym po angielsku, kolejna edytorka (mimo, że pisałem do nich, żeby mojego maila wykreślili ze swoich list!!!) zaoferowała mi (i kilku moim znajomym) napisanie artykułu, cytuję:

Dear Editor,

I work for Hakin9 magazine and I’ve decided to make You an offer. I would like to propose You to write an article for our magazine. Our issue is entitled: Mobile Platforms Security. I think that you can contribute relevant materials for our magazine.

Hakin9 is a weekly magazine completly focused to IT security. It has 4 different editions every month.

Here are some details concern our cooperation: for your article composed of 3500 with graphics, pictures we offer You:

– An advertisement in our magazine

– Free access to the edition containing your article

– Possibility of self-promotion through Hakin9

– An opportunity to reach out 100 000 IT security professionals,
who are our readers

– Plus if you write more than 1 article we give You an annual
magazine subscription

We cooperate with many important partners , specialists from all over the world, who are advertising on our website. We can offer You the same interesting options for Your own promotion, like large banners, posts on our website or full page advertisement.

We are a famous magazine with 60 000avg.impressions per month. For more details please visit our website: www.hakin9.org and let me know if You are interested in contributing. We will discuss more details.

We need Your article to be written within 2 weeks.

Best regards,

Ewa Sladkowska

[email protected]

Ile zarabia Hakin9 na twoim artykule

Same opportunity i zero zysków :), czyż można się temu oprzeć! Jednak zaciekawiło mnie coś innego, otóż fakt, że oferują darmową reklamę, mmm pomyślałem sobie, że taka reklama na całą stronę byłaby fajną formą zapłaty, w związku z czym odpisałem pani Ewie, czy w zamian za artykuł otrzymam reklamę na całą stronę, oto co mi odpisała:

Hello, here is the list what we can provide you:

– Large banner on the hakin9 website (in rotation with Security University) space will be available since end of March 2012 (size of the banner is 213×303 milimeters)

– dedicated e-mail blast to our mailing base (in our mailing base now is around 100,000 people. be advice that those are not some random people. Our mailing base is build only from high skilled IT security specialists and IT security enthusiasts)

– post in our newsletter (post with the logo of the company will be send in our regular newsletter which is being send every two weeks, to the same mailing base as e-mail blasts)

– posts on our website regarding your offer. at this time we are placing such post in notice board but if you require we can create job offer section where we will place your offer.

– full page advertisements in our magazines (at December 7th we will become weekly magazine)

Normal prices for those services are:

– large banner in rotation $750 per month

– dedicated e-mail blast $1000 (per one blast, you pay 1 cent per on record from our base)

– post in regular newsletter $750

– post on H9 website $500 per month

– full page $1600 per four adverts. (1 in every issue, 4 per month)

If you decide to purchase the campaign I will give you a discount for every service. If you decide for one year campaign, it will cost 3000$.

So please provide me detailed info about in how many months you are interested, and the number of e-mail blast and newsletter post you are looking for.

I hope we will work out the deal that will please both parties.

I teraz mam wątpliwości, czy mówiąc, że oferują reklamę, chodziło o reklamę samego siebie (ta autopromocja) 🙂 czy też chodziło, że dostanę całą stronę reklamową dla siebie (gdzie normalnie reklama kosztuje 1600 USD)?
W każdym razie możecie zobaczyć jakie są ceny reklam w tym magazynie. Wątpliwości zostały rozwiane:
W zamian za artykul otrzymsz baner o wielkosci 120x60pixels, umieszczony w zakladce „Partners”. Czy jestes nadal zainteresowany nasza oferta?
Oczywiście, mam nawet dla was baner przygotowany:

Mój środkowy palec będzie na zawsze waszym partnerem!

Gratulacje dla Hakin9

Wow! Gratuluję pomysłów i polityki, dzięki którym zraziliście do siebie większość polskich utalentowanych autorów, którzy stanowili  o jakości tego typu magazynów, a którzy dla was nie napiszą już nawet słowa, chyba że kondolencji po waszym upadku, czego ja sam nie mogę się doczekać.

PS. Nie piszcie do mnie więcej o artykuł!

.netshrink v2.1 – kompresor i DLL binder dla aplikacji .NET

.netshrink v2.1

Właśnie ukazała się nowa wersja mojego małego narzędzia do kompresji aplikacji .NET.

.netshrink to kompresor (tzw. exe-packer)  aplikacji .NET-owych, wykorzystujący kompresję LZMA.

DLL Binder

W nowej wersji została dodana opcja dołączania bibliotek dynamicznych DLL do aplikacji, dzięki czemu można swoją aplikację i jej pomocnicze biblioteki skompresować do pojedynczego pliku wykonywalnego.

Wykrywanie narzędzi do łamania aplikacji

Zaktualizowana wersja pozwala również skompresowanym aplikacjom na wykrywanie popularnych narzędzi do łamania i rozpakowywania oprogramowania poprzez stałe monitorowanie systemu na ich obecność, w razie ich wykrycia, skompresowana aplikacja zostanie zamknięta.

Ochrona na hasło

.netshrink pozwala także na zaszyfrowanie aplikacji hasłem, bez poprawnego hasła nie można uruchomić skompresowanej aplikacji. Zabezpieczenie na hasło wykorzystuje weryfikację bazującą na funkcji skrótu SHA256 i szyfrowanie danych algorytmem AES / Rijndael z kluczem 256 bitowym bazującym na wartości hash z hasła.

.netshrink kompresor i DLL binder dla aplikacji .NET

Nowości obejmują także:

  • tworzenie kopii zapasowej kompresowanych aplikacji
  • tworzenie skryptu wsadowego .BAT pozwalającego na szybkie przywrócenie oryginalnego pliku z kopii zapasowej
  • zachowywanie oryginalnych atrybutów kompresowanego assembly (nazwa aplikacji, dane firmy etc.)

Strona domowa:
https://www.pelock.com/products/netshrink

Wersje demonstracyjną można ściągnąć z:

Setup:
https://www.pelock.com/download/netshrink.exe (692 kB)

Archiwum zip:
https://www.pelock.com/download/netshrink.exe (405 kB)

Patcher dla C#

Czekałem na koniec świata, ale jakoś go nie było, tymczasem mała klasa w C# do patchowania plików z paroma przydatnymi opcjami jak np. patchowanie stringow Delphi.

using System;
////////////////////////////////////////////////////////////////////////////////
//
// Simple C# Patcher Class for Windows (Complex)
//
// You can patch:
//
// - byte arrays
// - single bytes
// - integers
// - strings
// - delphi strings
//
// Language : C#
// Author   : Bartosz Wójcik
// Website  : https://www.pelock.com
//
////////////////////////////////////////////////////////////////////////////////

using System;
using System.IO;
using System.Collections.Generic;
using System.Text;

namespace NetPatcher
{
    class Patcher
    {
        public FileStream inputFile;

        public Patcher()
        {
        }

        ~Patcher()
        {
            CloseFile();
        }

        public bool OpenFile(string filePath)
        {
            try
            {
                inputFile = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite);

                return inputFile == null ? false : true;
            }
            catch (Exception e)
            {
                return false;
            }

            return false;
        }

        public void CloseFile()
        {
            if (inputFile != null)
            {
                inputFile.Close();
            }

            inputFile = null;
        }

        public long PatchArray(long fileOffset, byte[] patchBytes)
        {
            inputFile.Seek(fileOffset, SeekOrigin.Begin);
            inputFile.Write(patchBytes, 0, patchBytes.Length);

            return inputFile.Position;
        }

        public long PatchByte(long fileOffset, byte patchByte)
        {
            inputFile.Seek(fileOffset, SeekOrigin.Begin);
            inputFile.WriteByte(patchByte);

            return inputFile.Position;
        }

        public long PatchString(long fileOffset, string patchString)
        {
            System.Text.Encoding asciiEncoding = System.Text.Encoding.ASCII;
            byte[] encodedPatchString = asciiEncoding.GetBytes(patchString);

            return PatchArray(fileOffset, encodedPatchString);
        }

        public long PatchDelphiString(long fileOffset, string patchString)
        {
            System.Text.Encoding asciiEncoding = System.Text.Encoding.GetEncoding(1250);
            
            byte[] encodedPatchString = asciiEncoding.GetBytes(patchString);

            PatchByte(fileOffset, (byte)encodedPatchString.Length);
            PatchArray(fileOffset + 1, encodedPatchString);

            return inputFile.Position;
        }

        public long PatchInt32(long fileOffset, Int32 patchInt32)
        {
            byte[] encodedInt32 = BitConverter.GetBytes(patchInt32);
            PatchArray(fileOffset, encodedInt32);

            return inputFile.Position;
        }

        public long PatchFill(long fileOffset, long Length, byte patchByteFill)
        {
            while (Length-- != 0)
            {
                PatchByte(fileOffset++, patchByteFill);
            }

            return inputFile.Position;
        }

    }
}

Źródła dostępne także na https://github.com/PELock/Simple-DotNet-Patcher-Class