吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5967|回复: 9
收起左侧

[会员申请] 申请会员ID:蓝鲸不蓝【冒充他人作品申请】

[复制链接]
吾爱游客  发表于 2017-1-2 23:22
1. 申请ID:蓝鲸不蓝2.个人邮箱:2570490222@qq.com




一直在默默关注吾爱  喜爱吾爱 这个大家庭  在吾爱学到的东西都挺实用
挺像加入吾爱这个大家庭 不知道是否可以容我! 以下是本人的小经验
请各位大牛指点

最简单的方法过易语言程序校验+破解




这个就是我们今天程序的主角,改动1个字节都会出现这个弹框,,那么在此我给大家普及一个知识,一般来说,检测程序最有效果的办法就是判断程序的MD5或者是CRC
不过CRC好像是可以被Patch的,因此MD5是最最最常用,也是程序作者最最最喜欢用的一项

那么要想知道一个程序的MD5,首先得取得程序路径,再读入文件等等,写过易语言的都知道,因此我不多讲解,我自己也用过这个MD5校验,,,

如上图,其实跟破解一样,,他校验过后有什么,我们就找什么,在这里,我们知道这个程序是弹了一个信息框,那么我们也可以用MessageBoxA函数去找到判断点


但是如我的标题,,要用最简单的办法,什么办法最简单呢?当然是Test,Edx,3啦

这里下好断,运行起来看寄存器

这里看到RegCode,就要注意了,因为这很可能是一个关键点,不过不是校验的关键,而可能是破解的关键,当然我们这里先处理下校验


经过无数次的F9,发现了这么两串MD5
QQ图片20170102225126.png



此时我们F8往下走,就走到上图这个位置,看到这些代码你是否激动呢?
因为我们修改的程序跟原程序的MD5是不一样的,所以,,如果这个je跳 我们就NOP,如果不跳就Jmp,很浅显的道理


QQ图片20170102225126.png

很显然,这里是跳了,所以我们应该让他不跳

QQ图片20170102225126.png

当我们je NOP完以后,这里的eax=0
那么如果我们没有修改的话,这个jg是不会跳的,jg下面的代码就是窗口销毁,自然就会出现我们文章第一张图的结果,,,所以,如果我们不改那个JE,改这个JG为Jmp也是可以的

是不是很简单就搞定了关键点呢?

接下来我们说一个比较另类的思路到达破解点,我们需要借助于Peid的一个小插件,算法扫描

我们先看未注册的是什么个情况
QQ图片20170102225126.png

这个标题明显提示是未注册对不对?
好,那我们peid走起
QQ图片20170102225126.png
找到你peid插件里面的 这个插件,全称是:
QQ图片20170102225126.png
然后这个小插件就会扫描出这个程序的所有调用的比较有名的算法,,
我们找到MD5,记下里面的地址:004D7722
QQ图片20170102225126.png

然后我们Ctrl+G,去这个地址
QQ图片20170102225126.png
接着我们找到段首并下好断点
QQ图片20170102225126.png
断下以后就看堆栈,并返回调用call

QQ图片20170102225126.png
跟着一路走到
QQ图片20170102225126.png
然后我们再此往下,走到retn处,出来就到这个位置


QQ图片20170102225126.png


看到这个je了吗?又是经典的位置,跟上面的程序校验是一模一样的哦,,这个就是判断点啦

所以老方法,如果跳就NOP,不跳就Jmp
QQ图片20170102225126.png

我们改NOP,接着往下走,看看有没有别的发现
如果没有就F9运行咯


QQ图片20170102225126.png
神奇的一幕发生了,,,我就问你好不好玩?,,,

原理的话其实就是会这个注册会调用到MD5加密,,然后我们直接从加密的地方顺藤摸瓜,,最后你懂的,,,
不过其实还有别的好玩的东西等你发现,我就卖个小关子,大家自己去发现吧!自己的小小经验
QQ图片20170102225126.png
QQ图片20170102225126.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

吾爱游客  发表于 2017-1-3 16:53

申请ID: 蓝鲸不蓝

1. 申请ID:蓝鲸不蓝2.个人邮箱:2570490222@qq.com




一直在默默关注吾爱  喜爱吾爱 这个大家庭  在吾爱学到的东西都挺实用
挺像加入吾爱这个大家庭 不知道是否可以容我! 以下是本人的小经验
请各位大牛指点


[软件名称]  :  PDFPassword Remover
[编译类型]  :  VC++
[是否有壳]  :  无壳
[注册类型]  :  注册码注册
[作者信息]  :  蓝鲸不蓝




//算法CALL查找方法,字符串搜索  或者 bp MessageBoxA -> 算法CALL  sub_00406E30
QQ图片20170103164809.png



