محاولة لمعرفة مستوى الحماية التى أضعها لبرنامج أصنعه بنفسي
قمت بصنع ملف فيه حماية بالدالفي ثم حاولة فك الحماية
حيث كانت الحماية هي تعطيل البرنامج بعد تاريخ معين
قمت بفتح الملف بواسطة notepad-plus-plus
ثم غيرة التاريخ وحفظته
وبعد ذالك شغلة ملف الذي صنعته
وكانت المفاجئة
لقد تم فك الحماية
والملف شغال مئة بالمئة
------------------
لم أكن أتصور أن اختراق ملف أصنعه بهذه السهولة وبهذه البساطة.
-----------------
مدة انجاز الملف التنفيذى قد تساوي أشهر
ومدة الاختراق قد تساوي دقائق
-----------------
فهمت شيئ واحد وهو تعلم الاختراق
[color="sienna"]أخي لا تيأس فهذه المشكلة من المشاكل التي إن لم تصادفها فلن تصير مبرمجا جيدا
فالبرمجة هي حل مشاكل
اخي بانسبة لمشكلتك حلها في نقص الخبرة في هذا المجال فهذا النوع من البرامج صعب نوعا ما لذا
عليك بتعلم التشفير من الاساس واول شيء عليك تعلمه هو التعامل مع السترينغ او السلاسل النصية في الدلفي فهي اساس التشفير
ثم انظمة العد وبعض الاساسيات الاخرى وبعدها صنع البرنامج سيكون سهلا بإذن الله
وفقك الله أخي [/color]
و عليكم السلام
----------------------------------------------------
أولا : لقد قمت بالقاء نظرة سريعة على مشروعك المرفق ..
كتباتك للمشروع خاطئة ... ؟؟؟؟؟ لماذا ؟
التعامل مع الملفات سواء لغرض التشفير أو لأي غرض آخر لا يتم باستعمال النوع String .. لماذا ؟
السبب يعود لكون أن التعرف على نهاية نص String في الذاكرة عن طريق البايت السحري صفر 0 (null terminated string)
بمعنى أنك لن تجد أي نص string به بايت = 0
سبب حصولك على Mzp فقط هو وجود الصفر بعد حرف ال p ...هل اتضحت المعلومة !!
نرجع لموضوعنا : ان أردت التعامل مع الملفات (تشفير , ضغط ...) يتوجب عليك استعمال أصناف أخرى غير الصنف string
يمكن استعمال المصفوفات من نوع Byte أو يمكن استعمال المؤشرات Pointer
هذا مثال بسيط لقرائة ملف وعرضه في الكائن Memo
كود :
http://im32.gulfup.com/qMHpz.png
PHP كود :
function LoadFile(AFile: PChar;AMemo:TMemo): Boolean; var hFile: HWND; bw: DWORD; FileSize: Integer; Buffer: Pointer; i: Integer; P: PByte; F: Byte; s: string; begin Result := True; hFile := CreateFile(AFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if hFile = INVALID_HANDLE_VALUE then begin Result := False; Exit; end;
Result := ReadFile(hFile, Buffer^, FileSize, bw, 0); s := ''; P := PByte(Buffer); for i := 0 to FileSize do begin F := P^; if F <> 0 then s := s + Char(F) else s := s + '.'; Inc(P); end; AMemo.Text := s; CloseHandle(hFile); FreeMem(Buffer, FileSize); end;
procedure TForm3.Button1Click(Sender: TObject); begin LoadFile('Test.exe',Memo1); end;
ألف شكر
الدالة لها 2 بارمتر ،، البارمتر الاول AFile من النوع PChar ، وهو الذي سيحمل قيم الملف ،،، كيف سأقوم بالتعويض عنه برابط الملف ؟ حيث أن رابط الملف من النوع String
كذلك البارمتر الاخر ،، كيف أقوم بأستدعائه داخل الـــ Memo ?
وحولت الملف الي ؟ الي Pchar ? وما هي الــ Pchr ?
LoadFile('Test.exe',Memo1);
أعوض Test.exe ب؟ أقصد أضع رابط الملف أم ماذا ؟
هل أحول PChar الي String مثلا ؟؟؟
Pchrtostr() لكن لا توجد كذلك علي ما أعتقد
أضطريت أن أضع مسار البرنامج يدويا :
var Form1: TForm1; bigstring:AnsiString; implementation
{$R *.dfm} function XorStr(Stri, Strk: String): String; var Longkey: string; I: Integer; Next: char; begin for I := 0 to (Length(Stri) div Length(Strk)) do Longkey := Longkey + Strk; for I := 1 to length(Stri) do begin Next := chr((ord(Stri[i]) xor ord(Longkey[i]))); Result := Result + Next; end; end;
function FileToString(const AFileName: string): AnsiString; var f: TFileStream; l_onexite: Integer; begin Result := ''; f := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite); try l_onexite := f.Size; if l_onexite > 0 then begin SetLength(Result, l_onexite); F.ReadBuffer(Result[1], l_onexite); end; finally F.Free; end; end;
function StringToFile(const FileName: string; const Text: AnsiString): boolean; var f: integer; begin result := false; f := FileCreate(FileName); if f>=0 then try if Text<>'' then FileWrite(f,Text[1],length(Text)); result := true; finally FileClose(f); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin if opendialog1.Execute then begin edit1.Text := opendialog1.FileName ; bigstring :=FileToString(opendialog1.FileName); end end;
procedure TForm1.Button3Click(Sender: TObject); var str : AnsiString ; begin // مجرد تجربة وهي خاظئة برمجيا عليك بحفظه في مكان ما واعد فك تشفيره str:=XorStr(bigstring,'onexite') ; dlgSave1.DefaultExt:='exe'; if not dlgSave1.Execute then Exit; StringToFile(dlgSave1.FileName,str); end;
procedure TForm1.btn1Click(Sender: TObject); begin dlgSave1.DefaultExt:='exe'; if not dlgSave1.Execute then Exit; StringToFile(dlgSave1.FileName,bigstring);
سؤال أخير
لو أردت أن أربط الدالة السابقة التي تقوم بتحويل الملف الي Pchar ،، بدالة تشفير مثل تلك الدالة مثلا :
PHP كود :
function FileToString(const AFileName: string): AnsiString; var f: TFileStream; l_onexite: Integer; begin Result := ''; f := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite); try l_onexite := f.Size; if l_onexite > 0 then begin SetLength(Result, l_onexite); F.ReadBuffer(Result[1], l_onexite); end; finally F.Free; end;
محاولة الاستدعاء بالكود الاتي :
PHP كود :
XorStr(LoadFile('Test.exe',Memo1),'onexite')
لا يتم الاستدعاء بصورة صحيحة !
وأنت حولت الملف الي ؟ ما هي الــ Pchar ؟
وكيف لا يمكنني تحويل الملف الي String ؟ علي الرغم من أنني رأيت دوال كثيرة تقوم بذلك ؟
مثل تلك :
PHP كود :
function FileToString(const AFileName: string): AnsiString; var f: TFileStream; l_onexite: Integer; begin Result := ''; f := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite); try l_onexite := f.Size; if l_onexite > 0 then begin SetLength(Result, l_onexite); F.ReadBuffer(Result[1], l_onexite); end; finally F.Free; end; end;
و :
PHP كود :
function FileToStr(sPath:string; var sFile:string):Boolean; var hFile: THandle; dSize: DWORD; dRead: DWORD; begin Result := FALSE; hFile := CreateFile(PChar(sPath), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0); if hFile <> 0 then begin dSize := GetFileSize(hFile, nil); if dSize <> 0 then begin SetFilePointer(hFile, 0, nil, FILE_BEGIN); SetLength(sFile, dSize); if ReadFile(hFile, sFile[1], dSize, dRead, nil) then Result := TRUE; CloseHandle(hFile); end; end; end;