• 0
The Hidden Ghost

كيف أقارن بين سلسلتين حرفيتين مكونتين من 16 حرفا ؟

سؤال

السلام عليكم ، لقد واجهتني مشكلة في مقارنة سلسلتين حرفيتين طولهما 16 حرفا، و هذا هو الكود الذي لم يشتغل معي . لا أعرف لما لا يعمل ... .

 

.486.model flat,stdcalloption casemap:noneinclude windows.incinclude kernel32.incinclude user32.incincludelib kernel32.libincludelib user32.lib.dataGetPassword           db           16 dup(0)CorrectPassword       db           20h,20h,20h,20h,20h,20h,20h,"Congratulations you are entered a correct password",0BadPassword           db           20h,20h,20h,20h,20h,20h,20h,"By your life, you are entered a bad password !!!",0AboutMe               db           20h,20h,20h,20h,20h,20h,20h                      db           "Created By Hamza Qdider @:)",0Ah,0Dh,0Ah,0Dh                      db           "I'm the Hidden Ghost in the Life, I'm the Trojan Horse in the Computers",0Ah,0Dh,0Ah,0Dh                      db           20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,"So I'm not a virus as you think :)",0AboutMeCaption        db           "@ About the Creator @",0DialogIdName          db           "MANAGER",0ClearBox              db           00H,0Password              db           "0123456789ABCDEF",0.constButton_ID             equ          5hPassword_ID           equ          3hShowPassword_ID       equ          4hPasswordAnalyser_ID   equ          6h.codeWproc proto :dword,:dword,:dword,:dwordstart : invoke GetModuleHandle,0invoke DialogBoxParam,eax,addr DialogIdName,0,Wproc,0invoke ExitProcess,0Wproc proc hwnd:dword,msg:dword,wparam:dword,lparam:dword		.if msg == WM_COMMAND			mov eax,wparam				.if ax == Button_ID					invoke GetDlgItemText,hwnd,Password_ID,addr GetPassword,16				    push offset GetPassword		    pop esi		    ;;invoke MessageBox,0,eax,0,MB_OK		    cmp esi,offset Password		    je IsCorrect		    jmp IsNotCorrect		    						IsNotCorrect : 						invoke SetDlgItemText,hwnd,PasswordAnalyser_ID,addr BadPassword			invoke SetDlgItemText,hwnd,Password_ID,addr ClearBox			mov GetPassword,00h			ret						IsCorrect :						invoke SetDlgItemText,hwnd,PasswordAnalyser_ID,addr CorrectPassword			invoke SetDlgItemText,hwnd,Password_ID,addr ClearBox			mov GetPassword,00h			ret					.endif	.endif		.if msg == WM_CLOSE				invoke MessageBox,hwnd,addr AboutMe,addr AboutMeCaption,MB_OK + MB_ICONINFORMATION		invoke EndDialog,hwnd,0		ret			.endif			     invoke GetDlgItemText,hwnd,Password_ID,addr GetPassword,16	     invoke SetDlgItemText,hwnd,ShowPassword_ID,addr GetPassword		xor eax,eax	retWproc endpend start

 

المرجو إفادتي بالحل أو على الأقل ذكر مكامن الخطأ في برنامجي (أعني في الكود) ... إليكم البرنامج :

SecurityManager.rar

تم تعديل بواسطه محمد عودة
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

8 إجابة على هذا السؤال .

  • 0

هذه المقارنة ليست صحيحة:

 

            push offset GetPassword            pop esi            ;;invoke MessageBox,0,eax,0,MB_OK            cmp esi,offset Password

 

فأنت تقارن بين عنوان النص GetPassword و Password، قد يكون النص GetPassword في العنوان 0x11223344 و Password في 0x11223300. يمكنك مقارنة محتويات ذلك العنوانين بايت ببايت أو إستدع الدالة lstrcmp:

 