//进入算法CALL,先看校验准备部分




[Asm] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
//初始化局部变量
00406E48  |>sub esp,0x40        ;

//获取传入的参数[arg.1],key的指针 pkey
00406E4B  |>push esi                                 ;  winDecry.004CDD8A
00406E4C  |>mov eax,[arg.1]                          ;  lea eax,key
00406E4F  |>push eax                                 ;  push pkey
00406E50  |>lea ecx,[local.11]                                 ; this指针也就是CString对象指针  local.11存放函数返回值
//复制传入得pkey参数,返回值给 [local.11] -> 将新复制得CString 命名为 Key
00406E53  |>call winDecry.004CD6F3                   ;  NewCString(&local.11,pkey);


// Key检查,通过搜索Key字符串中是否0x20 字符,如果存在则非法

[Asm] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
00406E58  |>mov [local.1],0x0                                 ; local.1 = 0;
00406E5F  |>push 0x20                                         ; 要搜索的字符 0x20
00406E61  |>lea ecx,[local.11]                                 ; CString对象指针 -> Key
//搜索Key中是否存在0x20字符,若存在则销毁Key字符串,从而失败
00406E64  |>call winDecry.004C49A1                   ;  FindCString(&Key,0x20);


//获取CString Key 对象指向的字符串缓冲区

[Asm] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
00406E69  |>lea ecx,[local.11]                                 ; CString对象指针 -> Key
// Key->StrBuffer
00406E6C  |>call winDecry.00401E50                   ;  GetCStringBuffer(&Key)


//获取Key的长度

[Asm] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
00406E71  |>mov [local.4],eax                        ; eax -> StrBuffer
00406E74  |>mov ecx,[local.4]                                ; local.4 = Strbuffer
00406E77  |>push ecx


//测量字符串长度[Asm] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
00406E78  |>call winDecry.004AB840                   ;  Strlen(StrBuffer)

00406E7D  |>add esp,0x4
00406E80  |>cmp eax,0x14                                        ;判断字符串长度是否等于0x14,也就是20位,如若不等则失败
00406E83  |>je short winDecry.00406EA3


//下面开始校验Key

//第一部分,校验输入的数字Key的 第一位 + 第二位要等于13,否则失败

[Asm] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
00406EA3  |>mov edx,[local.4]                                ;Local.4 ->StrBuffer
00406EA6  |>mov al,byte ptr ds:[edx]                       ;获取Key的第一位ASCII值
00406EA8  |>mov byte ptr ss:[ebp-0x1C],al            ;存放到局部变量 [ebp-0x1C]
00406EAB  |>mov byte ptr ss:[ebp-0x1B],0x0           ;初始化局部变量 [ebp-0x1B]
00406EAF  |>mov ecx,[local.4]                                ;Local.4 ->StrBuffer
00406EB2  |>mov dl,byte ptr ds:[ecx+0x1]                ;获取Key第二位ASCII值
00406EB5  |>mov byte ptr ss:[ebp-0x28],dl                ;存放到局部变量 [ebp-0x28]
00406EB8  |>mov byte ptr ss:[ebp-0x27],0x0
00406EBC  |>lea eax,[local.7]                                ;
00406EBF  |>push eax                                        ;压入刚才获取得Key的第一位 ASCII
00406EC0  |>call winDecry.004AC590                        ;将ASCII 转换为 整数
00406EC5  |>add esp,0x4
00406EC8  |>mov esi,eax                                        ;ESI = Key的第一位数值
00406ECA  |>lea ecx,[local.10]                                ;
00406ECD  |>push ecx                                        ;压入刚才获得Key的第二位 ASCII
00406ECE  |>call winDecry.004AC590                        ;将ASCII 转换为 整数        
00406ED3  |>add esp,0x4               
00406ED6  |>add esi,eax                                        ; 数字Key的 第一位 + 第二位 相加
00406ED8  |>cmp esi,0xD        
00406EDB  |>je short winDecry.00406EFB               ; 判断 第一位 + 第二位 == 13 ,不等则失败



[Asm] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
//第二部分,校验输入的数字Key的 第19位 + 第20位要等于13,否则失败

00406EFB  |>>mov edx,[local.4]                                ;EDX -> StrBuffer
00406EFE  |.>mov al,byte ptr ds:[edx+0x12]                ;local.7 = StrBuffer [19]
00406F01  |.>mov byte ptr ss:[ebp-0x1C],al
00406F04  |.>mov byte ptr ss:[ebp-0x1B],0x0
00406F08  |.>mov ecx,[local.4]
00406F0B  |.>mov dl,byte ptr ds:[ecx+0x13]                ;local.10 = StrBuffer[20]

