Po co jest antywirus? Po nic!

not-sure-it-is-new-discovery-or-just-false-positivePolecam te kilka historii o programach antywirusowych i ich błędnym funkcjonowaniu, w szczególności chodzi tutaj o fałszywe detekcje (z ang. false positive detection), które dręczą od lat twórców oprogramowania (niekoniecznie zaszyfrowanego).

ProtectionID i copy&paste

Jak autor ProtectionID znalazł się w tarapatach, gdy tylko jeden antywirus na VirusTotal oznaczył błędnie jego plik jako malware, a reszta antywirusów jedynie podchwyciła hash pliku i bez namysłu otagowała pliki również jako malware – analiza metodą kopiuj i wklej 😉

http://pid.gamecopyworld.com/

Tuts4You

Dyskusja na forum Tuts4You o tym w jaki sposób uniknąć oznaczenia oprogramowania jako false positive:

https://forum.tuts4you.com/topic/37417-mitigating-false-positives

at0mos

O miłości i nienawiści do AV, zwłaszcza zamulającego AV 😉

http://atom0s.com/forums/viewtopic.php?f=2&t=85

Nir

Autor popularnych narzędzi systemowych publikował swego czasu listę fałszywych detekcji, ale ze względu na ilość tego rodzaju incydentów przestał to robić. Mimo, że to starsze wpisy, warto na to zwrócić uwagę, gdyż jego oprogramowanie to „czyste” – binaria EXE, wprost z kompilatora, jego oprogramowanie jest bardzo popularne, a mimo to do dzisiaj dostaje mu się z niewiadomych przyczyn przez oprogramowanie AV.

http://www.nirsoft.net/false_positive_report.html

http://blog.nirsoft.net/2009/05/17/antivirus-companies-cause-a-big-headache-to-small-developers/

 

Po co oprogramowanie antywirusowe? Po nic!

Wyłania się z tego obraz oprogramowania, które do niczego nie jest potrzebne, zwalnia działanie komputera, a jego zasada funkcjonowania bazuje na kopiowaniu nielicznych cudzych detekcji i do tego fałszywych! Sprawę tą poruszyła również firma Kaspersky, która „wrobiła” konkurentów bezmyślnie kopiujących ich detekcje bez dodatkowej analizy:

http://www.reuters.com/article/2015/08/14/us-kaspersky-rivals-idUSKCN0QJ1CR20150814

Osobiście używałem oprogramowania antywirusowego tylko wtedy, gdy dostałem pierwszy komputer od rodziców, jednak nawet wtedy zainstalowane oprogramowanie, chyba to był F-Prot, nie uchronił mnie przed infekcją wirusa CIH. Od tamtego czasu przestałem korzystać z jakiegokolwiek oprogramowania antywirusowego i przez te wszystkie lata miałem słownie 1 infekcję poprzez autorun na jakimś USB. Nieźle jak na tak długi czas. Do dzisiaj niewiele się w tym temacie zmieniło, na co najlepszym przykładem są wirusy jak Stuxnet i Duqu, których oprogramowanie AV nie wykrywało bo ich nie znało. Tak – oprogramowanie antywirusowe musi znać wirusa, żeby poprawnie go wykrywać i usuwać skutki infekcji. Brednie o behawioralnym wykrywaniu nowych zagrożeń można wsadzić między marketingowe bajki, bo jedyne co z tego wynika to sterty false positive detections, które krzywdzą twórców normalnego oprogramowania.

Warto się zastanowić następnym razem czy instalować u siebie czy rodziny jakiekolwiek oprogramowanie antywirusowe, które nie radzi sobie z detekcją wirusów o ile konkurencja wcześniej tego nie wykryje, dodatkowo sprawiając, że komputer będzie mulił wiecznym skanowaniem w poszukiwaniu nieznanych wirusów, których i tak nie jest w stanie wykryć.

XRumer 12.0.11 i nowa reCAPTCHA od Google pokonana

Nowy XRumer, czyli oprogramowanie do masowego spamowania zyskało obsługę nowego mechanizmu reCAPTCHA od Google.

reCAPTCHA

Dzisiejszy komunikat:

New revolutionary technology make of new Google ReCaptcha defeated! Average time of recognition: 20 MILLIseconds! (0,02 sec).

Also, the program was trained to new popular types of graphical captcha, included animated GIF-captchas and Flash-captchas.

Added new Wizard to set up Project+Options+Scheduler just with one click: useful feature 😉

Mass-PM system was significantly updated. Possibility to send millions of personal messages all over the world is becoming a reality.

Significantly increased the success rate and improved work with several engines, so now software become more powerful (read more info on our tech.support forum).

Adjusted the processing of CloudFlare (applied a new mechanism of decoding of ReCaptcha)

New databases with more than 300,000 unique resources, so hurry up to use it!

Update can be downloaded from your client area on our site.

Z ciekawostek powiem, że BotmasterLabs często organizuje konkursy o spore pieniądze, których celem jest poprawienie działania mechanizmów rozpoznawania kodów CAPTCHA w Xrumerze. Ostatni konkurs odbył się we wrześniu 2014 roku i nagrodą było 15000 USD.

Jak widać cyberprzestępcy są szybko krok do przodu nawet przed takim gigantem jak Google. Zastanawiający jest fakt, pseudo-firma spamerska jest w stanie więcej zapłacić niż Google swoim inżynierom lub zorganizować konkurs na stworzenie lepszych mechanizmów.

Szyfrowanie danych, szyfrowanie plików i stringów

Kłódka szyfrowanieZaktualizowana została usługa dla programistów – StringEncrypt, która pozwala w prosty sposób zaszyfrować dowolne dane, generując za każdym razem unikalny algorytm szyfrowania oraz tworząca do tego automatycznie kod dekryptora w wybranym języku programowania.

Jak zwykle szyfrujemy dane?

Jeśli zależy nam na czymś co nie wymaga sporych zasobów procesora nie skorzystamy do tak trywialnego celu z szyfrowania np. AES (zapewne wymagana będzie jakaś zewnętrzna biblioteka szyfrująca lub implementacja).

W większości przypadków, każdy normalny programista napisze do tego celu własne oprogramowanie, które pobierze na wejściu ciąg niezakodowanych danych i zwróci zaszyfrowane dane. Dodatkowo zwróci je w formie pozwalającej zapisać dane w postaci kodu źródłowego języka programowania, w którym akurat tworzy oprogramowanie.

Jak szyfrować dane szybciej?

Usługa StringEncrypt pozwala:

  • zaoszczędzić czas na tworzenie narzędzi programistycznych
  • za każdym razem wygenerować inny algorytm szyfrujący
  • wygenerowany kod nie wymaga zewnętrznych bibliotek szyfrujących
  • można wybrać spośród wyjścia w C/C++, Delphi/Pascal, Java, JavaScript, Python, MASM/FASM, Haskell

Przykład szyfrowania danych

Przykład, chcemy np. zaszyfrować string „Szyfrowanie danych”. Jak to zrobić? Na stronie głównej StringEncrypt wystarczy wpisać nazwę dla labela oraz sam tekst do zaszyfrowania i kliknąć „Encrypt and Generate Decryptor”.

Szyfrowanie danych

Dostępnych jest kilka dodatkowych opcji jak np. wybór wyjściowego języka programowania czy sposób kodowania znaków narodowych, jeśli nasze dane takowe zawierają.

Efektem końcowym są listingi z zaszyfrowanymi danymi oraz kodem źródłowym. Przykłady tak wygenerowanych dekryptorów poniżej.

Zaszyfrowane dane oraz kod deszyfrujący w C/C++

// encrypted with www.stringencrypt.com (v1.0.0) [C/C++]
// szZaszyfrowaneDane = "Szyfrowanie danych"
wchar_t szZaszyfrowaneDane[19] = { 0xBEFE, 0xBED8, 0xBEDA, 0xBEBE, 0xBEB9, 0xBED5, 0xBEC0, 0xBEBD,
                                   0xBEB1, 0xBECF, 0xBEBE, 0xB8FC, 0xBEC7, 0xBEB3, 0xBEB7, 0xBECD,
                                   0xBEBE, 0xBEBA, 0xBF01 };
 
