首页
社区
课程
招聘
[原创]爆破010 Editor v8.0.1
发表于: 2018-3-22 17:16 10160

[原创]爆破010 Editor v8.0.1

2018-3-22 17:16
10160

这个程序运行时会弹出窗口,提示:

Evaluation Version
30 Days Left

当我们大幅修改系统日期,重新运行时,程序会有类似的提示:

Evaluation Version
8 Uses Left

到IDA中搜索Days Left或者Uses Left,发现均有两处调用:


第一条红线提示Single User License或者Site License或者多用户的N User License
第二条红线提示Evaluation Period Expired
第三条红线提示Invalid License的
第四条红线提示Upgrade Required - Evaluation Expired
第五条红线提示Bad Clock Date
再往后红线和绿线分别提示Use Left和Days Left

我们只要让程序跳转到永远执行第一条红线,就可以保证永远提示我们拥有有效的License!

此处关键跳转为jnz loc_1406E39FA,相关代码段如下:

使用二进制编辑工具把代表jnz loc_1406E39FA0F 85 F7 00 00 00NOP指令替换掉即可。

改完此处发现重启程序的提示并没有变化,我们再修改一下另一个函数。

跟上面的那个函数很类似,这个函数最上面向左跳转的红线代表是已经注册的版本,向右的绿线表示是试用版,关键跳转指令为jnz loc_140AF66EE,相关代码段如下:

我们同样用二进制编辑器把这个跳转指令NOP掉。

这时重新启动程序,我们似乎已经破解了,提示我们:

Licensed to:

0 User License

如果感觉0 User License逼格不够,一会儿可以自己去进一步修改程序的逻辑。

我们把时间往后调几年,尝试把程序打开关闭十来次,发现果然没有完美破解,程序不再正常运行,弹出Register窗口:

这说明程序启动时执行了一句跳转代码,判断我们是未注册的用户,不再为我们提供服务。我们重新进入战斗,搜索相关字符串!

我们先搜索Check &License看看吧!(注:我之前总不知道为啥搜不到Check License,后来才发现L下面有个下划线。)

然后再找到调用这个字符串的一串函数:

Check &License -> sub_1406E0960 -> sub_14000B26C -> 下面四处函数

我们逐一分析上面涉及的每一个函数,发现sub_140C50FA0才是我们要找的!

这个函数有多处跳转,如果这里的ebx等于0x177或0x2f或0xed或0x113或着不等于0x20c都将跳转到loc_140c51398,为我们弹出Register窗口,让我们无法正常使用。只有让程序跳转到loc_140c51463处才可以逃过开机的Register窗口

我们把jnz loc_140C51463上面的几个跳转都nop掉,我又把上面的cmp ebx, 20Ch给改成了cmp ebx, 3323h(这里随便修改个啥值应该都没问题,如果有问题,你再换一个呀),修改后

多次测试后,没有发现什么异常之处。

涉及到License的代码有下面两处,我打算把程序显示成Single User License或者Super VIP License,我们先修改sub_140AF6590,看看只改这一处行不行。


我们把跳转指令jnz short loc_140AF6660替换为NOP,让它直接往下执行,就可以保证我们的License为Single User License

我们可以使用Hex Workshop把二进制文件中的Single User License替换成自己想要的名字,只要保证不超过它的长度就行了,比如下图中的Super VIP License:

不过在Register窗口显示我们还是0 User License,但是我相信聪明的你如果认真看下来,应该已经知道怎么改,该哪里了!

我们发现Register窗口下面的按钮名称好像会变化,当名称变化时,程序也会有不同的反应。Register窗口底下第二个按钮,可以是&Cancel,&Continue或者E&xit。其中&表示后面一个字符带下划线。当显示E&xit时,如果关闭Register窗口,整个程序就会退出。

这大概就是爆破的缺点吧,如果不深入分析找到问题的关键,就要挨个去修改细枝末节的问题。

这个字符串被两个函数调用:

函数sub_1400E2BF0太大了,看样子是主窗口中的Exit菜单,并不是我们要找的!在sub_1406E46F0中,我们看到了&Cancel,&ContinueE&xit相关的调用,不过这应该是Qt定义第二个按钮名称的代码,我们找到调用它的函数sub_1400068D4,只有一个跳转指令,再往上找,我们找到五个调用sub_1400068D4的函数

E&xit -> sub_1406E46F0 -> sub_1400068D4 -> 下面五个函数

