zoukankan      html  css  js  c++  java
  • UltraEdit注册机原理简单说明

    UltraEdit注册机原理

    By:大志若愚

      UltraEdit 是 Windows 下一款流行的老牌文本/HEX 编辑器(非开源)。UltraEdit 正被移植到 Linux 平台。该移植名为 UEX,意即 UltraEdit for Linux。UEX具有原生的 Linux 外观,其界面、配置、热键等与 Windows 版并无二致。对其破解以注册机为最,本文简单的解释了下破解原理。

          本文仅仅只是对UltraEdit注册机的反编译,了解UltraEdit注册机的原理。

      闲着无事反编译了——UltraEdit注册机,了解了其中的原理。以简单的WinForm程序展示给大家,最主要的无非是对用户码1、用户码2的加密,也可以说是解密[无非对谁来说罢了]

      界面如下:

           

      编辑环境:Microsoft Visual Studio 2010

      C#源码百度网盘下载地址:http://pan.baidu.com/s/1ehpKU

    核心代码展示:

     

    1 // num1为用户码一,num2为用户码二,返回的为验证码一,验证码二不变。
    2 public long GetKey(long num1, long num2)
    3 
    4 {
    5   return (((((((((num1 >> 0x13) & 15) * 0x57a8) + (((num1 >> 8) & 0x1f) * 0x50af)) + (((num1 >> 13) & 0x3f) * 0x1694)) + (((num1 >> 0x17) & 0xff) * 0x300)) + ((num1 & 0xff) * 3)) + (num2 * 2)) + 0xb200c0); 
    6 }

    呵呵,来拆分下:

    (
        (
            (
                (
                    (
                        (
                            (((num1 >> 0x13) & 15) * 0x57a8) 
                            + (((num1 >> 8) & 0x1f) * 0x50af)
                        ) 
                        + (((num1 >> 13) & 0x3f) * 0x1694)
                    ) 
                    + (((num1 >> 0x17) & 0xff) * 0x300)
                ) 
                + ((num1 & 0xff) * 3)
            ) 
            + (num2 * 2)
        ) 
        + 0xb200c0
    )

    呵呵,来分析下:

      最好的方法就是让num1=num2=0,直接得出返回值:0xb200c0即十进制数:11665600

      当num1与num1足够小(取0x13,8,13,0x17中的最小值:8)的时候,小于等于8位[2^9-1]的时候就可以看做没有移位操作了,因为此时的移位操作会使该小项为0。

    其中:

    计算器只能识别和处理2进制数,所以计算机对2进制的处理速度最快,但是相同位数,二进制表示范围最小,但是8进制,16进制转为2进制的速度远远高于10进制数(虽然这个时间差我们感觉不出来,但确实很大),所以一般处理采取16进制数了。

    数的含义:

      我把:16进制数转为了10进制数,其实计算器对2进制数的识别比较高,速度最快,

      16进制数转为2进制数速度也很快,16位数的一位对应2进制数的4位。

        比如:0x6=0110[2进制]

      0x:开头表示16进制数,0开头则表示8进制数,没有特殊说明一般就是10进制数了。

        0x13=19

        0x57a8=22440

        0x1f=31

        0x50af=20655

        0x3f=63

        0x1694=5780

        0x17=23

        0xff=255

        0x300=768

        0xb200c0=11665600

    运算符的含义:

      >> 右移运算符

        位运算,操作对象为位即(0/1)

          该运算符为双目运算符,

        结合方向:从左到右

              作用:

           把一个整型数的所有位向右移动指定的位数,移动到右边界之外的多余二进制位会被丢弃,并从左边界移入0。

          右移运算的两个操作数应为整数类型:

            第一个操作数是要进行移位操作的数

            第二个操作数指定第一个操作数移动的位数。

            如果第二个操作数等于0则不发生任何移位。

         应用举例:

            问:计算表达式14 >> 2的值。

            答:表达式14 >> 2的值为3,因为14(即二进制的00001110)向右移两位等于3(即二进制的00000011)。

      &  :按位与

        位运算,操作对象为位即(0/1)

        该运算符为双目运算符,

        规则:

          1&1=1; 1&0=0; 0&1=0; 0&0=0

    这里就是进行移位和与操作,其中“位”操作改变大小,而“与”操作则改变其逻辑---ture & true = 1,这样实现的加密比较不容易破解,但是还是有某位“大神”破解了,本人只是偷看了他的代码,在这里感谢下他。

        呵呵,有点眉目了吧,观摩下。以后可以自己写写属于自己的加密算法。

        如果不想让自己的代码被别人看到,就需要加下“壳”了。

     

  • 相关阅读:
    linux删除/var/log/下面所有日志 如何重新记录日志
    DIV里的内容自动换行
    it冲突:commit your changes or stash them before you can merge. 解决办法
    git切换到远程分支
    【异常】warning: refname 'feature1.3.0' is ambiguous.导致git merge失败
    在此篇文章中,我们将用 15 分钟对 PHP v7.x 版本更改进行简要回顾
    input元素所有type类型及相关作用
    微信自动关闭内置浏览器页面,返回公众号窗口 WeixinJSBridge.call('closeWindow')
    css背景渐变色
    数组的forEach和map和for方法的区别
  • 原文地址:https://www.cnblogs.com/liushen/p/3354710.html
Copyright © 2011-2022 走看看