for (unsigned int DwvRZ = 0, sobMk = 0; DwvRZ < 19; DwvRZ++)
{
        sobMk = szZaszyfrowaneDane[DwvRZ];
        sobMk ^= 0xBCFB;
        sobMk -= DwvRZ;
        sobMk ++;
        sobMk ^= 0x0CFB;
        sobMk = ~sobMk;
        sobMk += DwvRZ;
        sobMk ^= 0x9A0E;
        sobMk += 0x4ABC;
        sobMk -= DwvRZ;
        sobMk ^= 0xB59B;
        szZaszyfrowaneDane[DwvRZ] = sobMk;
}
 
wprintf(szZaszyfrowaneDane);

Kod dekryptora w C# dla platformy .NET

// encrypted with www.stringencrypt.com (v1.0.0) [C#]
// szZaszyfrowaneDane = "Szyfrowanie danych"
String szZaszyfrowaneDane = "\u0236\u020F\u0210\u0227\u021D\u0222\u0226\u0224" +
                            "\u0239\u0220\u0224\u0279\u022B\u0220\u0231\u021C" +
                            "\u0226\u0201";
 
for (int lWdYZ = 0, AtPLU = 0; lWdYZ < 18; lWdYZ++)
{
        AtPLU = szZaszyfrowaneDane[lWdYZ];
        AtPLU ^= lWdYZ;
        AtPLU -= 0x6403;
        AtPLU ^= lWdYZ;
        AtPLU ^= 0x51FE;
        AtPLU += lWdYZ;
        AtPLU -= 0xCF7A;
        AtPLU ^= lWdYZ;
        szZaszyfrowaneDane = szZaszyfrowaneDane.Substring(0, lWdYZ) + (char)(AtPLU & 0xFFFF) + szZaszyfrowaneDane.Substring(lWdYZ + 1);
}
 
MessageBox.Show(szZaszyfrowaneDane);

Kod dekryptujący w Delphi / Pascal

// encrypted with www.stringencrypt.com (v1.0.0) [Delphi / Pascal]
var
  // szZaszyfrowaneDane = "Szyfrowanie danych"
  szZaszyfrowaneDane: array[0..19] of WideChar;
  VdaMu: Integer;
  sveIR: Integer;
 
begin
 
  szZaszyfrowaneDane[3] := WideChar($0E23); szZaszyfrowaneDane[14] := WideChar($0E36);
  szZaszyfrowaneDane[6] := WideChar($0E37); szZaszyfrowaneDane[12] := WideChar($0E1E);
  szZaszyfrowaneDane[8] := WideChar($0E34); szZaszyfrowaneDane[9] := WideChar($0E1E);
  szZaszyfrowaneDane[11] := WideChar($0DE9); szZaszyfrowaneDane[18] := WideChar($0DD0);
  szZaszyfrowaneDane[10] := WideChar($0E1D); szZaszyfrowaneDane[13] := WideChar($0E22);
  szZaszyfrowaneDane[0] := WideChar($0E11); szZaszyfrowaneDane[15] := WideChar($0E2C);
  szZaszyfrowaneDane[1] := WideChar($0E39); szZaszyfrowaneDane[16] := WideChar($0E31);
  szZaszyfrowaneDane[17] := WideChar($0E37); szZaszyfrowaneDane[7] := WideChar($0E1C);
  szZaszyfrowaneDane[5] := WideChar($0E30); szZaszyfrowaneDane[4] := WideChar($0E2C);
  szZaszyfrowaneDane[2] := WideChar($0E39);
 
  for sveIR := 0 to 19 do
  begin
    VdaMu := Ord(szZaszyfrowaneDane[sveIR]);
    VdaMu := VdaMu - sveIR;
    VdaMu := VdaMu + sveIR;
    VdaMu := VdaMu - $58FA;
    VdaMu := VdaMu xor sveIR;
    VdaMu := VdaMu + $4B3C;
    VdaMu := VdaMu + sveIR;
    VdaMu := VdaMu - sveIR;
    szZaszyfrowaneDane[sveIR] := WideChar(VdaMu);
  end;
 
  ShowMessage(szZaszyfrowaneDane);

