好吧,我必须使用不同的检查来检查程序的汇编代码,以检查“密钥”是否有效。他们称之为asm代码是通过C ++
extern "C" unsigned int EsLicenciaValida(unsigned int licencia[]);
lincencia是由“ - ”分隔的6个32位十六进制数字,例如,一个应该正常工作的
A213457B-3746DFA3-578EC20E-4567DFF2-08A1B3AC-7B125F3A
问题是我无法使它工作,据我所知,我检查一切都是正确的(nots,xors,ands ......)但我知道我的行动方式有问题通过数组,我不知道如何解决它,因为我的老师分配他们没有正确教导的东西......
.386
.model flat, C
.code
; Completar el procedimiento
EsLicenciaValida PROC
push EBP
PUSH EBX
mov [EBP], ESP
ADD EBP, [EBP+8]
MOV EAX, 0
;1
MOV EBX, [EBP]
NOT EBX ;NOT TMP
MOV EAX, EBX
jmp FIN
;2
MOV EBX, [EBP+4] ; EBX -> R2
OR EAX, EBX ; OR TMP, R1
;3
MOV EBX, [EBP+4*2] ; EBX -> R2
XOR EAX, EBX ; XOR TMP, R2
;4
MOV EBX, [EBP+4*3] ; EBX -> R3
NOT EBX ; NOT R3
XOR EAX, EBX ;XOR TMP, NOT(R3)
NOT EAX ; NOT(TMP XOR NOT(R3))
;5
MOV EBX, [EBP+4*4] ; EBX -> R4
OR EAX, EBX ; TMP OR R4
;6
MOV EBX, [EBP+4*5] ; EBX -> R5
CMP EBX, EAX
JZ CONSECUENTE
MOV EAX, 0
JMP FIN
CONSECUENTE:
MOV EAX, 1
FIN:
POP EBX
POP EBP
ret
EsLicenciaValida ENDP
END
感谢您的建议,我希望有人可以帮助解决这个问题。
答案 0 :(得分:0)
我不完全明白你想要达到的目标,所以我创建了下一个程序:
接下来是汇编代码,注意注释,它们将帮助您了解如何访问数组参数并访问其项目:
.386
.model flat, C
.code
;-------------------------------------------------------
EsLicenciaValida proc
;PRESERVE EBP, ESI.
push ebp
push esi
mov eax, 0 ;RETURN VALUE (ZERO MEANS OK).
mov ebp, esp
add ebp, 12 ;GET PARAMETER'S ADDRESS.
mov esi, [ ebp ] ;ESI POINTS TO ARRAY.
whil:
mov al, [ esi ] ;GET CURRENT CHAR.
cmp al, 0 ;CHECK END OF ARRAY.
je finale ;IF ( AL == 0 ) JUMP.
;CHECK IF CURRENT CHAR IS HEX (0..9,A..F).
cmp al, '-'
je its_valid ;IF ( AL == '-' ) VALID.
cmp al, '0'
jb its_invalid ;IF ( AL < '0' ) INVALID.
cmp al, '9'
jbe its_valid ;IF ( AL <= '9' ) VALID.
cmp al, 'A'
jb its_invalid ;IF ( AL < 'A' ) INVALID.
cmp al, 'F'
jbe its_valid ;IF ( AL <= 'F' ) VALID.
jmp its_invalid ;INVALID BECAUSE AL > 'F'.
its_valid:
;NEXT CHAR TO PROCESS.
inc esi
jmp whil
its_invalid:
mov eax, 1 ;RETURN VALUE (ONE MEANS ERROR).
finale:
;RESTORE EBP, ESI.
pop esi
pop ebp
ret ;RETURNS VALUE IN EAX.
EsLicenciaValida endp
;-------------------------------------------------------
end
接下来是我如何从Visual Studio C ++控制台项目中调用它:
extern "C" unsigned int EsLicenciaValida ( char * arr );
...
char arr[] = "A213457B-3746DFA3-578EC20E-4567DFF2-08A1B3AC-7B125F3A";
int x = EsLicenciaValida( arr );
一旦你得到“x”的结果,你可以检查它是0还是1并显示一条消息或其他东西。下图显示了程序集文件在项目中的位置: