Zmiejszanie wykrywalności

hxv

Były Moderator
Dołączył
Sierpień 9, 2006
Posty
797
Ok, więc mam zamiar pokazać jak zmniejszyć wykrywalność programu (mój ulubiony temat
<
) poprzez "prostą" edycję jego kodu.
I już na wstępie: nie będzie gotowca, nie będę w żaden sposób pomagał ani lepiej tłumaczył. Jak nie rozumiesz - przestań czytać.

Na początek przydałby się jakiś trojan. Biorę Frankenstein i sprawdzam wykrywalność. Wynik: 29/36 (80.56%). Zaraz coś z tym zrobimy.

Teraz najważniejsza rzecz: normalnie nie można edytować obszaru pamięci w której jest kod, trzeba to zmienić. Ładujemy plik np. do Stud_PE albo PE Explorer i dodajemy w sekcji CODE możliwość zapisu (MEM_WRITE albo coś podobnego, zależy od programu). Po zapisaniu ładujemy program do debuggera (ja używam DeFixed).

Pierwsze instrukcje jakie widzimy to:
Kod:
PUSH EBP
MOV EBP, ESP
ADD ESP, -10
MOV EAX, 0045A030
CALL 00406050
...
Wypadałoby gdzieś tutaj dopisać nasz kod. Myślę że możemy chwilowo nadpisać
Kod:
MOV EAX, 0045A030
, powinno działać (nie można nadpisać za wcześnie bo AV wykryją plik jako packer/crypter, przy nadpisaniu za późno kod który chcemy 'zaszyfrować' może zostać wykonany i program się sypnie).
Przeskoczymy sobie do wolnego miejsca na końcu pliku: zamieniamy naszą instrukcję na
Kod:
JMP 0045A2AE
Teraz przechodzimy do napisana kodu który odpowiednio zmodyfikuje pamięć. Nie będzie to nic skomplikowanego, po prostu zwiększymy każdy bajt o 1. Można oczywiście zrobić coś skuteczniejszego, dodać szyfrowanie zasobów ale myślę że to w zupełności wystarczy.

Jak to wszystko będzie wyglądać? Całkiem prosto, musimy do jednego rejestru wpakować adres bajta który będziemy edytować a do drugiego jego wartość. Potem tylko zmodyfikować i zapisać:
Kod:
PUSH ECX;wkładamy na stos drugi rejestr którego będziemy używać, potem go zdejmiemy żeby nie wpłynąć na działanie programu
MOV EAX, 00400FFF;adres od którego zaczynamy modyfikacje (początek kodu -1)*
INC EAX;zwiększamy adres
MOV CL, [EAX];pobieramy bajt
DEC CL;zwiększamy
MOV [EAX], CL;zapisujemy do pamięci
CMP EAX, 0045A247;porównujemy numer aktualnego bajtu z końcowym bajtem (tuż przed EP)
JNZ 0045A2B4;jeśli nie są równe to skaczemy do "INC EAX" i powtarzamy wszystko od nowa
POP ECX;zdejmujemy ECX ze stosu
MOV EAX, 0045A030;instrukcja którą nadpisaliśmy
JMP 0045A253;kontynuujemy kod (skaczemy do "CALL 00406050", czyli miejsca tuż za pierwszym skokiem)
*od razu po ustawieniu wartości zostanie ona zwiększona dlatego musimy odjąć 1

Zapisujemy plik i próbujemy uruchomić, powinien wyskoczyć jakiś błąd lub program zacznie działać nie poprawnie. To dlatego że jeszcze nie zmieniliśmy kodu. Skoro w trakcie pracy programu będziemy go zmniejszać o 1 to w pliku należy go o jeden zwiększyć.
Otwieramy plik w hex edytorze, zaznaczamy kod który będzie modyfikowany (w tym wypadku 400h-59647h) i zwiększamy bajty o 1.

To tyle, jeśli wszystko zrobiliście poprawnie to program powinien działać a wykrywalność powinna spaść (u mnie spadła do 3/36).

I na zakończenie przypomnę: to jest tylko i wyłącznie ogólne przedstawienie jednego ze sposobów na zmniejszenie wykrywalności. Czasem wystarczy edytować sam kod, czasem trzeba bawić się z zasobami.
Artykuł nie jest skierowany do ludzi którzy nie mają pojęcia o programowaniu i asm, jest dla kogoś kto zna podstawy i chce się czegoś dowiedzieć.
Jeśli więc rozumiesz większość tego co napisałem ale coś nie wychodzi - pisz na gg. Z góry ostrzegam - ludzie którzy nic nie rozumieją i nagle chcą się tego nauczyć będą przeze mnie ignorowani.

//prosiłbym o przeniesienie jeśli się nada
 
Do góry Bottom