Wyjściowy kod deszyfrujący w Java

// encrypted with www.stringencrypt.com (v1.0.0) [Java]
// szZaszyfrowaneDane = "Szyfrowanie danych"
String szZaszyfrowaneDane = "\uD9CD\uD9F4\uD9EF\uD9E0\uD9E4\uD9E7\uD9F1\uD9D5" +
                            "\uD9D8\uD9E1\uD9CB\uD986\uD9C6\uD9C9\uD9D8\uD9ED" +
                            "\uD9BD\uD9E2";
 
for (int LMSGW = 0, BZYmK = 0; LMSGW < 18; LMSGW++)
{
        BZYmK = szZaszyfrowaneDane.charAt(LMSGW);
        BZYmK += LMSGW;
        BZYmK ^= LMSGW;
        BZYmK ++;
        BZYmK ^= 0xFFFF;
        BZYmK -= LMSGW;
        BZYmK ^= 0xFFFF;
        BZYmK -= 0xD97B;
        BZYmK -= LMSGW;
        szZaszyfrowaneDane = szZaszyfrowaneDane.substring(0, LMSGW) + (char)(BZYmK & 0xFFFF) + szZaszyfrowaneDane.substring(LMSGW + 1);
}
 
System.out.println(szZaszyfrowaneDane);

Zaszyfrowane dane do wykorzystania w JavaScript (HTML)

<script type="text/javascript">
// encrypted with www.stringencrypt.com (v1.0.0) [JavaScript]
// szZaszyfrowaneDane = "Szyfrowanie danych"
var szZaszyfrowaneDane;
 
szZaszyfrowaneDane = String.fromCharCode(0x8C8D, 0x8C68, 0x8C6B, 0x8C84, 0x8C76, 0x8C7B, 0x8C75, 0x8C89,
                                         0x8C82, 0x8C99, 0x8C8F, 0x8CC2, 0x8C84, 0x8C89, 0x8C9A, 0x8C91,
                                         0x8C9D, 0x8C9A);
 
for (var UkhdQ = 0, LElnh = 0; UkhdQ < 18; UkhdQ++)
{
        LElnh = szZaszyfrowaneDane.charCodeAt(UkhdQ);
        LElnh -= UkhdQ;
        LElnh -= 0xAA95;
        LElnh -= UkhdQ;
        LElnh += UkhdQ;
        LElnh --;
        LElnh ^= UkhdQ;
        LElnh += 0x39C5;
        LElnh -= UkhdQ;
        LElnh = ~LElnh;
        LElnh += 0x1C10;
        LElnh ^= UkhdQ;
        szZaszyfrowaneDane = szZaszyfrowaneDane.substr(0, UkhdQ) + String.fromCharCode(LElnh & 0xFFFF) + szZaszyfrowaneDane.substr(UkhdQ + 1);
}
 
alert(szZaszyfrowaneDane);
</script>

Szyfrowanie danych w Pythonie nie było prostsze

# encrypted with www.stringencrypt.com (v1.0.0) [Python]
# szZaszyfrowaneDane = "Szyfrowanie danych"
szZaszyfrowaneDane = [ 0x70BA, 0x70D3, 0x70D4, 0x70C7, 0x70D9, 0x70C6, 0x70DE, 0x70CC,
                       0x70CD, 0x70D0, 0x70C8, 0x710D, 0x70CB, 0x70C8, 0x70D5, 0x70E4,
                       0x70EA, 0x70E1 ]
 
for Zmizb in range(18):
  FZBAn = szZaszyfrowaneDane[Zmizb]
  FZBAn = ~FZBAn
  FZBAn -= 0xF5C7
  FZBAn = ~FZBAn
  FZBAn -= 1
  FZBAn -= Zmizb
  FZBAn -= 0xF2E1
  FZBAn ^= 0x73CC
  FZBAn ^= Zmizb
  szZaszyfrowaneDane[Zmizb] = FZBAn
 
szZaszyfrowaneDane = ''.join(chr(FZBAn & 0xFFFF) for FZBAn in szZaszyfrowaneDane)
 
del Zmizb, FZBAn
 
print(szZaszyfrowaneDane)

