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.

Magazyn Programista 02/2014 (21)

Wyszedł nowy numer magazynu Programista 02/2014 (21).

magazyn-programista-02-2014

Spis treści:

  • Interface a implementacja
  • Wstęp do WPF – część 2: Stylowanie kontrolek w WPF
  • ASP.NET SignalR – czyli aplikacje czasu bardzo rzeczywistego. Część 2
  • Java 8 – najbardziej rewolucyjna wersja w historii
  • Początki z językiem Fortran
  • Concepts Lite. Rozszerzenie standardu C++14
  • Jak napisać własny debugger w systemie Windows – część 1
  • Badanie jakości kodu C++
  • Refaktoryzacja testów legacy w kierunku wykonywalnych specyfikacji. Część II: Techniki ułatwiające utrzymanie testów
  • Brakujący element Agile Część 1: Feedback
  • Szczyt za szczytem
  • Ghost in the Shellcode 2014 – Pwn Adventure 2
  • Jak całkowicie odmienić sposób programowania, używając refaktoryzacji (część 6)

Filtr na trolla

Bycie trollem internetowym ma swoje plusy i minusy, można kogoś zbluzgać bez powodu i cieszyć się swoją głupotą, czasami jednak administratorzy stron walczą z trollami stosując wymyślne filtry.

Tak jest lub było w przypadku wykrywania znanego „klaczowego” trolla okupującego swego czasu forum 4programmers, sprytny administrator Adam Boduch postanowił walczyć z twórczością trolla stosując taki oto wymyślny filtr:

<?php

/* ... */

Wrapper\Engine::instance()->atInit(function($engine) {
    $is_troll_z_play = has_troll_cookie();

    if ($_SERVER['REQUEST_METHOD'] === 'POST' && @$_GET['mode'] === 'submit') {
        if (isset($_POST['username']) && isset($_POST['content'])) { // tylko anonimow
            $matches_nick = troll_count_matches($_POST['username'], array(
                '/deus/i'               => 2.0,
                '/klacz/i'              => 2.0,
                '/demonical.?monk/i'    => 2.0
            ));
            $pattern_body = array(
                '/(?<!u)rucha/i'        => 1.0,
                '/klacz/i'              => 1.0,
                '/kutas/i'              => 1.0,
                '/sra/i'                => 1.0,
                '/g(ó|o)wn/i'          => 1.0,
                '/sperm/i'              => 1.0,
                '/ss(a|ie)/i'           => 0.5,
                '/wyli(z|ż)/i'         => 0.5,
                '/stajni/i'             => 0.5,
                '/zoofil/i'             => 0.5
            );
            $matches_body = troll_count_matches($_POST['content'], $pattern_body);

            if (isset($_POST['subject'])) { // nowy temat
                $matches_body += 1.5 * troll_count_matches($_POST['subject'], $pattern_body);
                $matches_body += 1.5 * troll_count_matches($_POST['tag'], $pattern_body);
            }
            if ($matches_nick + $matches_body > 2 || has_troll_cookie()) {
                $is_troll_z_play = true;

                $engine->log('contents.log', array(
                    'username'  => $_POST['username'],
                    'content'   => $_POST['content'],
                    'title'     => @$_POST['title'],
                    'tag'       => @$_POST['tag']
                ));
            }
        }
    }
    if ($is_troll_z_play) {
        define('TROLL_Z_PLAY', true);

        unset($_COOKIE['sid']);
        unset($_COOKIE['temp']);
    }
});

/* ... */

Regularne wyrażenia w połączeniu z systemem punktacji pozwoliły raz na zawsze pozbyć się trolla z forum, a Wam prezentuję to jako znakomity pomysł na wykrywanie tego typu niechcianych treści na stronach.

Magazyn Programista 1/2014

Ukazał się nowy numer miesięcznika Programista 1/2014.

Magazyn Programista 1/2014

