本帖最后由 zhaozdy 于 2018-2-1 15:06 编辑
和上一个帖子一样,这也是个适合我等小白的帖子。
什么?算法分析?别逗,我等小白怎么可能会这个……
不,不,不,我也是小白,我能行,你也能行的,只要你有很基础的汇编基础(不会也没关系,可以百度或者问大佬),还有相对多的时间。(因为我等作为小白,弄清楚个算法真是太他喵的费时间了,虽然只是简单的算法)
首先,这个软件算法很简单,真的很简单,欢迎小白尝试。
本贴相对简单(我就是来水贴的),各位大佬请略过,我是为像我这样的小白服务的。
首先至于找关键的地方,我就不啰嗦了,这软件也不难,不懂得可以参考我上一个帖子
直达电梯:https://www.52pojie.cn/thread-689921-1-1.html
直接贴算法,真的很简单,但是为了水贴……你懂的
[Asm] 纯文本查看 复制代码 00405F54 |. E8 BF1C0800 call IPAdr.00487C18
00405F59 |. 8B4D C0 mov ecx,[local.16] ; ntdll.7C92DC9C
00405F5C |. 64:890D 00000>mov dword ptr fs:[0],ecx
00405F63 |. E9 83010000 jmp IPAdr.004060EB ; (以下内容数字什么的全部说的是十六进制的)
00405F68 |> 33C0 xor eax,eax ; EAX置零
00405F6A |. 8945 B4 mov [local.19],eax ; LOCAL 19变量置零(从下面看出LOCAL 19是一次循环运算的结果寄存)
00405F6D |. 33D2 xor edx,edx ; edx置零
00405F6F |. 8955 AC mov [local.21],edx ; LOCAL 21置零(从下面看出 LOCAL 21是循环次数-1)
00405F72 |> 8B4D AC /mov ecx,[local.21] ; ecx置零 ECX是循环次数-1
00405F75 |. 0FBE440D 94 |movsx eax,byte ptr ss:[ebp+ecx-0x6C] ; 这里太长,请看注释1
00405F7A |. 0345 B4 |add eax,[local.19] ; 注册码相应指针的数据和上一次循环的结果相加,并放回eax
00405F7D |. 83C0 CB |add eax,-0x35 ; 将上面的结果-35,如果小于0则溢出
00405F80 |. 8945 B4 |mov [local.19],eax ; 将最终运算结果放到local 19
00405F83 |. FF45 AC |inc [local.21] ; local 21数据加1(也就是循环次数)
00405F86 |. 837D AC 0A |cmp [local.21],0xA ; 循环次数与10比较
00405F8A |.^ 7C E6 \jl short IPAdr.00405F72 ; 上面小于10,则跳转实现,等于10,则跳转不实现
00405F8C |. 837D B4 4A cmp [local.19],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:[0x48F908]
00405FA3 |. 8B00 mov eax,dword ptr ds:[eax]
00405FA5 |. E8 8E1B0800 call IPAdr.00487B38
00405FAA |. 8B55 BC mov edx,[local.17]
00405FAD |. 8B82 00030000 mov eax,dword ptr ds:[edx+0x300]
00405FB3 |. 8B10 mov edx,dword ptr ds:[eax]
00405FB5 |. FF92 C0000000 call dword ptr ds:[edx+0xC0]
00405FBB |. FF4D DC dec [local.9]
00405FBE |. 8D45 FC lea eax,[local.1]
00405FC1 |. BA 02000000 mov edx,0x2
00405FC6 |. E8 4D1C0800 call IPAdr.00487C18
00405FCB |. 8B4D C0 mov ecx,[local.16] ; ntdll.7C92DC9C
00405FCE |. 64:890D 00000>mov dword ptr fs:[0],ecx
00405FD5 |. E9 11010000 jmp IPAdr.004060EB
00405FDA |> 66:C745 D0 2C>mov word ptr ss:[ebp-0x30],0x2C ; 能跳到这里说明注册码正确了,下面就不分析了
00405FE0 |. BA 01000080 mov edx,0x80000001
00405FE5 |. 8B45 A4 mov eax,[local.23]
00405FE8 |. E8 631B0800 call IPAdr.00487B50
00405FED |. 66:C745 D0 38>mov word ptr ss:[ebp-0x30],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+ecx-0x6C] 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)环境
另外本人小白一枚,若本帖有什么不对的地方,还望指出…………
软件下载地址: 点我下载 本帖算法过于简单,希望各位小白先自己尝试 |