Proste zabezpieczenie naszego dema

hxv

Były Moderator
Dołączył
Sierpień 9, 2006
Posty
797
Ok, The jakiś czas temu napisał swój spamer GG. Chciał na nim zarobić i dlatego publicznie udostępnił wersję demo która pozwala wysłać max. 100 wiadomości. adikx wpadł jednak na niezły pomysł: otóż liczba wysłanych wiadomości musi być gdzieś zapisana, wystarczy znaleźć tą wartość w pamięci i można ją zamrozić - program będzie cały czas 'myślał' że wysłał np. 10 wiadomości i dzięki temu się nie wyłączy. Jak pisałem pomysł niezły ale jako że nie pochodzi ode mnie z przyjemnością napiszę jak się przed tym (w miarę możliwości) zabezpieczyć xD
Załóżmy, że kod programu wygląda jakoś tak:
Kod:
var
  i : integer;
begin
  for i := 1 to 100 do //wiem że tutaj lepsza byłaby np. pętla while(true) ale tak będzie prościej tłumaczyć;p
  begin
    //tutaj jakieś wysyłanie wiadomości albo coś w tym stylu
  end;
  MessageBox(0, 'Koniec!', 'DEMO', 0);
  ExitProcess(0);
end;
Jak widać - po 100 obiegach program się wyłączy. Jednak po zmianie wartości w pamięci będzie działał dalej
<
Co możemy z tym zrobić? Można sprawdzić czy wartość nie została zmieniona (jak wszystko inne to też da się obejść, staramy się jednak trochę utrudnić robotę). Nasza zmodyfikowana pętla:
Kod:
var
  i, last : integer;
begin
  last := 0; //ostatnia wartość zmiennej
  for i := 1 to 100 do
  begin
    if (last <> i - 1) then //jeśli ostatnia wartość nie jest mniejsza od licznika o 1
    begin
      MessageBox(0, 'Cziter!', 'DEMO', 0); //nic nie stoi na przeszkodzie aby w tym miejscu np. wyłączyć komputer ^^
      ExitProcess(0);
    end;
    last := i; //zmieniamy wartość (można dać np. last := i - 1;, należy jednak pamiętać o zmianie reszty kodu)
    //tutaj jakieś wysyłanie wiadomości albo coś w tym stylu
  end;
  MessageBox(0, 'Koniec!', 'DEMO', 0);
  ExitProcess(0);
end;
No, powinno trochę pomóc. Dla pewności dodamy jeszcze jedno zabezpieczenie:
Kod:
var
  i, last : integer;
  chk, chk_ : real; //jeśli da się użyć jakiegoś innego typu to proszę bardzo, ja tam Delphi zbyt dobrze nie znam;)
begin
  last := 0;
  chk := 134 + random(12); //dowolna początkowa wartość + wylosowana liczba (tak żeby jeszcze bardziej utrudnić :P), będzie działać jako 'drugi licznik'
  chk_ := chk; //tutaj zapisujemy początkową wartość drugiego licznika
  for i := 1 to 100 do
  begin
    chk := chk - 0.1; //zmniejszamy drugi licznik (można oczywiście zmienić wartość/znak, należy potem poprawić resztę kodu)
    if (last <> i - 1) or (chk < chk_ - 10.1) then //jeśli drugi licznik jest mniejszy niż powinien (100 * 0.1 = 10; [+0.1 tak dla pewności :D])
    begin
      MessageBox(0, 'Cziter!', 'DEMO', 0);
      ExitProcess(0);
    end;
    last := i;
    //tutaj jakieś wysyłanie wiadomości albo coś w tym stylu
  end;
  MessageBox(0, 'Koniec!', 'DEMO', 0);
  ExitProcess(0);
end;
No, teraz będzie trochę trudniej zmienić wartość licznika w pamięci
<

//wszystkie fragmenty kodu pisane z pamięci, nie sprawdzałem czy działają; chodzi mi jedynie o przedstawienie ogólnej idei, pomysłu na to jak można zabezpieczyć swoją aplikację; nic nie stoi na przeszkodzie żeby przepisać to sobie np. na C++
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
ale to tez mozna latwo obejsc jak jest if ktory sprawdza czy poprzedni licznik nie jest >= to wystarczy zamienic w asmie juz na ze jesli jest == to zeby puscil(sam dobrze o tym wiesz) a drugi moge sobie zwyczajnie zanopowac
<


albo zmienic ze jesli wykryje "czitera" to zeby skoczyl do kodu ktory wykonałby się jakbym nie "czitował"
<


Nie ma 100% zabezpieczenia !!!
 

hxv

Były Moderator
Dołączył
Sierpień 9, 2006
Posty
797
grzonu, wiem że nie ma 100% zabezpieczenia, to ma tylko trochę utrudnić robotę tym co chcą zmienić wartość zmiennej w pamięci
<
 

adikx

Użytkownik
Dołączył
Maj 21, 2007
Posty
415
Nie znam asma więc zaproponuje co wykombinowałem ale nie sprawdziłem jeśli chodzi o delphi.
Procedura ExitProcess ma za zadanie zamknąć program po wykonaniu określonej ilości powtórzeń pętli. A gdyby za pomocą api hookingu podmienić tą procedurę na swoją która by nie zamykała programu?? No właśnie można by było znowu click na starta xD No i oczywiście soft co by klikał co np. 5 min na ten button i spamer dalej działa. Ale są to tylko moje spekulacje nie wiem czy cosik takiego się sprawdzi.

@BTW: @hxv Dzięki za przedstawienie mojego pomysłu
<
No i zabezpieczenie przed nim xD
 
Do góry Bottom