Obsługiwany jest także Haskell

-- encrypted with www.stringencrypt.com (v1.0.0) [Haskell]
module Main where
 
import qualified Data.Char
import qualified Data.Bits
 
main = do
  putStrLn $ szZaszyfrowaneDane
 
-- szZaszyfrowaneDane = "Szyfrowanie danych"
szZaszyfrowaneDane = zipWith f [0..] [ 0x5604, 0x55DE, 0x55E0, 0x55F4, 0x55E1, 0x55E3, 0x55DA, 0x55F3,
                                       0x55E1, 0x55E5, 0x55FC, 0x563E, 0x55FF, 0x55F9, 0x55E7, 0x55D3,
                                       0x55E4, 0x5600 ]
  where
    f wvfax cxdne = let gpmae0 = cxdne
                        gpmae1 = gpmae0 - 1
                        gpmae2 = gpmae1 `Data.Bits.xor` wvfax
                        gpmae3 = gpmae2 - wvfax
                        gpmae4 = Data.Bits.complement gpmae3
                        gpmae5 = gpmae4 + 1
                        gpmae6 = gpmae5 - wvfax
                        gpmae7 = gpmae6 - 0xA9AA
                    in Data.Char.chr (gpmae7 Data.Bits..&. 0xFFFF)

Kod dekryptora w MASM

; encrypted with www.stringencrypt.com (v1.0.0) [MASM Assembler (32 bit)]
 
.data
 
        ; szZaszyfrowaneDane = "Szyfrowanie danych"
        szZaszyfrowaneDane dw 0C08Dh, 0C078h, 0C06Bh, 0C068h, 0C0B6h, 0C061h, 0C0B9h, 0C06Bh
                           dw 0C05Ah, 0C067h, 0C077h, 0C042h, 0C074h, 0C077h, 0C05Eh, 0C073h
                           dw 0C07Dh, 0C07Ah, 0C0D0h
 
.code
        mov     edx, offset szZaszyfrowaneDane
        mov     eax, 19
        and     ecx, 0
 
@@:
        mov     bx, word ptr [edx + ecx]
        sub     ebx, ecx
        xor     ebx, 0B1C6h
        not     ebx
        add     ebx, 028B2h
        not     ebx
        xor     ebx, 0D1D9h
        xor     ebx, ecx
        add     ebx, 056FAh
        not     ebx
        sub     ebx, 0A3ADh
        xor     ebx, 00FA0h
        add     ebx, ecx
        sub     ebx, ecx
        xor     ebx, 063EBh
        mov     word ptr [edx + ecx], bx
        inc     ecx
        dec     eax
        jne     @b
 
        push    0
        push    edx
        push    edx
        push    0
        call    MessageBoxW

Zwróćcie uwagę, że dane zostały za każdym razem zaszyfrowane inaczej, z innym zestawem instrukcji szyfrujących, dlatego każdorazowo generowany kod jest inny.

Kod nie wymaga zewnętrznych bibliotek, bazuje na podstawowych funkcjonalnościach jakie oferują obsługiwane języki programowania.

Szyfrowanie plików

StringEncrypt pozwala w równie łatwy sposób szyfrować zawartość dowolnych plików binarnych.

Szyfrowanie plików

Klient końcowy dla Windows

Szyfrowanie można przeprowadzać bezpośrednio na stronie projektu, jednak istnieje również klient dla systemu Windows, oferujący tą samą funkcjonalność:

StringEncrypt dla Windows

Web API

Usługa posiada również interfejs Web API bazujący na prostych zapytaniach POST, dostępne jest SDK w PHP, a jego wykorzystanie jest banalnie proste:

<?php
 
////////////////////////////////////////////////////////////////////////////////
//
// StringEncrypt.com Web API usage example
//
// Version        : v1.1
// Language       : PHP
// Author         : Bartosz WĂłjcik
// Web page       : https://www.stringencrypt.com
//
////////////////////////////////////////////////////////////////////////////////
 
// include main library
include ("stringencrypt.php");
 
//
// setup options
//
$options = array();
 
//
// activation code, you can leave it empty for demo version, but keep in
// mind that there are many limitations in demo version)
//
$options["code"] = "";
 
