Текущий архив: 2006.10.15;
Скачать: CL | DM;
ВнизЗащита от вмешательства Найти похожие ветки
← →
DiX © (2006-09-17 18:27) [0]Подскажите как реализовать, чтобы при наличии отладчика (SoftICE, OllyDBG и др.) прога не стартовала, а так же не стартовала под виртуальной ОС.
← →
Yegorchic © (2006-09-17 18:55) [1]
////////////////////////////////////////////////////////////////////////////////
//
// Simple VMware check on i386
//
// Note: There are plenty ways to detect VMware. This short version bases
// on the fact that VMware intercepts IN instructions to port 0x5658 with
// an magic value of 0x564D5868 in EAX. However, this is *NOT* officially
// documented (used by VMware tools to communicate with the host via VM).
//
// Because this might change in future versions - you should look out for
// additional checks (e.g. hardware device IDs, BIOS informations, etc.).
// Newer VMware BIOS has valid SMBIOS informations (you might use my BIOS
// Helper unit to dump the ROM-BIOS (http://www.bendlins.de/nico/delphi).
//
function IsVMwarePresent(): LongBool; stdcall; // platform;
begin
Result := False;
{$IFDEF CPU386}
try
asm
mov eax, 564D5868h
mov ebx, 00000000h
mov ecx, 0000000Ah
mov edx, 00005658h
in eax, dx
cmp ebx, 564D5868h
jne @@exit
mov Result, True
@@exit:
end;
except
Result := False;
end;
{$ENDIF}
end;
Из DelphiWorld
← →
DiX © (2006-09-17 21:16) [2]Спасибо, хотелось-бы еще увидеть защиту от отладчиков.
← →
Dmitrij_K (2006-09-17 21:25) [3]
> хотелось-бы еще увидеть защиту от отладчико
Самый простой способ это FindWindow
← →
oxffff © (2006-09-17 21:48) [4]http://www.wasm.ru/article.php?article=1017001
← →
SPACE!! (2006-09-17 21:49) [5]http://www.cracklab.ru/download.php посмотри "упаковщики и протекторы",
также глянь "распаковщики" но лучше наверное использовать малоизвестные
разработки каких небудь энтузиастов . А вопще я бегло взглянул на проблему защиты и ужаснулся ... Слова что мол взломать можно все что
угодно похоже являются правдой весь вопрос только во времени. А чтоб
сделать устойчивую защиту нужно быть хорошим точнее даже очень хорошим
кракером , но это конешно мое субъективное мнения. Кстате на сайте есть книга Криса Касперски посмотри. Правда чтоб все понять нужно убить млин столько времени . Вобщем я так бегло просмотрел ничего толком не понял кроме того что помимо кракеров хорошую защиту могут написать и вирусологи :)
На http://www.delphikingdom.com/ я как-то скачал chm там помимо всякой беребурды есть цикл статей о защите там можно много подчерпнуть.Если не найдешь где этот chm качается попробуй через поиск ("Защита") у них на сайте.
Предлогаю развить тему защиты в общем, если конешно автор ветки не
против.
← →
YurikGL © (2006-09-17 21:50) [6]На каждый pack есть свой unPack
Так что усилия по защите должны быть сопоставимы с ценой программы
← →
oxffff © (2006-09-17 21:51) [7]Посмотри также для кругозора
http://www.wasm.ru/article.php?article=debugreg
← →
oxffff © (2006-09-17 21:55) [8]Да и вообще все на http://www.wasm.ru/publist.php
← →
Юрий Зотов © (2006-09-17 22:07) [9]Вообще, чтобы программу стали всерьез взламывать, надо для начала написать такую программу, чтобы хоть один серьезный хакер взялся за ее взлом.
Такая программа уже написана?
← →
oxffff © (2006-09-17 22:32) [10]Сделай crackme и выложи.
То что сломают можно не сомневаться.
← →
oxffff © (2006-09-17 22:35) [11]По себе знаю,
что неудобства взлома представляют программы
основанные на байт коде.
← →
SPACE!! (2006-09-18 00:51) [12]
> основанные на байт коде
Можно чуть теории ... ?
← →
DiX © (2006-09-18 18:20) [13]
> чтобы хоть один серьезный хакер взялся за ее взлом
Я не претендую на такую защиту, чтобы ее не взломал хороший хакер/крекер, мне нужно, чтобы люди (типа установил SoftICE, прочитал Help, а сейчас посмотрю как эта программа работает) не смогли отследить действия программы.
P.S. А взломать и правда можно все
← →
dreamse (2006-09-18 18:21) [14]> DiX © (17.09.06 18:27)
Пойми что защиты не существует :) Если програма стоит того чтоб её взломали то её взломают ! Если не стоит то и никто не будет ломать.
Я потратил неделю на встраивание всякого рода защиты в программу ( софт для ведения клубного бизнеса ) Шифрование , проверка на отладчики и пр.
В итоге взломали дня за 2 чтоли , даже написали генератор SN :)
Лучший способ от взлома это не давать программу, просто продавать , показывать скрины и может быть ОЧЕНЬ урезанные демки показывать , вообще без кода
← →
oxffff © (2006-09-18 19:18) [15]
> > чтобы хоть один серьезный хакер взялся за ее взлом
>
> Я не претендую на такую защиту, чтобы ее не взломал хороший
> хакер/крекер, мне нужно, чтобы люди (типа установил SoftICE,
> прочитал Help, а сейчас посмотрю как эта программа работает)
> не смогли отследить действия программы.
> P.S. А взломать и правда можно все
Так если ты даже поставишь проверку на отладчик.
То обойти это тоже просто. jz на jmp.
← →
oxffff © (2006-09-18 19:21) [16]Ты можешь даже проверять контрольную сумму кода.
Но тоже это все обходится. В самом простом случае аналогично
jz на jmp.
← →
Eraser © (2006-09-18 19:25) [17]в дополнение к [9] и [14] скажу, что заниматься серьезной защитой - бесполезное занятие, взламывают все, в т.ч. аппаратные ключи и защиты, использующие технологии руткита.
кому нужно - купит в любом случае, кому не нужно - будет пользоваться краденым или не будет пользоваться вообще.
+ на первых парАх, наличие кряка серьезно увеличивает популярность продукта.
PS единственный совет по созданию зщиты - делать весьма сложный механизм шифрования ключа, желательно не самописный, чтобы было проблематично сделать кей-ген, а кряки и серийники это уже не так страшно.
Первое лечится подменой дистрибутива, второе черным списком серийников.
← →
DiX © (2006-09-18 19:31) [18]Для меня важно, чтобы тот кто ламает программу не понял как она работает (ее работа связана с деньгами), а взломает он код для программы или нет это уже не так важно.
← →
oxffff © (2006-09-18 19:33) [19]
> PS единственный совет по созданию зщиты - делать весьма
> сложный механизм шифрования ключа, желательно не самописный,
> чтобы было проблематично сделать кей-ген, а кряки и серийники
> это уже не так страшно.
Этого не достаточно.
Можно придумать супер алгоритм. Но во многих случаях
call проверка на рег (cупер алгоритм)
test eax,eax
jz Registered
Nonregistered:
Registered:
Ломается элементарно. jz на jmp
← →
oxffff © (2006-09-18 19:35) [20]Или даже XOR EAX,EAX
← →
Eraser © (2006-09-18 19:35) [21]> [18] DiX © (18.09.06 19:31)
тогда нужно использовать какое-нибудь готовое решение типа ASProtect, EXECryptor"a и т.п., только их тоже вскрывают время от веремени, а когда код расшифрован, то через DeDe все можно посмотреть.
← →
Eraser © (2006-09-18 19:36) [22]> [19] oxffff © (18.09.06 19:33)
и пусть ломается, главное чтобы кей-ген не сделали, особенно если в программе есть ограничение на число пользователей в зависимости от лицензии.
← →
Eraser © (2006-09-18 19:37) [23]> [18] DiX © (18.09.06 19:31)
> чтобы тот кто ламает программу не понял как она работает
а что полохово если узнает, думаю никаких "ноу-хау" в бухгалтеркой программе нету, чтобы скрывать реализацию.
← →
DiX © (2006-09-18 19:42) [24]
> сделаем следующее:
>mov ecx,fs:[20h]
jecxz not_being_debugger
[...]
<--- делайте, что хотите, нас отлаживают :)
>
> Потому, если FS:[20h] равен нулю, нас не отлаживают. Наслаждайтесь
> этим маленьким и простым методом для обнаружения отладчиков!
Как из этого кода сделать функцию по аналогии с ответом 1, чтобы возвращала True если есть отладчик и False в противном случае?
← →
DiX © (2006-09-18 19:47) [25]
> И наконец, чудесный трюк, которого вы ждали... Универсальный
> способ найти SoftICE и Win9x и в WinNT! Это очень просто,
> 100% основанно на API и без всяких "грязных" трюков, которые
> не идут на пользу совместимости. И ответ находится не так
> далеко, как вы думаете... ключ заключается в API, который
> вы уже использовали раньше: CreateFile. Да, именно эта функция.
> .. Разве это не прекрасно? Ладно, мы можем попытаться открыть
> следующее:
+ SoftICE для Win9x : "\\.\SICE"
+ SoftICE для WinNT : "\\.\NTICE"
> Если функция возвращает нам что-нибудь, отличное от -1 (INVALID_HANDLE_VALUE),
> SoftICE запущен! Далее следует демонстрационная программа:
>;---[ CUT HERE ]-------------------------------------------------------------
.586p
.model flat
extrn CreateFileA:PROC
extrn CloseHandle:PROC
extrn MessageBoxA:PROC
extrn ExitProcess:PROC
.data
szTitle db "SoftICE detection",0
szMessage db "SoftICE for Win9x : "
answ1 db "not found!",10
db "SoftICE for WinNT : "
answ2 db "not found!",10
db "(c) 1999 Billy Belcebu/iKX",0
nfnd db "found! ",10
SICE9X db "\\.\SICE",0
SICENT db "\\.\NTICE",0
.code
DetectSoftICE:
push 00000000h ; Проверяем наличии
push 00000080h ; SoftICE для среды Win9x
push 00000003h
push 00000000h
push 00000001h
push 0C0000000h
push offset SICE9X
call CreateFileA
inc eax
jz NoSICE9X
dec eax
push eax ; Закрываем открытый файл
call CloseHandle
lea edi,answ1 ; SoftICE найден!
call PutFound
NoSICE9X:
push 00000000h ; А теперь пытаемся открыть
push 00000080h ; SoftICE для WinNT...
push 00000003h
push 00000000h
push 00000001h
push 0C0000000h
push offset SICENT
call CreateFileA
inc eax
jz NoSICENT
dec eax
push eax ; Закрываем хэндл файла
call CloseHandle
lea edi,answ2 ; SoftICE для WinNT найден!
call PutFound
NoSICENT:
push 00h ; Показываем MessageBox с
push offset szTitle ; результатами
push offset szMessage
push 00h
call MessageBoxA
push 00h ; Завершаем программу
call ExitProcess
PutFound:
mov ecx,0Bh ; Меняем "not found" на
lea esi,nfnd ; "found"; адрес, где нужно
rep movsb ; изменить, находится в EDI
ret
end DetectSoftICE
;---[ CUT HERE ]-------------------------------------------------------------
> Это действительно работает, поверьте мне :). Тот же метод
> можно применить к "враждебным" драйверам, просто проведите
> небольшое исследование.
И подскажите с функцией для этого кода, ну не знаю я Assembler.
← →
oxffff © (2006-09-18 20:01) [26]function Check:boolean;
begin
asm
MOV ebx,fs:[20h];
test ebx,ebx;
jnz @OO;
@NONE: mov result,0;
jmp @exit;
@OO: mov result,1;
@EXIT:
end;
← →
oxffff © (2006-09-18 20:09) [27]Function check2:boolean;
begin
a:=CreateFileA("\\.\NTICE",$0C0000000,1,0,3,$80,0);
if a<>INVALID_HANDLE_VALUE then result:=TRUE
else
begin
CloseHandle(a);
result:=FALSE;
end;
end;
← →
oxffff © (2006-09-18 20:11) [28]a:THANDLE;
← →
oxffff © (2006-09-18 20:16) [29]Сорри перепутал
Function check2:boolean;
var a:THANDLE;
begin
a:=CreateFileA("\\.\NTICE",$0C0000000,1,0,3,$80,0);
if a<>INVALID_HANDLE_VALUE then
begin
CloseHandle(a);
result:=TRUE;
end
else
result:=FALSE;
end;
← →
DiX © (2006-09-18 20:20) [30]Че то не работает
function Check:boolean;
begin
asm
MOV ebx,fs:[20h];
test ebx,ebx;
jnz @OO;
@NONE: mov result,0;
jmp @exit;
@OO: mov result,1;
@EXIT:
end;
end;
условие: если Check=true пишет, что отладчик постоянно присутствует (отладчик не запущен)
условие: если Check=false пишет что программа обратилась к недопустимому адресу и будет закрыта
← →
oxffff © (2006-09-18 20:29) [31]Этот код проверяет значение по fs:[20h];
Если 0, то result:=0. Иначе result:=1;
У меня ошибок не вылетает
← →
DiX © (2006-09-18 20:42) [32]странно
← →
oxffff © (2006-09-18 20:45) [33]Нашел
http://www.wasm.ru/comment.php?artcode=1017001
← →
oxffff © (2006-09-18 20:47) [34]fs:[20h] рулит только в Win9x.
← →
DiX © (2006-09-18 20:49) [35]
function Check:boolean;
begin
asm
MOV ebx,fs:[20h];
test ebx,ebx;
jnz @OO;
@NONE: mov result,0;
jmp @exit;
@OO: mov result,1;
@EXIT:
end;
end;
Надо сюда вставить проверку винты если 9x то все ок, иначе False;
← →
oxffff © (2006-09-18 21:32) [36]VerifyVersionInfo
← →
oxffff © (2006-09-18 21:46) [37]fs:[0] - структура TEB
← →
DiX © (2006-09-19 08:30) [38]а способа определения отладчиков для winNT никто не знает?
← →
Сергей М. © (2006-09-19 09:08) [39]
> DiX © (19.09.06 08:30) [38]
The IsDebuggerPresent function indicates whether the calling process is running under the context of a debugger.
This function is exported from KERNEL32.DLL.
BOOL IsDebuggerPresent(VOID)
Parameters
This function has no parameters.
Return Value
If the current process is running in the context of a debugger, the return value is nonzero.
If the current process is not running in the context of a debugger, the return value is zero.
← →
Barloggg (2006-09-19 09:30) [40]а как насчет многоуровневой обороны?
с некоторых старый игрушках серийник запрашивался несколько раз по мере прохождения игры.
крякер ломал первый слой, потом запускал - все работает. и расслаблялся.
а я как игрок дошел до второго слоя защиты (через неделю игры) и расстроился...
интересно... хоть кто-нибудь из здесь присутствующих пользовался приемом "безумного кода"?
← →
Cash © (2006-09-19 10:11) [41]DiX © (17.09.06 18:27) :
Вариант с API:Function DebuggerPresent: boolean;
Type
TDebugProc = function: boolean; stdcall;
var
Kernel32: HMODULE;
DebugProc: TDebugProc;
begin
Result := False;
Kernel32 := GetModuleHandle("kernel32.dll");
if Kernel32 <> 0 then
begin
@DebugProc := GetProcAddress(Kernel32, "IsDebuggerPresent");
if Assigned(DebugProc) then Result := DebugProc;
end;
end;
← →
Elen © (2006-09-19 11:42) [42]
> DiX
Сами кракеры признаются что ломать мультипоточность - геморрой. Ставь проверки Хеш кода проги в разных потоках и пусть запускаются через некоторое время (например из службы)
← →
oxffff © (2006-09-19 13:00) [43]Ну ну
← →
oxffff © (2006-09-19 13:04) [44]Трудность вызывает. Постоянно шифровка, расшифровка кода,
Для Усложнение снятия dump"a. полиморфный код.
И нетривильные вызовы. Постоянная модификация памяти. Все это с постоянным кодом-мусором.
← →
SPACE!! (2006-09-19 17:35) [45]А ведь отладчики пользуются специфичными API функциями почему нельзя поставить HOOK на них ? И как насчет внедрение DLL в SoftIce ?
← →
DiX © (2006-09-19 19:01) [46]
Function DebuggerPresent: boolean;
Type
TDebugProc = function: boolean; stdcall;
var
Kernel32: HMODULE;
DebugProc: TDebugProc;
begin
Result := False;
Kernel32 := GetModuleHandle("kernel32.dll");
if Kernel32 <> 0 then
begin
@DebugProc := GetProcAddress(Kernel32, "IsDebuggerPresent");
if Assigned(DebugProc) then Result := DebugProc;
end;
end;
При запуске программы из Delphi выдает, что присутствует отладчик, а если запускать просто, то отладчика не обнаруживает (Delphi не закрыт), это нормально?
← →
Ketmar © (2006-09-19 19:19) [47]да. Delphi -- тоже отладчик.
← →
Cash © (2006-09-19 21:25) [48]DiX © (19.09.06 19:01) [46]:
Delphi это не RunTime отладчик, как SoftICE.
Запусти WinDeASM или IDAPro и под ними запусти этот тест, он даст
положительный результат, а если тест запускать просто так и SoftICE-а
нет, то тест даст отрицательный результат.
API нужа только для того, чтобы определить, отлаживается ли программа.
← →
Ketmar © (2006-09-20 15:59) [49]вообще-то "умный" отладчик так просто не обнаружишь. IsDebuggerPresent() всего лишь берёт флаг, который умный отладчик обнуляет. чтобы понять, отаживают ли тебя -- надо лезть глубоко в ливер винды.
← →
DillerXX © (2006-09-20 16:22) [50]Нужно всего-то перехватить эту функцию и возвращять всегда false и всё..
← →
Ketmar © (2006-09-20 16:57) [51]>[50] DillerXX(c) 06-09-20 16:22
>Нужно всего-то перехватить эту функцию
нормальная программа за такое бьёт по рукам.
← →
DiX © (2006-09-24 21:25) [52]А как реализовать защито от OllyDBG?
← →
SergP © (2006-09-24 22:02) [53]> [22] Eraser © (18.09.06 19:36)
> > [19] oxffff © (18.09.06 19:33)
>
> и пусть ломается, главное чтобы кей-ген не сделали, особенно
> если в программе есть ограничение на число пользователей
> в зависимости от лицензии.
НЕ сделают кейген, так патч напишут.... А разница то какая? Все равно взломают....
← →
Ketmar © (2006-09-24 22:40) [54]>[52] DiX(c) 24-Sep-2006, 21:25
>А как реализовать защито от OllyDBG?
вежливо попросить юзера не запускать софтину под отладчиком. всё остальное -- сломают в два счёта, если надо будет.
← →
Eraser © (2006-09-24 22:41) [55]> [53] SergP © (24.09.06 22:02)
разница ОГРОМНАЯ!
← →
Ketmar © (2006-09-24 22:55) [56]>[55] Eraser(c) 24-Sep-2006, 22:41
>разница ОГРОМНАЯ!
да никакой, на самом деле. ну, перестанет работать со следующим билдом -- и что? опять сломают, если надо. вся эта беда у опытных кракеров делается очень быстро.
← →
Eraser © (2006-09-24 23:59) [57]> [56] Ketmar © (24.09.06 22:55)
однако найди мне кряк на последнюю версию того же радмина.. вряд ли удастся.
так что хоть мизерный, но все таки процент тех, кто не хочет покупать продукт, данная мера (частый выпуск билдов) заставит таки купить лицензию.
← →
Ketmar © (2006-09-25 00:01) [58]>[57] Eraser(c) 24-Sep-2006, 23:59
>однако найди мне кряк на последнюю версию того же
>радмина.. вряд ли удастся.
а я и не использовал его никогда. VNC да твой ROM. правда, ROM пришлось снести перед увольнением -- им-то ключа никто не давал. %-)
← →
Eraser © (2006-09-25 00:05) [59]> [58] Ketmar © (25.09.06 00:01)
но все таки есть ряд категорий программ, где усложнение взлома дает таки результат. Пример из жизни - программа для администрирования интернет кафе/игровых залов, владельцу инет кафе (мой знакомы) таки пришлось купить лицензии, потому что задолбался ждать кряки на версии с кретическими обновлениями. А вот если кейген сворганят - гиблое дело..
← →
Ketmar © (2006-09-25 00:09) [60]>[59] Eraser(c) 25-Sep-2006, 00:05
>А вот если кейген сворганят - гиблое дело..
кто мешает в каждой версии менять алгоритм генерации/проверки ключей?
← →
Eraser © (2006-09-25 00:15) [61]> [60] Ketmar © (25.09.06 00:09)
а как же законопослушные юзеры? они же повесятся от того, что постоянно надо новые ключи водить, а я повешусь от того, что каждый раз всем юзерам новые ключи генерить надо будет )
← →
Ketmar © (2006-09-25 00:18) [62]>[61] Eraser(c) 25-Sep-2006, 00:15
>а как же законопослушные юзеры?
пусть программа сама с сайта обновления качает. %-) в смысле -- присылается вместе с ключом дополнительный модуль, жёстко "заточеный" на один ключ, и потом он сам именно этот ключ обновляет. ну и кое-какую служебную информацию правит в главном модуле, например. %-)
← →
Gero © (2006-09-25 00:25) [63]Ограничивать запуск из виртуальной машины нельзя, многие работают под ними. К примеру, я бы такую программу сразу же в топку отправил.
← →
Eraser © (2006-09-25 00:27) [64]> [62] Ketmar © (25.09.06 00:18)
вот только проблема, что постоянный инет не у всех есть. Да и крякнут основной модуль, и он будет "принимать" любые доп. модули :))
← →
Ketmar © (2006-09-25 00:30) [65]>[64] Eraser(c) 25-Sep-2006, 00:27
>Да и крякнут основной модуль, и он
>будет "принимать" любые доп. модули :))
да всё крякнут, всё. потому нечего заморачиваться. %-)
эвон, от "активации" WinXP, например, одни неприятности. знаю множество народу, которые крякают даже лицензионную винду. потому что достаёт. %-)
← →
DrPass © (2006-09-25 00:32) [66]ИМХО, фигня все это. Ну будет в программе функция отлова наличия SoftICE. И что тогда? Хацкер первым делом дотрассирует до ее вызова, отключит ее, а потом продолжит дальше. Эффективнее сделать несколько уровней защиты - один явный и пару скрытых, с запаздыванием в несколько дней/недель. Т.е. первый будет взломан, и душа Злодея умиротворенно отвалит, а слуги Злодея помчат штамповать пиратские диски и продавать их на радиорынках. Юзеры с радостью кинутся покупать эту софтину, ставить ее себе - а тут фигушки! Через пару недель оно все равно начинает ругаться и слать кляузы в Интерпол
← →
Ketmar © (2006-09-25 00:34) [67]ну да. "размазать" защиту по всей программе. причём не вызовом одной процедуры во многих местах, а прямым дубляжом кода.
← →
Eraser © (2006-09-25 00:35) [68]> [65] Ketmar © (25.09.06 00:30)
> да всё крякнут, всё. потому нечего заморачиваться. %-)
во! вот это правильно! об чем и твержу с самого начала ветки ;-)
← →
Gero © (2006-09-25 00:37) [69]> [67] Ketmar © (25.09.06 00:34)
Защита должна быть неразрывной частью программы. Это не дубляж кода, это большее, когда защита растет и развивается вместе с остальным кодом.
← →
Gero © (2006-09-25 00:37) [70]> с остальным кодом
с основным кодом
← →
Gero © (2006-09-25 00:40) [71]> да всё крякнут, всё. потому нечего заморачиваться. %-)
Интересует не столько итог, сколько предшествующее ему положение. А то, по этому логике можно не мыться, не стричься, не чистить зубы. Да и вобще не жить, все равно умирать ведь.
← →
DrPass © (2006-09-25 00:43) [72]
> Защита должна быть неразрывной частью программы
ДА! В идеально защищенной программе кроме защиты вообще ничего не должно быть. И спор "если встретятся идеально защищенная программа и идеальный хакер, то кто кого сделает?" до сих пор одолевает умы лучших философов мира
← →
Ketmar © (2006-09-25 01:03) [73]>[69] Gero(c) 25-Sep-2006, 00:37
>Защита должна быть неразрывной частью программы.
и во сколько встанет разработка и поддержка? нафиг-нафиг. %-)
← →
DiX © (2006-09-25 17:38) [74]Я согласен против хороших хакеров/крекеров большинство защит бессильно, но они отстраняют от кода программы всяких начинающих. Незащещенную программу может вскрыть любой школьник умеющий пользоваться отладчиком. Если ваша программа выполняет какие-либо финансовые операции то лучше подойти к ее защите с умом и как можно грамотней все зделать.
← →
Eraser © (2006-09-25 17:50) [75]> [74] DiX © (25.09.06 17:38)
> Если ваша программа выполняет какие-либо финансовые операции
> то лучше подойти к ее защите с умом и как можно грамотней
> все зделать.
каким образом это связано с тем, что программа выполняет финансовые операции?
Страницы: 1 2 вся ветка
Текущий архив: 2006.10.15;
Скачать: CL | DM;
Память: 0.67 MB
Время: 0.044 c