00406F0E  |.>mov byte ptr ss:[ebp-0x28],dl
00406F11  |.>mov byte ptr ss:[ebp-0x27],0x0
00406F15  |.>lea eax,[local.7]                                ;压入Key第19位
00406F18  |.>push eax


[Asm] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
00406F19  |.>call winDecry.004AC590                        ;转换为整数
00406F1E  |.>add esp,0x4
00406F21  |.>mov esi,eax

00406F23  |.>lea ecx,[local.10]
00406F26  |.>push ecx                                        ;压入Key第20位
00406F27  |.>call winDecry.004AC590                        ;转换为整数
00406F2C  |.>add esp,0x4
00406F2F  |.>add esi,eax                                        ;第19位 + 第20位
00406F31  |.>cmp esi,0xD                                        ;判断第19位 + 第20位 是否等于13,不等则失败


//第三部分,校验输入的数字Key的 第6位 + 第14位要等于11,否则失败,和上面一样,不再过多阐述

[Asm] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
00406F54  |>>mov edx,[local.4]               
00406F57  |.>mov al,byte ptr ds:[edx+0x5]                ;StrBuffer[6]
00406F5A  |.>mov byte ptr ss:[ebp-0x1C],al
00406F5D  |.>mov byte ptr ss:[ebp-0x1B],0x0
00406F61  |.>mov ecx,[local.4]
00406F64  |.>mov dl,byte ptr ds:[ecx+0xD]                ;StrBuffer[13]
00406F67  |.>mov byte ptr ss:[ebp-0x28],dl
00406F6A  |.>mov byte ptr ss:[ebp-0x27],0x0
00406F6E  |.>lea eax,[local.7]
00406F71  |.>push eax
00406F72  |.>call winDecry.004AC590                        ;字符转化为整数
00406F77  |.>add esp,0x4
00406F7A  |.>mov esi,eax
00406F7C  |.>lea ecx,[local.10]
00406F7F  |.>push ecx
00406F80  |.>call winDecry.004AC590                       ;字符转化为整数
00406F85  |.>add esp,0x4
00406F88  |.>add esi,eax
00406F8A  |.>cmp esi,0xB                                        ; 第6位 + 第14位要等于11,否则失败
00406F8D  |.>je short winDecry.00406FAD


//最后零散校验

[Asm] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
//判断第13位是否等于0x35  ->> '5'
00406FAD  |> \8B55 F0          mov edx,[local.4]
00406FB0  |.  0FBE42 0C        movsx eax,byte ptr ds:[edx+0xC]  ;StrBuffer [12]
00406FB4  |.  83F8 35          cmp eax,0x35
00406FB7  |.  74 1B            je short winDecry.00406FD4

//判断第15位是否等于0x56  ->> 'V'
00406FD4  |> \8B4D F0          mov ecx,[local.4]
00406FD7  |.  0FBE51 0E        movsx edx,byte ptr ds:[ecx+0xE]                ;StrBuffer[14]
00406FDB  |.  83FA 56          cmp edx,0x56
00406FDE  |.  74 1B            je short winDecry.00406FFB

//判断第16位是否等于0x50 ->> 'P'
00406FFB  |> \8B45 F0          mov eax,[local.4]
00406FFE  |.  0FBE48 0F        movsx ecx,byte ptr ds:[eax+0xF]                ;StrBuffer[15]
00407002  |.  83F9 50          cmp ecx,0x50
00407005  |.  74 1B            je short winDecry.00407022




//以上就是算法部分,下面总结,
Key第1位+第2位加起来要为13
Key第19位+第20位加起来要为13
Key第6位+第14位加起来要为13

Key第13位ACSII是否等于0x35  ->> '5'
Key第15位ASCII是否等于0x56  ->> 'V'
Key第16位ASCII是否等于0x50 ->>'P'  


//下面是逆向整理后的伪算法 -> C/C++








- - - -                        --------

C] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码

int __cdecl CheckKey(LPCSTR pKey)
{

  //返回值
  int result;
  
  //临时变量

  int v11;
  char v7;
  char v9;
  
  
  int tKeyinterger;
  int tKeyinterger1;
  int tKeyinterger2;

  CString Key; //CString对象
  

  //用来存放Key里面得一个字符

  char tKeyChar1;
  char tKeyChar2;

  //Key的缓冲区
  char *StrBuffer;
  

  // 复制pKey到Key中
  NewCString((CString *)&Key, pKey);

  v11 = 0;

  
  //在Key的字符串中寻找是否有0x20字符,也就是判断Key字符串是否带有非法字符               
  FindCString((CString *)&Key, 32);

  //获取CString对象中的字符缓冲区
  StrBuffer = (char *)GetCStringBuffer(&Key);

  
  //判断字符串长度是否为20 ,如果不为20则失败

  if ( strlen(StrBuffer) == 20 )               
  {

    v7 = 0;
    v9 = 0;

    //获取Key的第1位和第2位的ASCII值
    tKeyChar1 = StrBuffer [0];                    // StrBuffer [0]
    tKeyChar2 = StrBuffer[1];                   // StrBuffer[1]
   
    //ASCII to INTERGER ,字符转换为整数
    tKeyinterger1 = atoi(&tKeyChar1);


    //判断Key第1位+第2位加起来是否为13 ,如果不等于13则失败
    if ( atoi(&tKeyChar2) + tKeyinterger1 == 13 )
    {
      
      v7 = 0;
      v9 = 0;
               
      //获取Key的第19位和第20位的ASCII值
      tKeyChar1 = StrBuffer[18];
      tKeyChar2 = StrBuffer[19];
      
      //ASCII to INTERGER ,字符转换为整数
      tKeyinterger1 = atoi(&tKeyChar1);

      //判断Key第19位+第20位加起来是否为13 ,如果不等于13则失败
      if ( atoi(&tKeyChar2) + tKeyinterger1 == 13 )      
      {

        v7 = 0;
        v9 = 0;
        
        //获取Key的第6位和第14位的ASCII值
        tKeyChar1 = StrBuffer[5];
        tKeyChar2 = StrBuffer[13];
        
      //ASCII to INTERGER ,字符转换为整数
        tKeyinterger2 = atoi(&tKeyChar1);
        
       //判断Key第6位+第14位加起来是否为13 ,如果不等于11则失败
        if ( atoi(&tKeyChar2) + tKeyinterger2 == 11 )      
        {
         
          //Key第13位是否等于0x35  ->> '5'
          if ( StrBuffer[12] == 53 )            // 13位为53
          {
            //Key第15位是否等于0x56  ->> 'V'               
            if ( StrBuffer[14] == 86 )          // 15位要为86
            {
              //Key第15位是否等于0x50 ->> 'P'         
              if ( StrBuffer[15] == 80 )        // 16位要为80
              {
                v11 = -1;
                ReleaseCString(&Key);
                result = 1;
              }
              else
              {
                v11 = -1;
                ReleaseCString(&Key);
                result = 0;
              }
            }
            else
            {
              v11 = -1;
              ReleaseCString(&Key);
              result = 0;
            }
          }
          else
          {
            v11 = -1;
            ReleaseCString(&Key);
            result = 0;
          }
        }
        else
        {
          v11 = -1;
          ReleaseCString(&Key);
          result = 0;
        }
      }
      else
      {
        v11 = -1;
        ReleaseCString(&Key);
        result = 0;
      }
    }
    else
    {
      v11 = -1;
      ReleaseCString(&Key);
      result = 0;
    }
  }
  else                                          // KeyLen < 20  -> Result FALSE
  {
    v11 = -1;
    ReleaseCString(&Key);
    result = 0;
  }
  return result;
}






//尊重作者,就不放keygen.







点评

贴的可真快,这内容应该是@LYQingYe 发布过的吧?  详情 回复 发表于 2017-1-3 17:35
Hmily 发表于 2017-1-3 16:17
抱歉,未能达到申请要求,申请不通过,可以关注论坛官方微信(吾爱破解论坛),等待开放注册通知。


ps:过程太简单了,来下算法分析吧。
Hmily 发表于 2017-1-3 17:35
入了她心。 发表于 2017-1-3 16:53
1. 申请ID:蓝鲸不蓝2.个人邮箱:2570490222@qq.com

贴的可真快,这内容应该是@LYQingYe 发布过的吧?
LYQingYe 发表于 2017-1-3 20:52
Hmily 发表于 2017-1-3 17:35
贴的可真快,这内容应该是@LYQingYe 发布过的吧?

确实是我的.
乱舞有意 发表于 2017-1-17 16:49
看到他贴的东西有【复制代码】字样
就知道是复制粘贴来的了 可真不要逼脸
ut597830645 发表于 2017-2-15 13:28 来自手机
贱淫~不要走 捅你菊花!!!
KaQqi 发表于 2017-2-15 18:09
入了她心。 发表于 2017-1-3 16:53
1. 申请ID:蓝鲸不蓝2.个人邮箱:2570490222@qq.com

要是有截图就完美了。
nmsl 发表于 2017-2-15 18:32
这....盗用别人的帖子吗
王辰瑞 发表于 2017-5-17 23:03
这样做就算ID申请通过了..也是好丢人的哦..
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-24 17:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表