-
-
[求助]关于负数取模的问题
-
发表于:
2008-7-27 08:59
8317
-
最近下载了Pediy_CrackMe_2007合集,试着练习了一下,写了一个注册机,却遇到了一个问题:当在注册机的用户名处输入字符串 “wangxi’an” 时,得出的序列号不对(用其他的用户名好像都可以),后来自己跟踪了一下,发现是负数求模的问题,具体如下:
这是我在OllyDBG中截取的代码:(这是一个循环,对用户名的每个字符串进行计算,当计算到 “’” 字符时,我写的注册机程序和CM有出入了)
004013F2 |> /8B55 10 /mov edx, dword ptr [ebp+10]
004013F5 |. |0FBE3C1A |movsx edi, byte ptr [edx+ebx]
004013F9 |. |8B75 FC |mov esi, dword ptr [ebp-4]
004013FC |. |89D9 |mov ecx, ebx
004013FE |. |C1E1 02 |shl ecx, 2
00401401 |. |89DA |mov edx, ebx
00401404 |. |29D1 |sub ecx, edx
00401406 |. |0FB68C0D E1FE>|movzx ecx, byte ptr [ebp+ecx-11F]
0040140E |. |89FA |mov edx, edi
00401410 |. |31CA |xor edx, ecx
00401412 |. |89F1 |mov ecx, esi
00401414 |. |0FAFCB |imul ecx, ebx
00401417 |. |29F1 |sub ecx, esi
00401419 |. |89CE |mov esi, ecx
0040141B |. |83F6 FF |xor esi, FFFFFFFF
0040141E |. |8DB432 4D0100>|lea esi, dword ptr [edx+esi+14D]
00401425 |. |8B4D 0C |mov ecx, dword ptr [ebp+C]
00401428 |. |89DA |mov edx, ebx
0040142A |. |83C2 03 |add edx, 3
0040142D |. |0FAFCA |imul ecx, edx
00401430 |. |0FAFCF |imul ecx, edi
00401433 |. |89F0 |mov eax, esi
00401435 |. |01C8 |add eax, ecx
00401437 |. |B9 0A000000 |mov ecx, 0A ;当算到此处时,eax中的值为FFFFFC84,也就是十进制的-892(我的程序是用十进制编写的)
0040143C |. |31D2 |xor edx, edx
0040143E |. |F7F1 |div ecx
00401440 |. |83C2 30 |add edx, 30 ;此处取FFFFFC84对0A的模,结果为4,而对应到我的程序中,此处为-892对10取模,结果为-2,出错了。
00401443 |. |88941D FCFEFF>|mov byte ptr [ebp+ebx-104], dl
0040144A |. |0FB6BC1D FCFE>|movzx edi, byte ptr [ebp+ebx-104]
00401452 |. |81F7 ACAD0000 |xor edi, 0ADAC
00401458 |. |89DE |mov esi, ebx
0040145A |. |83C6 02 |add esi, 2
0040145D |. |89F8 |mov eax, edi
0040145F |. |0FAFC6 |imul eax, esi
00401462 |. |B9 0A000000 |mov ecx, 0A
00401468 |. |F7F9 |idiv ecx
0040146A |. |83C2 30 |add edx, 30
0040146D |. |88941D FCFEFF>|mov byte ptr [ebp+ebx-104], dl
00401475 |> |3B5D 0C cmp ebx, dword ptr [ebp+C]
00401478 |.^\0F8C 74FFFFFF \jl 004013F2
If (i - 1) * 4 - i < 0 Then
code = Asc(Mid(strcon, (i - 1) * 4 - i + 1, 1))
code = code Xor Asc(Mid(username, i, 1))
temp = Not (sum * (i - 1) - sum)
temp = length * (i - 1 + 3) * Asc(Mid(username, i, 1))
code = ((code Mod 10) + 48) Xor 44460 ;此处code Mod 10出错(我想其实不仅仅是 “wangxi’an” 这一个字符串会出错,只要取模时code为负都会错)
code = ((code * (i - 1 + 2)) Mod 10) + 48
strtemp = strtemp & Chr(code)
总结起来就是:为什么相同的被除数,相同的除数,只是一个是十进制,一个是十六进制,取模得到的结果会不同呢?是由于补码的原因吗?碰到这种情况该如何解决呢?谢谢!(我表达能力很差,不知说清楚了没,如果没看懂的话,就请把附件下下来看吧,麻烦各位了!)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!