经过逐一排除,我们发现sub_1400DD7E0函数中有一个call sub_140002C11,跟进去之后发现相关的代码好像可以让整个程序退出。

我们修改一个字节就可以了,把jnz short loc_1400DD86D替换为jmp short loc_1400DD86D, 这样关闭Register窗口应用程序永远都不会退出了。

这个程序中使用了四个子函数!basic_patch已经可以让程序基本正常运行,虽然不够完美,对于一般用户来说足够了;license_patch让系统显示Single User License,如果有兴趣,你也可以进一步个性化修改,这个并不影响程序正常运行;registerExit_patch修正了关闭Register窗口整个程序都会退出的问题;checkLicense_patch使得用户不管输入什么样的用户名和密码,都会提示“Password accepted”,并且你的用户名会在启动程序时显示。

运行完上面的程序后,重新打开Register窗口,随便输入用户名和密码的效果图:

 

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2018-3-26 14:56 被Explorerl编辑 ,原因: update patch program
收藏
免费 1
支持
分享
最新回复 (22)
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
受益很大,非常感谢
2018-3-22 17:28
0
雪    币: 6682
活跃值: (1156)
能力值: ( LV5,RANK:158 )
在线值:
发帖
回帖
粉丝
3
若可 受益很大,非常感谢
不客气!我从看雪学到了很多东西,潜水好几年,也应该做一点小小的贡献了
最后于 2018-3-22 17:53 被Explorerl编辑 ,原因: 修改错别字
2018-3-22 17:44
0
雪    币: 6682
活跃值: (1156)
能力值: ( LV5,RANK:158 )
在线值:
发帖
回帖
粉丝
4

删除此层,整理到上面

最后于 2018-3-24 14:30 被Explorerl编辑 ,原因:
2018-3-23 08:32
0
雪    币: 6682
活跃值: (1156)
能力值: ( LV5,RANK:158 )
在线值:
发帖
回帖
粉丝
5

delete

最后于 2018-3-24 14:33 被Explorerl编辑 ,原因:
2018-3-23 11:06
0
雪    币: 1208
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习学习,哈哈
2018-3-25 11:10
0
雪    币: 204
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Hi 
Did  some  changes  to  the  C  code  to  get  it  working  correctly  ,  also  on  the  first  patch  my  version  of  010    V801  editor  had  some  small  differences  to  the  code
(  reflected  in  my  version  of  the  patch  code  )

#include  "stdafx.h"
#include  <windows.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <stdint.h>
#include  <time.h>




/******************************************************

          Patched  by  Explorerl@pediy.com  on  2018-0324
          for  010  Editor  v8.0.1  on  Windows  x64 

******************************************************/
 
 
void  basic_patch(FILE  *fp);
void  license_patch(FILE  *fp);
void  registerExit_patch(FILE  *fp);
void  checkLicense_patch(FILE  *fp);




int  main()
{
   
       printf("010  Editor  V801  Patcher    -  Run  in  local  directory  where  010Editor  files  reside  \n");
       
       FILE  *fp;
        int  rtn=0;
        fp  =  fopen("010Editor.exe","rb+");  //  Changes  to  run  in  local  dir  of  program  as  not  all  programs  are  installed  in  default  ms  dirs
        if(fp==NULL)
        {
                printf("Can't  find  010Editor.exe.\n");
                exit(0);
        }
 
        basic_patch(fp);
        license_patch(fp);
        registerExit_patch(fp);
        checkLicense_patch(fp);
 
        fclose(fp);
        return  0;
}
 
/*
The  basic_patch  function  is  enough  for  ordinary  people
*/
void  basic_patch(FILE  *fp)//Patch  for  sub_140C50FA0
{
        int  fail;
              fseek(fp,  0xc50760,  SEEK_SET);
              //Offset:0xc50761

              uint8_t  patchs[36]  =  {0x0,0x90,  0x90,  0x83,  0xfb,  0x2f,  0x90,  0x90,  0x81,  0xfb,  0xed,0x00,  0x00,  0x00,  0x90,  0x90,  0x81,  0xfb,  0x13,  0x01,  0x00,  0x00,  0x90,  0x90,  0x81,  0xfb,  0x0c,  0x02,  0x00,  0x00,  0x90,  0x90,  0x90,  0x90,  0x90,  0x90};

      //  fail  =  fputs(patchs,  fp);

       fail  =  fwrite(patchs,  sizeof(patchs),  1,  fp);        //(  changed  to  file  write  as  the  values  of  the  the  array  are  bigger  than  the  defined  char  used  )
 

//  From  exe  file  of  editor  as  per  tutorial
//00c50760h:  00  90  90  83  FB  2F  90  90  81  FB  ED  00  00  00  90  90  ;  .ƒû/ûí...            (  check  newer  versions  at  this  address  ,  my  version  is  slightly  different  to  the  original  in  the  tutorial  )        
//00c50770h:  81  FB  13  01  00  00  90  90  81  FB  0C  02  00  00  0F  85  ;  û....û.....…
//00c50780h:  DF  00  00  00  48  8B  0D  0D  B8  43  01  E8  30  1E  3B  FF  ;  ß...H‹..¸C.è0.;ÿ


        if(fail  ==  1)
                printf("\n----Basic  patch  success!  10  bytes  are  patched----    %x  :\n  ",fail);
        else
                printf("Basic  patch  failed!%x  :\n  ",fail);
 
}
/*  Function  license_patch
*  It  will  show  Single  user  License  after  patch
*/
 
void  license_patch(FILE  *fp)
{
        int  failA1,failA2,failB,  failC;
 
              fseek(fp,  0xaf59d0,  SEEK_SET);
             
             uint8_t  patchA1[32]  =  {0x44,  0x24,  0x20,  0x01,  0x00,  0x00,  0x00,  0x81,  0xFF,  0xDB,  0x00,  0x00,  0x00,  0x90,  0x90,  0x90,  0x90,  0x90,  0x90,  0x83,  0x7C,  0x24,  0x70,  0x00,  0x74,  0x10,  0x48,  0x8D,  0x15,  0x8F,  0x48,  0xF9};
   
            
           //  failA1  =  fputs(patchA1,  fp);//0  User  License

             failA1  =  fwrite(patchA1,  sizeof(patchA1),  1,  fp);

       //  From  exe  file  of  editor  as  per  tutorial
       //  00af59d0h:  44  24  20  01  00  00  00  81  FF  DB  00  00  00  0F  85  0B
        //  00af59e0h:  01  00  00  83  7C  24  70  00  74  10  48  8D  15  8F  48  F9

 
        fseek(fp,  0x6e2cf0,  SEEK_SET);

              uint8_t  patchA2[32]  =  {0xBB,  0x01,  0x8B,  0x87,  0x8C,  0x01,  0x00,  0x00,  0x3D,  0xDB,  0x00,  0x00,  0x00,  0x90,  0x90,  0x90,  0x90,  0x90,  0x90,  0x48,  0x8B,  0x0D,  0x8E,  0x92,  0x9A,  0x01,  0x83,  0x79,  0x30,  0x01,  0x75,  0x2D};
   
             //failA2  =  fputs(patchA2,  fp);//0  User  License

             failA2  =  fwrite(patchA2,  sizeof(patchA2),  1,  fp);

        //  From  exe  file  of  editor  as  per  tutorial
       //006e2cf0h:  BB  01  8B  87  8C  01  00  00  3D  DB  00  00  00  0F  85  F7
        //006e2d00h:  00  00  00  48  8B  0D  8E  92  9A  01  83  79  30  01  75  2D
 
        fseek(fp,  0xaf5a40,  SEEK_SET);

                uint8_t  patchB[32]  =  {0x15,  0x1B,  0x23,  0x7A,  0x01,  0x83,  0x7D,  0x30,  0x01,0x90,  0x90,  0x48,  0x8D,  0x15,  0xB6,  0x48,  0x3E,  0x00,  0x48,  0x8B,  0xCB,  0xFF,  0x15,  0x9D,  0x33,  0x7A,  0x01,  0xE9,  0x83,  0x00,  0x00,  0x00};
       
               //failB  =  fputs(patchB,  fp);//Single  User  License

               failB  =  fwrite(patchB,  sizeof(patchB),  1,  fp);

        //  From  exe  file  of  editor  as  per  tutorial
       //00af5a40h:  15  1B  23  7A  01  83  7D  30  01  75  15  48  8D  15  B6  48  ; 
        //00af5a50h:  3E  00  48  8B  CB  FF  15  9D  33  7A  01  E9  83  00  00  00  ; 
 
        fseek(fp,  0x6e2d00,  SEEK_SET);

        uint8_t  patchC[32]  =  {0x90,  0x90,  0x90,  0x48,  0x8B,  0x0D,  0x8E,  0x92,  0x9A,  0x01,  0x83,  0x79,  0x30,  0x01,  0x90,  0x90,  0x48,  0x8D,  0x15,  0xD9,  0x25,  0xEE,  0x00,  0x48,  0x8D,  0x4D,  0x30,  0xFF,  0x15,  0xE7,  0x60,  0xBB};

        //failC  =  fputs(patchC,  fp);//Single  User  License

       failC  =  fwrite(patchC,  sizeof(patchC),  1,  fp);

       //  From  exe  file  of  editor  as  per  tutorial
       //006e2d00h:  00  00  00  48  8B  0D  8E  92  9A  01  83  79  30  01  75  2D  ; 
        //006e2d10h:  48  8D  15  D9  25  EE  00  48  8D  4D  30  FF  15  E7  60  BB  ;   
 
 
        if(  (failA1==1)  &  (failA2==1)  &  (failB==1)  &  (failC==1))
                        printf("\n----License  patch  success!  16  bytes  are  patched  ----\
                                        \n  Your  program  are  now  licensed  to  \"Single  User  License\"  %x:\n  ",failA1);
        else
                printf("----License  patch  failed!----  %x:  \n  ",failA1);
 
/*
Function  registerExit_patch  fix  the  bug  when  you  close
the  Register  Window,  your  program  will  terminate
*/
void  registerExit_patch(FILE  *fp)
{
        int  fail;
              fseek(fp,  0xdcc50,  SEEK_SET);


            
          
              uint8_t  patch[32]  =  {0xC0,  0xEB,  0x1A,  0x48,  0x8B,  0x05,  0x7E,  0xFB,  0xFA,  0x01,  0x83,  0xB8,  0x88,  0x01,  0x00,  0x00  ,  0x00,  0x74,  0x0A,  0x48,  0x8B,  0xCB,  0xE8,  0xA6,  0x53,  0xF2,  0xFF,  0xEB,  0x08,  0x48,  0x8B,  0xCB};

       
       //  From  exe  file  of  editor  as  per  tutorial 
       //000dcc50h:  C0  75  1A  48  8B  05  7E  FB  FA  01  83  B8  88  01  00  00  ; 
        //000dcc60h:  00  74  0A  48  8B  CB  E8  A6  53  F2  FF  EB  08  48  8B  CB  ; 


        //fail  =  fputs(patch,  fp);

       fail  =  fwrite(patch,  sizeof(patch),  1,  fp);

        if(fail  ==  1)
                printf("\n----Register_Exit  patch  success!  1  byte  is  patched----  %x:  \n",fail);
        else
                printf("Register  patch  failed!  %x  :\n",fail);
 
}
 
/*
Function  checkLicense_patch
If  you  don't  left  username  and  password  blank,  when  you  press  "Check  License"
on  Register  window,  you  will  always  success!
*/
void  checkLicense_patch(FILE  *fp)
{
        int  fail;
     
       fseek(fp,  0x6e2680,  SEEK_SET);

              uint8_t  patchD[32]  =  {0x0D,  0x13,  0x99,  0x9A,  0x01,  0x81,  0xFB,  0xDB,  0x00,  0x00,  0x00,  0x90,  0x90,  0x90,  0x90,  0x90,  0x90,  0x48,  0x8D,  0x55,  0xE0,  0xE8,  0x18,  0x6C,  0x92,  0xFF,  0x48,  0x8D,  0x15,  0x07,  0x26,  0xEE};

             //  From  exe  file  of  editor  as  per  tutorial
             //006e2680h:  0D  13  99  9A  01  81  FB  DB  00  00  00  0F  85  2E  01  00  ;
             //006e2690h:  00  48  8D  55  E0  E8  18  6C  92  FF  48  8D  15  07  26  EE  ; 

        //fail  =  fputs(patch,  fp);

       fail  =  fwrite(patchD,  sizeof(patchD),  1,  fp);

        if(fail  ==  1)
                printf("\n----Check  License  patch  success!  6  bytes  is  patched----  %x  \n",fail);
        else
                printf("Check  License  patch  failed!  %x  \n",fail);
 
}
2018-4-21 02:35
0
雪    币: 91
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这个牛呀,原来patch的程序是这样写的,本人暂时只会用x64dbg进行动态修改。神奇,向楼主学习。 
2018-4-25 12:54
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zld
9
好久没上了,一来就看到这么好的文章,有的学了
2018-4-26 10:46
0
雪    币: 578
活跃值: (808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我还是默默的潜水,向楼主学习
2018-4-28 22:19
0
雪    币: 864
活跃值: (2350)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
mac版吗?网络验证能过吗?
2018-4-28 22:45
0
雪    币: 2694
活跃值: (80)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
12
学习了
2018-4-30 00:26
0
雪    币: 6682
活跃值: (1156)
能力值: ( LV5,RANK:158 )
在线值:
发帖
回帖
粉丝
13
@dryzh  这是在虚拟机中Win  7下测试的,linux版的破解方式也是类似的,mac应该也差不多。我的虚拟机专门用来逆向分析一些程序的,没有网络,目前没遇到任何问题。
2018-5-2 08:17
0
雪    币: 32
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我还是默默的潜水,向楼主学习
2018-5-12 13:50
0
雪    币: 6314
活跃值: (952)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
mark一波,准备学习
2018-5-14 12:07
0
雪    币: 2694
活跃值: (80)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
16
2018-5-15 19:14
0
雪    币: 419
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
谢谢楼主分享,现在网上有很多破解版,但是打开进程功能不能用,一打开就提示错误,用旧版本就可以,你测试下你的版本是否有这个问题。谢谢了
2018-6-7 08:39
0
雪    币: 6682
活跃值: (1156)
能力值: ( LV5,RANK:158 )
在线值:
发帖
回帖
粉丝
18
wxhui 谢谢楼主分享,现在网上有很多破解版,但是打开进程功能不能用,一打开就提示错误,用旧版本就可以,你测试下你的版本是否有这个问题。谢谢了
我个人测试没发现什么问题,在虚拟机里正常使用两个多月了。
2018-6-7 09:13
0
雪    币: 419
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
Explorerl 我个人测试没发现什么问题,在虚拟机里正常使用两个多月了。
谢谢你的及时回复,我刚才亲自做了实验,步骤和结果如下:
1.我首先复制你patch代码。然后对新安装的010  editor  8.0.1  版本进行打补丁。屏幕显示一切ok,但是我运行打过补丁的程序时直接奔溃了。
2.然后我用下方评论区  Willebul  的代码(在你代码上做的修改)制作的补丁程序给010  editor  8.0.1  版本打补丁,运行一切正常,注册完直接可以用。打开进程功能也是好的。
2018-6-7 10:15
0
雪    币: 6682
活跃值: (1156)
能力值: ( LV5,RANK:158 )
在线值:
发帖
回帖
粉丝
20
OK,多谢反馈测试结果!

楼上那位Willebul兄弟用的版本跟我的可能不太一样,但是破解思路都是类似的。即使以后更新版本,如果加密方法变化不大,也可以把程序拖到IDA中,找到关键点,用二进制编辑器编辑一下就行了。
2018-6-7 10:53
0
雪    币: 419
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
Explorerl OK,多谢反馈测试结果! 楼上那位Willebul兄弟用的版本跟我的可能不太一样,但是破解思路都是类似的。即使以后更新版本,如果加密方法变化不大,也可以把程序拖到IDA中,找到关键点,用二进制编 ...
应该是版本不对导致的。
我突然想起来,我安装的是010    editor    8.0.1  x64的版本,不知道跟你测试的版本一样不?
2018-6-7 11:04
0
雪    币: 6682
活跃值: (1156)
能力值: ( LV5,RANK:158 )
在线值:
发帖
回帖
粉丝
22
wxhui 应该是版本不对导致的。 我突然想起来,我安装的是010 editor 8.0.1 x64的版本,不知道跟你测试的版本一样不?

那样的话,版本应该一样吧!
我是在64位英文版Win 7下测试的,那个patch程序是用Dev-C++编译的。安装包校验码如下

$ md5sum 010EditorWin64Installer801.exe 
13c2e38969cf10728b994c3063c6264b  010EditorWin64Installer801.exe
$ sha256sum 010EditorWin64Installer801.exe 
53e8cd8412372a75b701b0dcbb47d3fb2f33d2ac946b5b2bd5547e49219a4686  010EditorWin64Installer801.exe
2018-6-7 11:12
0
雪    币: 419
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
我的环境是64位中文版  win7,用vc编译的。
安装包校验码:
md5:13c2e38969cf10728b994c3063c6264b  *010EditorWin64Installer801.exe
sha256:53e8cd8412372a75b701b0dcbb47d3fb2f33d2ac946b5b2bd5547e49219a4686  *010EditorWin64Installer801.exe
说明安装包都是同一个。  应该是编译环境不同导致的。
2018-6-7 11:42
0
游客
登录 | 注册 方可回帖
返回
//