首页
社区
课程
招聘
[求助]关于负数取模的问题
发表于: 2008-7-27 08:59 8317

[求助]关于负数取模的问题

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

    00401403  |. |42            |inc     edx

    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

    00401467  |. |99            |cdq

    00401468  |. |F7F9          |idiv    ecx

    0040146A  |. |83C2 30       |add     edx, 30

0040146D  |. |88941D FCFEFF>|mov     byte ptr [ebp+ebx-104], dl
    00401474  |. |43            |inc     ebx

00401475  |> |3B5D 0C        cmp     ebx, dword ptr [ebp+C]
    00401478  |.^\0F8C 74FFFFFF \jl      004013F2

    这是我对应的VB注册机程序源代码:

    For i = 1 To length

        If (i - 1) * 4 - i < 0 Then

          code = 0

        Else

          code = Asc(Mid(strcon, (i - 1) * 4 - i + 1, 1))

        End If

        code = code Xor Asc(Mid(username, i, 1))

        temp = Not (sum * (i - 1) - sum)

        code = code + temp + 333

        temp = length * (i - 1 + 3) * Asc(Mid(username, i, 1))

        code = code + temp

        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)

    Next i

    总结起来就是:为什么相同的被除数,相同的除数,只是一个是十进制,一个是十六进制,取模得到的结果会不同呢?是由于补码的原因吗?碰到这种情况该如何解决呢?谢谢!(我表达能力很差,不知说清楚了没,如果没看懂的话,就请把附件下下来看吧,麻烦各位了!)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可能我写的太啰嗦了,简单地说,就是-892模10=-2,-892转换成十六进制为FFFFFC84,10转换成十六进制为A,而FFFFFC84模A却=4了,这是为什么呢?
2008-7-27 13:12
0
雪    币: 247
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
十进制取模比较简单。

-892转换为十六进制的过程是:
(0X100000000-892)=(0X100000000-0X37C)=0xFFFFFC84
所以:
(0X100000000-892)mod(10)
=(0X100000000-0X37C)mod(0X0A)
=(0X100000000)mod(0X0A) - (0X37C)mod(0X0A)
=6-2
=4

哈哈,这样就能够解释了。
2008-7-27 15:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
首先非常感谢您的讲解!确实是可以解释我提的问题了。
可-9用这种方法算的话:
(0x10000000-9)=(0x10000000-0x9)=0xFFFFFFF7
所以:
(0x10000000-9)mod(10)
=(0x10000000-0x9)mod(0xA)
=(0x10000000)mod(0xA)-(0x9)mod(0xA)
=6-9
=-3
而(0xFFFFFFF7)mod(0xA)却=7
请问是不是我哪里又算错了呢?
2008-7-27 15:52
0
雪    币: 440
活跃值: (61)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
0040143E  |. |F7F1          |div     ecx
是无符号除法指令.........

在你的注册机代码里加个判断负数的句子.......

是负数的就先转十六进制数再转换十进制后再进行求余...........

比如:

if  num< 0 then
str = Hex(num)
num = CDec("&H" & str) mod 10
end if
2008-7-27 16:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
原来如此,问题终于解决了,谢谢各位大侠的帮忙!
2008-7-27 17:20
0
雪    币: 247
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
正解,刚才我在路上还在向我讲得有点不对,主要是关于有符号数和无符号数的差别~~~
感谢
2008-7-27 18:16
0
雪    币: 247
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
8
取模算法
(a)mod(10)=-3和(a)mod(10)=7是等价的!!!
2008-7-27 18:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
恩,再次谢谢你们,我已经完全弄懂了。
2008-7-27 18:25
0
游客
登录 | 注册 方可回帖
返回
//