الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه The Hidden Ghost في 6 فبراير 2013 · 8 رد · 1,527 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

 

.486
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc

includelib kernel32.lib
includelib user32.lib

.data

GetPassword           db           16 dup(0)
CorrectPassword       db           20h,20h,20h,20h,20h,20h,20h,"Congratulations you are entered a correct password",0
BadPassword           db           20h,20h,20h,20h,20h,20h,20h,"By your life, you are entered a bad password !!!",0
AboutMe               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 :)",0
AboutMeCaption        db           "@ About the Creator @",0
DialogIdName          db           "MANAGER",0
ClearBox              db           00H,0
Password              db           "0123456789ABCDEF",0



.const

Button_ID             equ          5h
Password_ID           equ          3h
ShowPassword_ID       equ          4h
PasswordAnalyser_ID   equ          6h

.code

Wproc proto :dword,:dword,:dword,:dword

start : 

invoke GetModuleHandle,0
invoke DialogBoxParam,eax,addr DialogIdName,0,Wproc,0
invoke ExitProcess,0

Wproc 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
	ret

Wproc endp

end start

 

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

SecurityManager.rar

تم تعديل هذه المشاركة بواسطة محمد عودة في 6 فبراير 2013 في 08:11

rS3eY.png
#2

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

 

            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,stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc

includelib kernel32.lib
includelib user32.lib

.data

GetPassword           db           16 dup(0)
BadPassword           db           20h,20h,20h,20h,20h,20h,20h,"By your life, you are entered a bad password !!!",0
AboutMe               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 :)",0
AboutMeCaption        db           "@ About the Creator @",0
DialogIdName          db           "MANAGER",0
ClearBox              db           00H,0
Password              db           "0123456789ABCDEF",0

CorrectPassword       db           "Congratulations you are entered a correct password",0

.const

Button_ID             equ          5h
Password_ID           equ          3h
ShowPassword_ID       equ          4h
PasswordAnalyser_ID   equ          6h

.code

Wproc proto :dword,:dword,:dword,:dword

start :

invoke GetModuleHandle,0
invoke DialogBoxParam,eax,addr DialogIdName,0,Wproc,0
invoke ExitProcess,0

Wproc 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
    ret

Wproc endp

end start

 

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

2
#3

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

 

 

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

تم تعديل هذه المشاركة بواسطة Hamza+C+ASM في 6 فبراير 2013 في 13:40

rS3eY.png
#4

لاتوجد هناك مسجلات للنصوص، يمكنك تعديل الجزء الذي بين 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
#5

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

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

 

int main ()
{

char pass[] = "ABCDEF";

if( pass[2] == 'C' ) goto correct
else goto notcorrect

correct:

// your code here

notcorrect:

// your code here

}
.data

pass DB "ABCDEF",0

.code

begin : 

mov al,byte ptr[pass + 2 ]
cmp al,43h
je correct
jmp notcorrect

correct:

;; your code here

notcorrect:

;;your code here

end begin

 

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

1
rS3eY.png
#6

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

1

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#7

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

rS3eY.png
#8

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

 

 

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

تم تعديل هذه المشاركة بواسطة C++er في 10 فبراير 2013 في 19:57

1

مدونتي: C++ Tips and Tricks

#9

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

rS3eY.png

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…