استفسار حول كود بحث بصيغة hex لقيم
#1
السلام عليكم

كيف البحث عن قيمة هيكس مينة احددها للبرنامج مهما كان ترقيمها بالاوفست يعنى لا يشترط تحديد اوفست معين لها
وبعدها يقوم بتحديد مثلا 10 او 20 بايت بعدها ويستخرجهم داخل memo
مرفق صورة
[صورة: CmYuyA.jpg]
الرد
#2
و عليكم السلام و رحمة الله
راجع اخي هذه المشاركة رقم 22... الملفات المصدرية للأداة SlugMRT

http://www.delphi4arab.net/forum/showthr...733&page=3
الرد
#3
بارك الله فيك يا اخى

كيف احدد مثلا 300 بايت بعد الاوفت المحدد مباشرة ويعرضهم داخل ميمو
الرد
#4
السلام عليكم
هدا حل
الدالة الأولى ترجع عنوان أول أفسيت في السلسلة الممررة
الدالة الثانية ترجع سلسلة نصية والتي هي في الأصل البايتات التي تم حصرها

PHP كود :
function FindByHexStr(const AFile, AHexStr: string): Integer;
  function 
HexStr2ChrStr(HexStr: string): string;
  var
    
I: Integer;
    
S: string;
  
begin
    
for I := 1 to Length(HexStr) do
    
begin
      S 
:= S + HexStr[I];
      if 
I mod 2 = 0 then
      begin
        Result 
:= Result + Chr(StrToInt('$' + S));
        
S := '';
      
end;
    
end;
  
end;
var
  
MS: TMemoryStream;
  
FileSize: Integer;
  
Buffer: string;
begin
  Result 
:= -1;
  
MS := TMemoryStream.Create;
  try
    
MS.LoadFromFile(AFile);
    
FileSize := MS.Size;
    
SetLength(Buffer, FileSize);
    
MS.Read(Buffer[1], FileSize);
    try
      
Result := Pos(HexStr2ChrStr(AHexStr), Buffer) - 1;
    
except
      
// Error
    
end;
  finally
    
MS.Free;
  
end;
end;

{
Usage:
Edit1.Text := IntToStr(FindByHexStr('C:\Test.exe', '4D5A500002'));
}

function 
GetHexStrByOffset(AFile: string; const AOffsetB, AOffsetE: Integer):
  
string;
var
  
MS: TMemoryStream;
  
I, FileSize: Integer;
  
Buffer: array of Byte;
begin
  Result 
:= '';
  
MS := TMemoryStream.Create;
  try
    
MS.LoadFromFile(AFile);
    
FileSize := AOffsetE - AOffsetB + 1;
    
SetLength(Buffer, FileSize);
    
MS.Position := AOffsetB;
    
MS.Read(Buffer[0], FileSize);
    try
      for 
I := 0 to Pred(FileSize) do
      
begin
        Result 
:= Result + IntToHex(Buffer[I], 2);
      
end;
    
except
      
// Error
    
end;
  finally
    
MS.Free;
  
end;
end;

{
Usage:
Memo1.Text := GetHexStrByOffset('C:\Test.exe', 5, 300);
} 
سبحان الله وبحمده سبحان الله العظيم
الرد
#5
بارك الله فيك اخى
الدالة الاولى بكود الاستعمال تعمل بشكل ممتاز ولاكن الدالة التانية و يقراء من بعد الاوفست الناتج داخل الاديت ب 7 بايت مثلا
القيمة داخل اللاديت تبدا من 47621
كيف يبدا تحديد من بعد تلك القيمة ب7 بايت لتكون بداية التحديد والعرض داخل الميمو ب عد تلك القيمة وليس اول الملف
و استعمال opendlg وليس تحديد ملف داخل مسار معين
شكرا
الرد
#6
ستكون هكذا
PHP كود :
var
  
Offset: Integer;
begin
  Edit1
.Text :=  IntToStr(FindByHexStr('C:\Test.exe', '4D5A500002'));
  
Offset := StrToInt(Edit1.Text) + 7;
  
Memo1.Text := GetHexStrByOffset('C:\Test.exe', Offset, 300);
end; 


الملفات المرفقة
.7z   HxViewer.7z (الحجم : 1.72 ك ب / التحميلات : 44)
سبحان الله وبحمده سبحان الله العظيم
الرد
#7
اقل ما يقال عنك انك رائع

لك كل التقدير ولاكن لدى استفسار بسيط لماذا اقوم بادخال القيمة يدويا فى الاديت 2 طالما استطيع ان اجعل البرنامج يطبعها بشكل الى
الرد
#8
الأمر راجع إليك
الفكرة عندك وأكمل
سبحان الله وبحمده سبحان الله العظيم
الرد
#9
كل الشكر والتقدير لك ساتمها بعون الله
احترامى لك ياغالى
الرد
#10
سؤال اخير اخى الغالى استعملت
SizeFrag:=390
لاحدد بة قيمة بايت التحديد ولاكن اقع فى الخطاء البرمجى
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم