Ps出来的小赵 发表于 2018-1-31 19:21

IPADR算法分析-一款很适合小白分析算法的软件

本帖最后由 zhaozdy 于 2018-2-1 15:06 编辑

和上一个帖子一样,这也是个适合我等小白的帖子。
什么?算法分析?别逗,我等小白怎么可能会这个……
不,不,不,我也是小白,我能行,你也能行的,只要你有很基础的汇编基础(不会也没关系,可以百度或者问大佬),还有相对多的时间。(因为我等作为小白,弄清楚个算法真是太他喵的费时间了,虽然只是简单的算法)


首先,这个软件算法很简单,真的很简单,欢迎小白尝试。


本贴相对简单(我就是来水贴的),各位大佬请略过,我是为像我这样的小白服务的。


首先至于找关键的地方,我就不啰嗦了,这软件也不难,不懂得可以参考我上一个帖子
直达电梯:https://www.52pojie.cn/thread-689921-1-1.html


直接贴算法,真的很简单,但是为了水贴……你懂的

00405F54|.E8 BF1C0800   call IPAdr.00487C18
00405F59|.8B4D C0       mov ecx,                     ;ntdll.7C92DC9C
00405F5C|.64:890D 00000>mov dword ptr fs:,ecx
00405F63|.E9 83010000   jmp IPAdr.004060EB                     ;(以下内容数字什么的全部说的是十六进制的)
00405F68|>33C0          xor eax,eax                              ;EAX置零
00405F6A|.8945 B4       mov ,eax                     ;LOCAL 19变量置零(从下面看出LOCAL 19是一次循环运算的结果寄存)
00405F6D|.33D2          xor edx,edx                              ;edx置零
00405F6F|.8955 AC       mov ,edx                     ;LOCAL 21置零(从下面看出 LOCAL 21是循环次数-1)
00405F72|>8B4D AC       /mov ecx,                      ;ecx置零 ECX是循环次数-1
00405F75|.0FBE440D 94   |movsx eax,byte ptr ss:    ;这里太长,请看注释1
00405F7A|.0345 B4       |add eax,                      ;注册码相应指针的数据和上一次循环的结果相加,并放回eax
00405F7D|.83C0 CB       |add eax,-0x35                           ;将上面的结果-35,如果小于0则溢出
00405F80|.8945 B4       |mov ,eax                      ;将最终运算结果放到local 19
00405F83|.FF45 AC       |inc                         ;local 21数据加1(也就是循环次数)
00405F86|.837D AC 0A    |cmp ,0xA                      ;循环次数与10比较
00405F8A|.^ 7C E6         \jl short IPAdr.00405F72               ;上面小于10,则跳转实现,等于10,则跳转不实现
00405F8C|.837D B4 4A    cmp ,0x4A                      ;将最终的运算结果local 19与4A比较
00405F90|.74 48         je short IPAdr.00405FDA                  ;等于4A,则注册码正确,跳;反之则不跳。
00405F92|.6A 30         push 0x30
00405F94|.B9 86A74800   mov ecx,IPAdr.0048A786
00405F99|.BA 5FA74800   mov edx,IPAdr.0048A75F
00405F9E|.A1 08F94800   mov eax,dword ptr ds:
00405FA3|.8B00          mov eax,dword ptr ds:
00405FA5|.E8 8E1B0800   call IPAdr.00487B38
00405FAA|.8B55 BC       mov edx,
00405FAD|.8B82 00030000 mov eax,dword ptr ds:
00405FB3|.8B10          mov edx,dword ptr ds:
00405FB5|.FF92 C0000000 call dword ptr ds:
00405FBB|.FF4D DC       dec
00405FBE|.8D45 FC       lea eax,
00405FC1|.BA 02000000   mov edx,0x2
00405FC6|.E8 4D1C0800   call IPAdr.00487C18
00405FCB|.8B4D C0       mov ecx,                     ;ntdll.7C92DC9C
00405FCE|.64:890D 00000>mov dword ptr fs:,ecx
00405FD5|.E9 11010000   jmp IPAdr.004060EB
00405FDA|>66:C745 D0 2C>mov word ptr ss:,0x2C          ;能跳到这里说明注册码正确了,下面就不分析了
00405FE0|.BA 01000080   mov edx,0x80000001
00405FE5|.8B45 A4       mov eax,
00405FE8|.E8 631B0800   call IPAdr.00487B50
00405FED|.66:C745 D0 38>mov word ptr ss:,0x38



