洋洋不得意 发表于 2020-1-21 17:01

某文本编辑器逆向

本帖最后由 洋洋不得意 于 2020-1-21 18:17 编辑

editplus 4.3
官网 https://www.editplus.com/

逆向算法后得到如下代码
#include <stdio.h>
#include <windows.h>


wchar_t table;
wchar_t word_5F73E0;

void initTable()
{
      int i = 0;
      for (; i < 0x100; ++i)
      {
                int v = i;
                CharUpperW((wchar_t*)&v);
                table = v;
      }
}

int sub_4D9470(int a, char* buff, int size)
{
      if (0 == size)
                return 0;

      int t = a;
      for (int i = 0; i < size; ++i)
      {
                int _esi = t & 0xff;
                t = t >> 8;
                _esi ^= buff;
                t ^= word_5F73E0;
      }
      return t;
}

int sub_4D94B0(char* buff, int buffSize, wchar_t* str, int strSize)
{
      char* t = buff;
      for (int i = 0; i < strSize; ++i)
      {
                int wSize = sprintf_s(buff, buffSize, "%04X", str);
                buff += wSize;
                buffSize -= wSize;
      }
      return buff - t;
}

void init5F73E0()
{
      memset(word_5F73E0, 0, 0x200);

      for (int i = 0; i < 0x100; ++i)
      {
                int _ecx = 1;
                int _eax = 0xc0c1;

                do
                {
                        if (i & _ecx)
                        {
                              word_5F73E0 ^= _eax & 0xffff;
                        }
                        _eax += _eax;
                        _eax ^= 0x4003;
                        _ecx += _ecx;
                } while (_ecx < 0x100);
      }
}

bool compute(char* account, char* passwd)//校验算法
{
      int accLenth = strlen(account);
      int passwdLenth = strlen(passwd);

      init5F73E0();

      int computeNum = sub_4D9470(0, (char*)account, accLenth);
      char buff;
      sprintf(buff, "%02X", computeNum);
      char* p = (char*)passwd;
      if (p != buff)
      {
                return false;
      }
      if (p != buff)
      {
                return false;
      }

      computeNum = sub_4D9470(0, &p, passwdLenth - 2);
      sprintf(buff, "%02X", computeNum);

      if (p != buff)
      {
                return false;
      }
      if (p != buff)
      {
                return false;
      }
      return true;
}

void getPasswd(char* account, char* passwd)//注册机算法
{
        int accLenth = strlen(account);

        init5F73E0();
        int computeNum = sub_4D9470(0, (char*)account, accLenth);


        char tmp;
        sprintf(tmp, "%02X", computeNum);
        passwd = tmp;
        passwd = tmp;

        strcpy(passwd + 4, "123456");
        computeNum = sub_4D9470(0, passwd + 2, 8);
        sprintf(tmp, "%02X", computeNum);
        passwd = tmp;
        passwd = tmp;

        for (int i = 0; i < 10; ++i)
        {
                char t = passwd;
                for (int j = 0; j < 0x100; ++j)
                {
                        if (t == table)
                        {
                                passwd = j;
                                break;
                        }
                }
        }
}
int main()
{
      initTable();
        char account = "fdas54fdsa";


        char pd;
        getPasswd(account, pd);

        printf("password:%s\n", pd);      return 0;
}


雨夜故园 发表于 2020-2-12 10:36

HighBox 发表于 2020-1-21 17:04

某文本指的是???

zhu0797zhu 发表于 2020-1-21 17:33

不错,谢谢分享

洋洋不得意 发表于 2020-1-21 17:50

HighBox 发表于 2020-1-21 17:04
某文本指的是???

editplus 4.3
官网 https://www.editplus.com/

洋洋不得意 发表于 2020-1-21 18:13

本帖最后由 洋洋不得意 于 2020-1-21 18:18 编辑

注册出来的密码格式为 XXXX123456 :lol:lol

setycyas 发表于 2020-1-22 00:29

这个编辑器还是不错的,注册一个有益

ballhou 发表于 2020-1-22 16:58

请问大神,“未定义标识符 "CharUpperW"”出现这个问题该怎么办?我看了,Windows.h里面包含了这个呀。

shieep 发表于 2020-1-22 17:42

5.0的才有点意思

bydlyzx 发表于 2020-1-22 23:11

自从 sbulime 出来以后,别的编辑器就迎来了冬天。

从功能到美观都被秒杀了。

evill 发表于 2020-1-22 23:35

bydlyzx 发表于 2020-1-22 23:11
自从 sbulime 出来以后,别的编辑器就迎来了冬天。

从功能到美观都被秒杀了。

我猜你说的应该是sublime :lol
页: [1] 2 3
查看完整版本: 某文本编辑器逆向