//
// API command to execute
//
// "encrypt" - encrypt input string or file bytes, returns array of:
//
// $result["error"] - error code
// $result["source"] - decryptor source code
// $result["expired"] - activation code expiration flag (bool)
// $result["credits_left"] - number of credits left
//
// "is_demo" - checks current activation code and returns array of:
//
// $result["demo"] - demo mode flag (bool)
// $result["label_limit"] - label limit length
// $result["string_limit"] - string/file limit lenght
// $result["credits_left"] - number of credits left
// $result["cmd_min"] - minimum number of encryption commands
// $result["cmd_max"] - maximum number of encryption commands
$options["command"] = "encrypt";
//$options["command"] = "is_demo";
 
//
// label name
//
// demo mode supports up to 6 chars only (64 in full version),
// if you pass more than this number, service will return
// ERROR_LENGTH_LABEL
//
$options["label"] = "Label";
 
//
// input string / raw bytes compression enabled, if you set it to
// true, you need to compress input string / raw bytes eg.
//
// $compressed = @base64_encode(@gzcompress($string, 9)
//
// and after encryption you need to decompress encrypted data
//
// $decompressed = @gzuncompress(@base64_decode($source));
//
$options["compression"] = false;
//$options["compression"] = true;
 
//
// input string in UTF-8 format
//
// demo mode supports up to 6 chars only, if you pass more
// than that, service will return ERROR_LENGTH_STRING
//
$options["string"] = "Hello!";
//$options["string"] = @base64_encode(@gzcompress("Hello!", 9));
 
//
// raw data bytes to encrypt (you need to specify either
// $options["string"] or this value
//
// demo mode doesn't support this parameter and the service
// will return ERROR_DEMO
//
//$options["bytes"] = file_get_contents("my_file.txt");
//$options["bytes"] = file_get_contents("http://www.example.com/my_file.txt");
//$options["bytes"] = @base64_encode(@gzcompress(file_get_contents("my_file.txt"), 9));
 
//
// treat input string as a UNICODE string (ANSI otherwise)
//
$options["unicode"] = true;
 
//
// input string default locale (only those listed below
// are supported currently)
//
$options["lang_locale"] = "en_US.utf8";
//$options["lang_locale"] = "en_GB.utf8";
//$options["lang_locale"] = "de_DE.utf8";
//$options["lang_locale"] = "es_ES.utf8";
//$options["lang_locale"] = "fr_BE.utf8";
//$options["lang_locale"] = "fr_FR.utf8";
//$options["lang_locale"] = "pl_PL.utf8";
 
//
// how to encode new lines, available values:
//
// "lf" - Unix style
// "crlf" - Windows style
// "cr" - Mac style
//
$options["new_lines"] = "lf";
//$options["new_lines"] = "crlf";
//$options["new_lines"] = "cr";
 
//
// destination ANSI string encoding (if unicode = false)
//
// only those listed below are supported
//
$options["ansi_encoding"] = "WINDOWS-1250";
//$options["ansi_encoding"] = "WINDOWS-1251";
//$options["ansi_encoding"] = "WINDOWS-1252";
//$options["ansi_encoding"] = "WINDOWS-1253";
//$options["ansi_encoding"] = "WINDOWS-1254";
//$options["ansi_encoding"] = "WINDOWS-1255";
//$options["ansi_encoding"] = "WINDOWS-1256";
//$options["ansi_encoding"] = "WINDOWS-1257";
//$options["ansi_encoding"] = "WINDOWS-1258";
//$options["ansi_encoding"] = "ISO-8859-1";
//$options["ansi_encoding"] = "ISO-8859-2";
//$options["ansi_encoding"] = "ISO-8859-3";
//$options["ansi_encoding"] = "ISO-8859-9";
//$options["ansi_encoding"] = "ISO-8859-10";
//$options["ansi_encoding"] = "ISO-8859-14";
//$options["ansi_encoding"] = "ISO-8859-15";
//$options["ansi_encoding"] = "ISO-8859-16";
 
