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:
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:
No, powinno trochę pomóc. Dla pewności dodamy jeszcze jedno zabezpieczenie:
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++
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;
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;
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;
//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++