delphi4arab منتديات دلفي للعرب
تشغيل ملف في الذاكرة ،،، وحدة uExecFromMem - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : تشغيل ملف في الذاكرة ،،، وحدة uExecFromMem (/showthread.php?tid=5353)

الصفحات: 1 2


تشغيل ملف في الذاكرة ،،، وحدة uExecFromMem - mahmoud2hack - 30-06-2013

كيف أقوم بوضع تلك الودحة في برنامج ثم أقوم بأستدعائها ؟
رابط الوحدة :
كود :
https://sites.google.com/site/delphibasics/home/delphibasicssnippets/uexecfrommembysteve10120-fixedforwin7x64bytestest
وهي خاصة بتشغيل ملف في الذاكرة


تشغيل ملف في الذاكرة ،،، وحدة uExecFromMem - onexite - 01-07-2013

PHP كود :
ExecuteFromMem(Browser, '', @Buffer[1]); 
Browser مسار المتصفح لتحقن الكود
buffer هو ByteArray ملفك
انظر الى هذا
http://delphi4arab.net/forum/showthread.php?tid=7837


تشغيل ملف في الذاكرة ،،، وحدة uExecFromMem - mahmoud2hack - 04-07-2013

لدي 3 سورسات لبرامج تشفير منهم واحد من صنعي ( فاشل بالطبع )


تشغيل ملف في الذاكرة ،،، وحدة uExecFromMem - بن دهيبة - 04-07-2013

وعليكم السلام ورحمة الله تعالى وبركاته

يقول المثل:

لا تعلمني اكل السمك و لكن علمني كيف اصطاده

أتعلم نقطة البداية من الأسمبلى

محاولة لمعرفة مستوى الحماية التى أضعها لبرنامج أصنعه بنفسي
قمت بصنع ملف فيه حماية بالدالفي ثم حاولة فك الحماية
حيث كانت الحماية هي تعطيل البرنامج بعد تاريخ معين
قمت بفتح الملف بواسطة notepad-plus-plus
ثم غيرة التاريخ وحفظته
وبعد ذالك شغلة ملف الذي صنعته
وكانت المفاجئة
لقد تم فك الحماية
والملف شغال مئة بالمئة
------------------
لم أكن أتصور أن اختراق ملف أصنعه بهذه السهولة وبهذه البساطة.
-----------------
مدة انجاز الملف التنفيذى قد تساوي أشهر
ومدة الاختراق قد تساوي دقائق
-----------------
فهمت شيئ واحد وهو تعلم الاختراق


تشغيل ملف في الذاكرة ،،، وحدة uExecFromMem - CID_01 - 05-07-2013

[color="sienna"]أخي لا تيأس فهذه المشكلة من المشاكل التي إن لم تصادفها فلن تصير مبرمجا جيدا
فالبرمجة هي حل مشاكل
اخي بانسبة لمشكلتك حلها في نقص الخبرة في هذا المجال فهذا النوع من البرامج صعب نوعا ما لذا
عليك بتعلم التشفير من الاساس واول شيء عليك تعلمه هو التعامل مع السترينغ او السلاسل النصية في الدلفي فهي اساس التشفير
ثم انظمة العد وبعض الاساسيات الاخرى وبعدها صنع البرنامج سيكون سهلا بإذن الله
وفقك الله أخي [/color]


تشغيل ملف في الذاكرة ،،، وحدة uExecFromMem - SMP3 - 05-07-2013

و عليكم السلام Smile
----------------------------------------------------
أولا : لقد قمت بالقاء نظرة سريعة على مشروعك المرفق ..
كتباتك للمشروع خاطئة ... ؟؟؟؟؟ لماذا ؟
التعامل مع الملفات سواء لغرض التشفير أو لأي غرض آخر لا يتم باستعمال النوع 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;

  
FileSize := GetFileSize(hFile, 0);
  
GetMem(Buffer, FileSize);
  
ZeroMemory(Buffer, FileSize); { Clean Buffer }

  
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; 



تشغيل ملف في الذاكرة ،،، وحدة uExecFromMem - mahmoud2hack - 05-07-2013

SMP3 كتب :كتباتك للمشروع خاطئة ...
ألف شكر
الدالة لها 2 بارمتر ،، البارمتر الاول AFile من النوع PChar ، وهو الذي سيحمل قيم الملف ،،، كيف سأقوم بالتعويض عنه برابط الملف ؟ حيث أن رابط الملف من النوع String
كذلك البارمتر الاخر ،، كيف أقوم بأستدعائه داخل الـــ Memo ?
وحولت الملف الي ؟ الي Pchar ? وما هي الــ Pchr ?

LoadFile('Test.exe',Memo1);
أعوض Test.exe ب؟ أقصد أضع رابط الملف أم ماذا ؟
هل أحول PChar الي String مثلا ؟؟؟
Pchrtostr() لكن لا توجد كذلك علي ما أعتقد
أضطريت أن أضع مسار البرنامج يدويا :

LoadFile('C:\Users\MarzoOk\Desktop\Project1.exe',Memo1);


تشغيل ملف في الذاكرة ،،، وحدة uExecFromMem - SMP3 - 05-07-2013

عوض Test.exe بمسار الملف كاملا
يمكن التحويل :
PHP كود :
var s:string; 
begin
... 
LoadFile(PChar(s),Memo1);
end; 



تشغيل ملف في الذاكرة ،،، وحدة uExecFromMem - onexite - 05-07-2013

PHP كود :
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);

end; 



تشغيل ملف في الذاكرة ،،، وحدة uExecFromMem - mahmoud2hack - 05-07-2013

سؤال أخير
لو أردت أن أربط الدالة السابقة التي تقوم بتحويل الملف الي 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; 
فكيف تقوم تلك الدوال بتحويل الملف الي String ؟