.486.model flat,stdcalloption casemap:noneinclude windows.incinclude kernel32.incinclude user32.incincludelib kernel32.libincludelib user32.lib.dataGetPassword           db           16 dup(0)BadPassword           db           20h,20h,20h,20h,20h,20h,20h,"By your life, you are entered a bad password !!!",0AboutMe               db           20h,20h,20h,20h,20h,20h,20h                      db           "Created By Hamza Qdider @:)",0Ah,0Dh,0Ah,0Dh                      db           "I'm the Hidden Ghost in the Life, I'm the Trojan Horse in the Computers",0Ah,0Dh,0Ah,0Dh                      db           20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,20h,"So I'm not a virus as you think :)",0AboutMeCaption        db           "@ About the Creator @",0DialogIdName          db           "MANAGER",0ClearBox              db           00H,0Password              db           "0123456789ABCDEF",0CorrectPassword       db           "Congratulations you are entered a correct password",0.constButton_ID             equ          5hPassword_ID           equ          3hShowPassword_ID       equ          4hPasswordAnalyser_ID   equ          6h.codeWproc proto :dword,:dword,:dword,:dwordstart :invoke GetModuleHandle,0invoke DialogBoxParam,eax,addr DialogIdName,0,Wproc,0invoke ExitProcess,0Wproc proc hwnd:dword,msg:dword,wparam:dword,lparam:dword        .if msg == WM_COMMAND            mov eax,wparam                .if ax == Button_ID                    ; start            invoke GetDlgItemText, hwnd,Password_ID, addr GetPassword, 17            invoke lstrcmp, addr GetPassword, addr Password            test eax, eax            je IsCorrect            jmp IsNotCorrect            ; end                        IsNotCorrect :                        invoke SetDlgItemText,hwnd,PasswordAnalyser_ID,addr BadPassword            invoke SetDlgItemText,hwnd,Password_ID,addr ClearBox            mov GetPassword,00h            ret                        IsCorrect :            invoke SetDlgItemText,hwnd,PasswordAnalyser_ID,addr CorrectPassword            invoke SetDlgItemText,hwnd,Password_ID,addr ClearBox            mov GetPassword,00h            ret                    .endif    .endif        .if msg == WM_CLOSE                invoke MessageBox,hwnd,addr AboutMe,addr AboutMeCaption,MB_OK + MB_ICONINFORMATION        invoke EndDialog,hwnd,0        ret            .endif                 invoke GetDlgItemText,hwnd,Password_ID,addr GetPassword,16         invoke SetDlgItemText,hwnd,ShowPassword_ID,addr GetPassword        xor eax,eax    retWproc endpend start

 

أيضاً لديك خطأ في الدالة GetDlgItemText، الدالة تتطلب طول النصّ + 1 = 17 بينما أنت تمرر لها 16.

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا لك أخي Mr.B على الرد ، نعم هنا يكمن الخطأ ، لكنني أريد مقارنة النصين بدون استعمال الدالة lstrcmp كما في لغة السي . أريد فعل ذلك عن طريق الregisters ، هل من طريقة أخرى علما أنك ذكرت قبل قليل طريقة لمقارنة عنوانين في الذاكرة بايت ببايت . هل يمكنك أن تريني هذه الطريقة في مثال بسيط و شكرا ... + هل المسجلات التالية خاصة بالنصوص [ESI,EDI,ESP] على حد علمي ؟

 

 

وشكرا لك مرة أخرى أخي الغالي ... :D

تم تعديل بواسطه Hamza+C+ASM
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لاتوجد هناك مسجلات للنصوص، يمكنك تعديل الجزء الذي بين start و end لـ:

 

            ; start            invoke GetDlgItemText, hwnd,Password_ID, addr GetPassword, 17            xor eax, eax                        ; صفّر المسجل            xor ecx, ecx                        ; صفّر المسجلPasswordCheck:            cmp ecx, 17                         ; هل وصلنا للحرف رقم 17؟            je  IsCorrect                       ; النصين متطابقين            mov al, byte ptr[GetPassword+ecx]   ; تكافئ al = GetPassword[ecx]            cmp al, byte ptr[Password+ecx]      ; تكافئ if( al == Password[ecx] )            jne IsNotCorrect                    ; إذا لم يساوي إعرض رسالة الخطأ            inc ecx                             ; تكافئ ecx++            jmp PasswordCheck                   ; إرجع لحلقة التكرار            ; end
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا لك أخي Mr.B ، طريقتك سهلة مثلما نتعامل مع  المصفوفات الحرفية في لغة السي ... :P

ولأبرهن لك أنني فهمت طريقتك سأقدم لك هذا المثال البسيط بالسي و مقابله بالأسمبلي في انتظار ردك عليه ... :lol:

 

int main (){char pass[] = "ABCDEF";if( pass[2] == 'C' ) goto correctelse goto notcorrectcorrect:// your code herenotcorrect:// your code here}
.datapass DB "ABCDEF",0.codebegin : mov al,byte ptr[pass + 2 ]cmp al,43hje correctjmp notcorrectcorrect:;; your code herenotcorrect:;;your code hereend begin

 

وشكرا على التوضيح مرة أخرى ...

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

زد على كود Mr. B سطر للتحقق من طول السلسلة المدخلة، فإن كان طولها يختلف عن طول كلمة السر المخزنة في برنامجك فلا داعي للمتابعة.

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

نعم أخي Xacker ، هذه فكرة جيدة فهي تسهل المأمورية أكثر ، شكرا لك أخي .... :P

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يمكنك استخدام التعليمه cmpsb  مع البادئة repxx للمقارنة بين نصين، أيضا يوجد cmpsw و cmpsd و cmpsq

 

 

و الله ولي التوفيق

تم تعديل بواسطه C++er
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا لك أخي علاء على هذه المداخلة الجميلة :)  - أتمنى أن لا أكون قد أخطأت في الإسم أخي- :P

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .