저작권 침해나 소프트웨어의 무단 변조로부터 소프트웨어를 보호하는 일은 어려운 일이다. 개발자는 비즈니스 모델에 맞는 라이센스 기법을 결정해야 하고 그것을 구현해야 한다. 윈칙적으로 프로그램의 무단변조를 막는 일은 불가능에 가깝다. 여기서는 프로그램의 무단 변조의 속도를 느리게 하거나 귀찮게 하는 방법을 논의해 보고자 한다.
{
UInt16 card, attributes;
LocalID dbID;
SysCurrAppDatabase(&card, &dbID);
if (dbID != NULL) {
DmDatabaseInfo(card, dbID, NULL, &attributes, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL);
attributes |= dmHdrAttrCopyPrevention;
DmSetDatabaseInfo(card, dbID, NULL, &attributes, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL);
}
}
#define SERIALNUMBER 12345
#define incorrectSerialAlert 1001
{
codeEntered = StrAToI(strCode);
if (codeEntered != SERIALNUMBER)
FrmAlert(incorrectSerialAlert);
else
registered = true;
}
#define nagScreenAlert 1000
{
FrmAlert(nagScreenAlert);
}
#include <System/DLServer.h>
{
CharPtr username =
(Char *)MemPtrNew(dlkUserNameBufSize * sizeof(Char));
DlkGetSyncInfo(NULL,NULL,NULL,&username,NULL,NULL);
...
MemPtrFree(username);
}
Boolean checkRegistered()
{
Boolean result = false;
// check user registration (using appropriate technique)
...
return result;
}
KPUG에서 초보가 하는 간단한 크래킹을 읽고 Omar님과 이런저런 이야기 나눴던 걸 정리해 봤습니다.
// 작성자: 자손김/김성남
// MultiUserHack DB에 내 프로그램이 등록되어 있다면 MultiUserHack의 DB의 내 Creator ID를 변경한다.
static void FakeMultiUserHack()
{
Err error;
UInt32 muuaType = 'DATA';
UInt32 muuaCreator = 'MuUa';
UInt16 openMode = dmModeReadWrite;
DmOpenRef dmRef;
// Creator Field variable
MemHandle hCreator;
char *pRecord;
UInt16 nMultiUserHackNums, nMultiUserHackIndex;
char strGetCreator [5] = "";
char strFileCreator[] = "CasC"; // 내프로그램의 CreatorID
char strFakeCreator[] = "CsCa"; // 변경할 CreatorID
UInt16 nCreatorSize = sizeof(strFileCreator) - 1;// * StrLen(strFakeCreator);
dmRef = DmOpenDatabaseByTypeCreator (muuaType, muuaCreator, openMode);
if (dmRef != 0 ) {
// MultiUserHack의 Records개수를 알아낸수
nMultiUserHackNums = DmNumRecords (dmRef);
// Records 개수만큼 검색을 한다.
for ( nMultiUserHackIndex = 0; nMultiUserHackIndex < nMultiUserHackNums; nMultiUserHackIndex++ ) {
hCreator = DmGetRecord (dmRef, nMultiUserHackIndex);
if (hCreator) {
pRecord = (char *) MemHandleLock(hCreator);
MemMove(strGetCreator, pRecord, nCreatorSize);
// 내 프로그램의 CreatorID가 있다면 "0"일때...
if(StrCompare (strGetCreator, strFileCreator) == 0) {
// 속일 CreatorID를 써줌
MemMove(pRecord, strFakeCreator, sizeof(strFakeCreator));
}
MemHandleUnlock(hCreator);
DmReleaseRecord (dmRef, nMultiUserHackIndex, false);
}
}
DmCloseDatabase(dmRef);
}
}