W numerze:

  • Wprowadzenie do Entity Framework
  • Jak używać IBM Worklight – część 2
  • Wstęp do WPF – część 1
  • Web Crawling oraz Text Mining przy wykorzystaniu RapidMiner
  • PLY oraz Python, czyli sposób na Lexa oraz Yacca
  • Tworzenie usługi sieciowej opartej o Twisted
  • Automatyczne Testowanie Aplikacji JavaScript na przykładzie aplikacji napisanej w Backbone.JS
  • Zakodowana pomoc
  • Receptury projektowe – niezbędnik początkującego architekta
  • Strefa CTF – 30C3 CTF – cableguy
  • Pozyskaj pracownika albo zgiń!
  • Systemy proste, skomplikowane, złożone i chaotyczne, czyli Cynefin.
  • Programowanie równoległe i asynchroniczne w C# 5.0

Zachęcamy do lektury!

Magazyn Programista 11/2013

Nowy „Programista” jest już dostępny! Ponad 140 stron.

Tematem głównym jest drugi artykuł z serii pt „Bliżej silikonu” skierowanej do osób zainteresowanych sposobem działania systemów komputerowych od podszewki. Tym razem będzie mowa m.in o analizie BIOS API, procesie ładowania jądra Windows i tworzeniu boot loadera dla własnego systemu.

Programista 11/2013 (18)

Ponadto w numerze takie tematy jak:

  • Rzeczywistość rozszerzona w Androidzie
  • Vaadin 7 – naprawdę szybkie tworzenie aplikacji web w Javie
  • Windows 8.1 okiem programisty
  • Wzorce Programowania Gier:  Szkielet Aplikacji
  • oraz wiele, wiele więcej!

Więcej o wydaniu:

http://programistamag.pl/programista-112013-18-spis-tresci/

Akcja „Paragon”

Nowy numer magazynu „Programista” pojawił się już w salonach Empik w całym kraju. Wydawca magazynu serdecznie zaprasza do udziału w zabawie „Paragon”.

Osoby, które prześlą skan zakupu nowego numeru na adres mailowy:

[email protected]

otrzymają dwa dowolnie wybrane numery archiwalne w wersji elektronicznej.

Ponadto wszystkie nadesłane skany „wezmą udział” w losowaniu 3 książkek z oferty wydawnictwa Helion.

Zwycięzcy sami będą mogli wskazać swój tytuł. Akcja „Paragon” trwa do końca roku, a losowanie książek odbędzie się 31 grudnia. Dodatkowo osoby, które prześlą na ww. e-mail skanu zakupu nowego wydnia, otrzymają w PDF pierwszą cześć artykułu z cyklu ” Bliżej silikonu”.

Ukrycie zakładek tab w kontrolce PageControl w Delphi

Dzisiaj szybko musiałem pozbyć się nagłówków z kontrolki PageControl i przygotowałem zmodyfikowany komponent dla Delphi – PageControlEx z opcją ukrywania nagłówków.

////////////////////////////////////////////////////////////////////////////////
//
// Custom PageControlEx component with hidden page tabs
//
// Bartosz Wójcik | www.pelock.com
//
////////////////////////////////////////////////////////////////////////////////

unit PageControlEx;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  ExtCtrls, StdCtrls, ComCtrls;

Type

  TPageControlEx = class(TPageControl)

  private
    FHideHeader: Boolean;
    procedure SetHideHeader(const Value: Boolean);
  protected
    procedure WndProc(var Msg: TMessage); override;
  published
    property HideHeader:Boolean read FHideHeader Write SetHideHeader;
  End;

procedure Register;

implementation

procedure TPageControlEx.WndProc(var Msg: TMessage);
begin
  // hide header via intercepting TCM_ADJUSTRECT message
  if (FHideHeader = True) and (Msg.Msg = $1328) then
    Msg.Result := 1
   else
    inherited;
end;

procedure TPageControlEx.SetHideHeader(const Value: Boolean);
begin
  FHideHeader := Value;
end;

procedure Register;
begin
  RegisterComponents('PELock', [TPageControlEx])
end;

end.