//
// output programming language
//
// only those listed below are supported, if you pass
// other name, service will return ERROR_INVALID_LANG
//
$options["lang"] = "cpp";
//$options["lang"] = "csharp";
//$options["lang"] = "delphi";
//$options["lang"] = "java";
//$options["lang"] = "js";
//$options["lang"] = "python";
//$options["lang"] = "haskell";
//$options["lang"] = "masm";
//$options["lang"] = "fasm";
 
//
// minimum number of encryption commands
//
// demo mode supports only up to 3 commands (50 in full version),
// if you pass more than this number, service will return
// ERROR_CMD_MIN
//
$options["cmd_min"] = 1;
//$options["cmd_min"] = 1;
 
//
// maximum number of encryption commands
//
// demo mode supports only up to 3 commands (50 in full version),
// if you pass more than this number, service will return
// ERROR_CMD_MAX
//
$options["cmd_max"] = 3;
//$options["cmd_max"] = 50;
 
//
// store encrypted string as a local variable (if supported
// by the programming language), otherwise it's stored as
// a global variable
//
$options["local"] = false;
//$options["local"] = true;
 
//
// encrypt string or file contents
//
$result = stringencrypt($options);
 
if ($result != false)
{
	if ($result["error"] == ERROR_SUCCESS)
	{
		// if compression was enabled, we need to
		// decompress the output source code
		if ($options["compression"] == true)
		{
			$source = @gzuncompress(@base64_decode($source));
		}
		else
		{
			$source = $result["source"];
		}
 
		// display decryptor body
		echo "<pre>".$source."</pre>";
 
		// display number of credits left
		echo "<p>You have {$result['credits_left']} credits left.</p>";
 
		// display initial number of credits
		echo "<p>Initial number of credits {$result['credits_total']}.</p>";
 
		// activation code has expired, notify user
		if ($result["expired"] == true)
		{
			echo "<p>Your activation code has expired!</p>";
		}
	}
	else
	{
		echo "An error occured (code ".$result["error"].")";
	}
}
else
{
	echo "Cannot connect to the API interface!";
}
?>

Strona projektu

Zachęcam do odwiedzenia strony usługi i wypróbowania https://stringencrypt.com.

Antywirus Avast i mała niespodzianka

Jak się okazuje darmowy antywirus Avast oprócz swojej podstawowej funkcji, instalował Adware w postaci wtyczki do przeglądarki internetowej, która wysyłała do firmy Avast informację o każdej odwiedzanej stronie przez użytkownika.

avast-antivirus

Artykuł na:

http://www.howtogeek.com/199829/avast-antivirus-was-spying-on-you-with-adware-until-this-week/

Nie ukrywam, że jestem przeciwnikiem wszelkiej maści programów antywirusowych, których główną funkcją jest zamulanie komputera oraz zgłaszanie fałszywych detekcji gdzie tylko się da, oprócz tego ktoś sprytnie postanowił dorobić do tego darmowego biznesu przez wrzucenie oprogramowania, z którym w teorii antywirusy walczą – czysta hipokryzja i jeszcze jeden powód, żeby nie używać oprogramowania antywirusowego.

Obfuscator v2.0

Właśnie wydałem nową wersję swojego oprogramowania Obfuscator v2.0.

Obfuscator służy do modyfikacji kodu źródłowego assemblera (dla składni MASM), w taki sposób, aby wynikowy kod był jak najbardziej skomplikowany do analizy.

Główne okno Obfuscatora

Do tego celu Obfuscator stosuje wiele metod jak:

  • mutacja instrukcji assemblera na serię innych równoznacznych instrukcji
  • zmiana wykonywania ścieżki kodu na nielinearną (skoki w górę i w dół w codeflow)
  • wstawianie nieinwazyjnych konstrukcji kodu utrudniających statyczną i dynamiczną analizę
  • ukrywanie bezpośrednich wywołań funkcji WinAPI
  • wstawianie junków między prawdziwe instrukcje
  • wstawianie fałszywych instrukcji
  • wstawianie celowych wyjątków i bramek SEH, które te wyjątki wyłapują, a utrudniają tracing
  • rozpoznawanie ponad 15000 stałych WinAPI i ich zamiana na postać liczbową, co pozwala mutację instrukcji je wykorzystujących