这里是注释1的解释:
movsx这个比较尴尬,对我等小白来说不友善啊,这里软件注册码是ASCII码,也就是说ASCII码的1,对应的是十六进制的31;ASCII码的2,对应的是十六进制的32;ASCII码的A,对应的是十六进制的41;ASCII码的F,对应的是十六进制的46;
movsx的意思是   比如一个AX的高低位AH,AL,AL里的最高位为1,则AH全部为1;若AL里的最高位为0,则AH全部为0。什么?看不懂?没关系,我会举例子的。

我是例子:

那么回到这个软件,我们的注册码是1-F的话,就算是F的话,二进制也是01000110,AL的最高位也只能是0,所以可以当作MOV考虑。
好,究竟什么意思呢?

movsx eax,byte ptr ss:   EBP是保存在EBP中的指针位置,ECX是循环次数-0,0x6C就是要减去的值,具体什么意思呢?看下图



图中最初的EBP是0012F1D8,也就是左下角20这个位置,当第一次循环的时候,ECX是0,那么0012F1D8-6C,
就是指针0012F16C,也就是画红框46的那个位置,也就是注册码ASCII F对应的16进制数值46,当第二次循环的时候,就是取的0012F16D,也就是注册码第二位,画红框右边的那个46。

好了,分析就这样,总结一下就是


假如注册吗为x1 x2 x3 x4 x5 x6 x7 x8 x9 x10当然,这里用的是十六进制,最终注册码要换回ASCII码那么运算方法就是
x1(必须大于35)-35+x2(结果必须大于35)-35+x3(结果必须大于35)-35+……x10(结果必须大于35)-35=4A


为什么必须大于35?不大于35,减去35之后就溢出了

也就是一个十元1次函数了……好了,分析完毕,就是那么简单。


什么?注册机?别闹!对于我等不会任何编程语言的小白来说怎么会写注册机……这种事情还是交给610吧

特别感谢@610100的认真搞基,有什么困难大家可以尽情找他。
特别感谢@C-FBI-QM   @苏紫方璇   两位大神对我的指导
特别感谢论坛为我等小白提供的学(gao)习(ji)环境


另外本人小白一枚,若本帖有什么不对的地方,还望指出…………


软件下载地址:点我下载               本帖算法过于简单,希望各位小白先自己尝试

610100 发表于 2018-1-31 19:24

不会写注册机,我爆破了
给个试出来的验证码
9999999AB
顺序随便放

whyida 发表于 2018-2-1 12:31

仔细看看好像是看懂了。

import random
key=input('输入0获取序列号:')
S ='L1234567890-=QWERTYUIOP[]\ASDFGHJKL;\'ZXCVBNM,./!@#$%^&*()_+qwertyuiop{}|asdfghjkl:"zxcvbnm<>?'
S_len=len(S)
while(key=="0"):
   
    for i in range(0,S_len,1):
      a1 = S
      for i in range(0,S_len,1):
      
            a2 = S
            a3 = S
            a4 = S                           
            a5 = S
            a6 = S
            a7 = S
            a8 = S
            a9 = S                              
            a10 =S

            m = ord(str(a1))+ord(str(a2))+ord(str(a3))+ord(str(a4))+ord(str(a5))+ord(str(a6))+ord(str(a7))+ord(str(a8))+ord(str(a9))+ord(str(a10))-int('35',16)*10
            if m==74:
                print ('SN :    '+a1+a2+a3+a4+a5+a6+a7+a8+a9+a10)
               
                key2=input('输入任何数继续:')

else:
    print ('输入0')

苏紫方璇 发表于 2018-1-31 19:42

像我这种小白,帖子都看不懂,只能膜拜大佬水帖子了

Niacker、Li 发表于 2018-1-31 19:42

哇,610大神可以,刚发就给破了,学习学习

Ps出来的小赵 发表于 2018-1-31 19:48

苏紫方璇 发表于 2018-1-31 19:42
像我这种小白,帖子都看不懂,只能膜拜大佬水帖子了

大神别闹,我要继续抱你的大腿~~嗯~~根部…………好多腿毛………………

610100 发表于 2018-1-31 19:55


像我这种小白,帖子都看不懂,只能膜拜大佬水帖子了

tntop0 发表于 2018-1-31 19:57

假装看懂了,但是还是有点没明白{:1_908:}

Niacker、Li 发表于 2018-1-31 21:05

610100 发表于 2018-1-31 19:55
像我这种小白,帖子都看不懂,只能膜拜大佬水帖子了

大神还是不要谦虚啦:loveliness:

ygfygf_888 发表于 2018-1-31 21:30

真的很简单,欢迎小白尝试

oljbd7alyel 发表于 2018-1-31 21:32

说的很清楚,对小白一针见血
页: [1] 2 3 4
查看完整版本: IPADR算法分析-一款很适合小白分析算法的软件