d8ln3x 发表于 2018-4-13 11:00:11

oMega Commander2.3破解及注册算法分析

本帖最后由 d8ln3x 于 2018-4-13 11:07 编辑

软件下载:http://pylonos.com/download/omega/oMega_2.3.14.4267.exe

1、安装软件后用Exeinfo和PEID查看相关信息,显示无壳、Delphi 2014写的程序

2、运行程序About窗口显示notregistered!

2、OD加载程序,运行尝试注册,弹出错误提示窗口。通过字符搜索、F12暂停法、对ShowWindow\CreateWindow\CreateWindowExW等API下断,没有找到合适突破口。3、利用OD脚本对delphi事件下断点后,尝试注册,程序被断下来。4、进行调用栈回溯,同时F8单步运行,并注意堆栈以及寄存器面板上数据信息。经过多次调用栈回溯后,在如下位置找到注册信息,猜测已经接近程序注册代码。


5、对注册信息的相应内存位置下硬件访问断点,在kernelbase.dll模块中断下来,查看调用栈,发现是将license字符串进行宽字符转多字节:

6、对转换后的字符串下硬件访问断点,继续运行,程序断下来:

7、F8单步这段程序发现是对注册的name进行一些计算处理,非常可疑,并且有几处循环调用。继续执行程序,从这段程序运行返回上一层后,寄存器面板上发现一些字符串信息,有可能是真license。将该字符串“7a7oueemvh9qvfwhx” copy出来,尝试注册了一下,注册成功。



8、将注册信息删除后,重新注册,继续跟踪注册验证代码。重新来到license生成的代码段,下一个call就是验证license,代码比较短,分析如下:


9、接下来是关键跳转,验证call返回0,则通过PostMessageW函数给注册窗口发送验证通过的消息(MSG=0x499),否则发送验证失败消息(MSG=0x496)。
10、几种爆破方法:
a) 0x007DCCA9处calloMega32.00408C94==> 直接返回0
b) 0x007DCCAE处jnz short oMega32.007DCCC6==> nop掉
c) 0x007DCCCA 处将发送验证失败消息0x496==> 改为0x499
d)......


11、license算法分析:



12、生成注册码的代码实现:int main(void)
{
      WCHAR name[] = L"d8ln3x";
      char sz_src[] = "e9k@nG~3jxIo)b0S3";
      char sz_license = {0};
      DWORD T1 = { 0x11, 0x6b, 0x49, 0x0d, 0x0b, 0x03 };
      // 11 00 00 00 6B 00 00 00 49 00 00 00 0D 00 00 00 0B 00 00 00 03 00 00 00

      UINT name_bytes_len = sizeof(name) - sizeof(WCHAR);//去掉尾部0
      UINT src_len = sizeof(sz_src) - sizeof(char);
      int data = 0;
      for (int i = 0, idx = 0; i < name_bytes_len; i++)
      {
                if ((i + 1) & 1)
                {
                        data += T1 * (((char *)name));
                }
                else {
                        data -= T1 * (((char *)name));
                }
                if (++idx > 5)
                {
                        idx = 0;
                }
      }

      UINT name_len2 = name_bytes_len - 1;
      for (int i = 0, idx = 1, j = name_len2; i < src_len; i++)
      {
                int tmp = 0;
                tmp += T1 * sz_src;
                tmp += T1 * j;
                tmp += T1 * (((char *)name) + ((char *)name));
                char lic_byte;
                UINT mdata = (data + tmp) % 0x24;
                if (mdata >= 0x1A)
                {
                        lic_byte = mdata + 0x16;
                }
                else {
                        lic_byte = mdata + 0x61;
                }
                sz_license = lic_byte;

                if (++idx > 5) {
                        idx = 0;
                }
                if (--j < 0)
                {
                        j = name_len2;
                }
      }
      printf("\"%ws\" license key is: %s\n", name, sz_license);
}


运行结果:

追梦 发表于 2018-4-13 11:06:40

羡慕会算法的大神

d8ln3x 发表于 2018-4-13 11:11:15

追梦 发表于 2018-4-13 11:06
羡慕会算法的大神

我也是菜鸟。。。呵呵。。

阳光宅男 发表于 2018-4-13 12:08:55

厉害了大表哥,羡慕算法大神
页: [1]
查看完整版本: oMega Commander2.3破解及注册算法分析