Kod wyjściowy po zastosowaniu Obfuscatora

Obfuscator to niszowe narzędzie, które stworzyłem dosyć dawno temu w PHP, a obecnie przeszło gruntowne zmiany, praktycznie cały silnik został przepisany, poprawiona została analiza kodu źródłowego, mutacje bazujące na matematycznych transformacjach zostały przepisane z wykorzystaniem biblioteki GMP dla zachowania kompatybilności z typem danych unsigned int, z którym PHP sobie po prostu nie radzi. Dodałem także rozpoznawanie stałych wartości wykorzystywanych w funkcjach WinAPI jak np. MB_ICONINFORMATION, które zostają zamienione na wartości liczbowe, dzięki czemu instrukcje je wykorzystujące mogą być poddane mutacjom.

Jeśli jesteście ciekawi jak to działa, zajrzyjcie na stronę programu, gdzie możecie ściągnąć klienta dla systemu Windows:

https://www.pelock.com/products/obfuscator

Znajdziecie tam też przykładowy skompilowany plik EXE przed i po zastosowaniu Obfuscatora – polecam spojrzeć na kod w IDA, Hiew i spróbować pośledzić go w OllyDbg.

Jeśli macie jakieś pytania, sugestie lub zastrzeżenia – piszcie w komentarzach.

Polskie programy? Tylko gdzie?

Polskie oprogramowanie

Dzisiaj przypadkowo wylądowałęm na stronie popularnego serwisu technologicznego Spider’s Web. Jak sami piszą w stopce:

„Czym jest Spider’s Web?
Jedenastu blogerów Spider’s Web to jedenaście różnych blogów technologicznych, które razem tworzą jakość w polskiej blogosferze, opartą na opinii i analizie, a nie na informacji przepisanej ze źródeł anglojęzycznych.”

Zerknąłem na dział Software i trochę się przeraziłem. Spójrzcie na tego screenshota:

Spider's Web Dział Software

Big Corporation’s Web

Poświęciłem chwilę czasu i wyliczyłem o jakich tematach są artykuły w tej kategorii z dnia 25 czerwca 2013 roku.

I tak, liczba tematów i wspomnianych firm lub technolgii:

  • 25 – Microsoft
  • 9 – Apple
  • 4 – Adobe
  • 3 – Google
  • 2 – Mozilla
  • 1 – McAfee
  • 1 – Facebook
  • 1 – Prawo patentowe
  • 1 – Amazon
  • 1 – Ubuntu
  • 1 – BitTorrent

Nietrudno się domyśleć czyimi fanboyami są redaktorzy Spider’s Web, jednak co mnie przeraża to fakt, że brak tu jakiegokolwiek artykułu o czymś robionym w Polsce.

Teraz Polska?Czy polski serwis z 11 redaktorami tworzącymi „jakość” w polskim Internecie nie potrafi na 42 artykuły wspomnieć chociaż jednym słowem o jakimś polskim produkcie, aplikacji? Czy to za mało hipsterskie i ta biało-czerwona kafelka po prawej ze znakiem zapytania jest za mało ciekawa i odjazdowa od kafelkowego interfejsu ulubionego sponsora? Czy może w Polsce jest już taka bieda, że nie powstają tu żadne nowe rozwiązania technologiczne warte uwagi?

Jeśli znacie jakieś ciekawe rozwiązania polskich firm (choćby swoje) – dopiszcie je do komentarzy, bo mi już się rzygać chce od artykułów na temat Modern UI i dyskusjach o braku przycisku start w Windows 8. Ile można o tym pisać drodzy redaktorzy Spider’s Web?

To może zacznę ja sam:

Naprawdę, chciałbym, żeby tematy o polskich twórcach częściej pojawiały się w mediach elektronicznych. Być może jakby młodzi autorzy zobaczyli że nie tylko pisze się o ogromnych korporacjach, ale może o małych, rodzimych firmach, które także wprowadzają innowacje na rynku, coś by się ruszyło na tym naszym skromnym podwórku. Tego Wam i sobie życzę.

Wykop jakby komuś się chciało dać mi kopa 🙂