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)环境
另外本人小白一枚,若本帖有什么不对的地方,还望指出…………
软件下载地址:点我下载 本帖算法过于简单,希望各位小白先自己尝试 不会写注册机,我爆破了
给个试出来的验证码
9999999AB
顺序随便放 仔细看看好像是看懂了。
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') 像我这种小白,帖子都看不懂,只能膜拜大佬水帖子了 哇,610大神可以,刚发就给破了,学习学习 苏紫方璇 发表于 2018-1-31 19:42
像我这种小白,帖子都看不懂,只能膜拜大佬水帖子了
大神别闹,我要继续抱你的大腿~~嗯~~根部…………好多腿毛………………
像我这种小白,帖子都看不懂,只能膜拜大佬水帖子了 假装看懂了,但是还是有点没明白{:1_908:} 610100 发表于 2018-1-31 19:55
像我这种小白,帖子都看不懂,只能膜拜大佬水帖子了
大神还是不要谦虚啦:loveliness: 真的很简单,欢迎小白尝试 说的很清楚,对小白一针见血