首页
社区
课程
招聘
[原创]一个简单的crackme分析
发表于: 2013-9-28 13:07 19792

[原创]一个简单的crackme分析

2013-9-28 13:07
19792
#include "stdafx.h"
#include <windows.h>
int main(int argc, char* argv[])
{
  char buffer[28] = {0}; 
  DWORD dwData = 0xC4678C08;
  DWORD dwTemp = 0;
  for (int i = 0x24; i > 0; --i)
  {
    dwData = dwData + 0x24B6;
    dwTemp = dwData>>30;
    dwData = dwData << 2;
    dwData |= dwTemp;
    dwData--;
  }
  dwData += 0xE11F79A;
  //buff+8
  *((PDWORD)(buffer+8)) = dwData;
  
  
  WORD wVar = 0x5C27;
  WORD wData = wVar ^ 0x1D4A;
  char chTemp = *(char*)(&wData);
  *(char*)(&wData) = *(((char*)(&wData))+1);
  *(((char*)(&wData))+1) = chTemp;
  
  //buff
  *(PWORD)buffer = wData;

  dwTemp = 0x27418BE4;
  __asm
  {
    mov edx, 0xBC75;
    xchg dh, dl
    shl edx, 0x10;
    mov eax, dwTemp
    mov  dx, ax;
    xor edx, 0x12D3E480;
    bswap edx
    mov dwData, edx
  }
  //buff+0xE

  *((PDWORD)(buffer+0xE)) = dwData;

  BYTE byData,byTemp = 0x23;
  byData = (byTemp ^ 0x18)+5;
  byTemp = byData << 7;
  byData = byTemp | (byData >> 1);
  //buff+2
  *(buffer+2) = byData;

  dwData = 0x1A7E54C+0x63CA3AFD;
  //buff+3
  *((PDWORD)(buffer+3)) = dwData;
  __asm
  {
    mov dx,0x2020
    mov byData,dl
    mov dl,0x67
    bswap edx
    mov dx,0x6120
    mov dwData,edx
  }
  //buff+0x12
  *(buffer+0x12) = byData;

  //buff+0xB
  *((PDWORD)(buffer+0xB)) = dwData;
  //buff+0x13
  dwData = (0x37261636 >>4) | (0x37261636<<28);
  __asm
  {
    mov eax,dwData
    bswap eax
    mov dwData, eax
  }
  *((PDWORD)(buffer+0x13)) = dwData;
  //buff+0x17
  __asm
  {
    mov eax, dwData
    bswap eax
    mov edx, 0xCED7D3A2
    sub edx,eax
    bswap edx
    mov dwData,edx
  }
  *((PDWORD)(buffer+0x17)) = dwData;
  //buff+8
  *(buffer+7) = 'a';
  HANDLE hFile = NULL;
  DWORD dwFileZie = 0x1B;
  hFile=CreateFile("cm.dll",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,NULL);
  if (hFile != NULL)
  {
    WriteFile(hFile,buffer,dwFileZie,&dwFileZie,NULL);
  }
  CloseHandle(hFile);
  return 0;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (15)
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
2
沙发一个,好棒!!!!!!
2013-9-28 16:24
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
发现一张图片的CreateFile 拼错了`
2013-9-28 17:00
0
雪    币: 70
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错啊,哈哈,以后我也学crack
2013-9-28 22:49
0
雪    币: 103
活跃值: (126)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
刚看了下 用IDA根据DialogBoxParamA的参数 找到消息处理函数 下面应该就是那三个button的处理代码 a3 == 402应该就是check 不过lz的方法也不错 顶个
if ( a3 == 106 )
        MessageBoxA(
          0,
          "CrackMe v1.0\r\nAuthor:  Greedy Fly\r\nCompiler:  masm32\r\nDate:  September 1, 2013\r\n",
          "About...",
          0);
      if ( a3 == 402 )
      {
        word_40314C = 28003;
        word_40314E = 25646;
        word_403150 = 27756;
        v6 = sub_4015C5();
        v7 = ((int (__cdecl *)(__int16 *, signed int, signed int, _DWORD, signed int, _DWORD, _DWORD))v6)(
               &word_40314C,
               -2147483648,
               1,
               0,
               3,
               0,
               0)
           + 1;
        if ( !v7 )
          goto LABEL_33;
        hFile = (HANDLE)(v7 - 1);
        if ( sub_401598() != 27 )
          goto LABEL_33;
        ReadFile(hFile, &unk_403153, 0x1Bu, &NumberOfBytesRead, 0);
        
       …………省略……
        }
        else
        {
LABEL_33:
          v22 = GetDlgItem(hDlg, 404);
          SendMessageA(v22, 0xF5u, 0, 0);
        }
      }
      else
      {
        if ( a3 == 404 )
          SendMessageA(hDlg, 0x10u, 0, 0);
      }
2013-9-28 23:02
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
6
其实的话,LZ你的注册机更加接近于计算原理的演示。
实际上的话,这个key根本就是固定的,中间很多段的asm是可以等效转换的。而且你的过程没有输入,所以导致这个函数最后被release编译出来很可能只有一串的mov操作,或者更变态直接就是文件操作部分了。

以下是等效操作的分析(计算错误请自行忽略):
  dwTemp = 0x27418BE4;        //assume dwTemp=a4a3a2a1;
  __asm
  {
    mov edx, 0xBC75;        //edx=0xBC75
    xchg dh, dl                //edx=0x75BC
    shl edx, 0x10;        //edx=0x75BC0000
    mov eax, dwTemp        //eax=a4a3a2a1
    mov  dx, ax;        //edx=0x75BCa2a1
    xor edx, 0x12D3E480;//edx= (0x75^0x12)(0xBC^0xD3)(a2^0xE4)(a1^0x80)
    bswap edx                //b4b3b2b1->b1b2b3b4
                        //edx=(a1^0x80)(a2^0xE4)(0xBC^0xD3)(70x5^0x12)
                        //equal to
                        //mov eax,dwTemp
                        //xchg ah,al
                        //xor ax,0x80E4
                        //mov dx,ax
                        //shl edx,10
                        //mov dx,(0xBC^0xD3)(70x5^0x12)

    mov dwData, edx
  }

so dwData=(DWORD)MAKELONG(MAKEWORD(70x5^0x12,0xBC^0xD3),MAKEWORD(HIBYTE(LOWORD(dwTemp))^0xE4,LOWBYTE(LOWORD(dwTemp))^0x80);
MAKELONG和MAKEWORD这2个宏都是高位字节在第二个参数

-----------------------------------
__asm
  {
    mov dx,0x2020
    mov byData,dl        //byData=0x20;
    mov dl,0x67                //dx=0x2067
    bswap edx                //edx=0x6720????
    mov dx,0x6120        //edx=0x67206120
    mov dwData,edx
  }

so dwData=0x67206120;

----------------------------------------
  dwData = (0x37261636 >>4) | (0x37261636<<28);
/*
(0x37261636 >>4) = 0x03726163
(0x37261636<<28) = 0x60000000
dwData=0x63726163;
*/
  __asm
  {
    mov eax,dwData
    bswap eax
    mov dwData, eax
  }

so dwData=0x63617263;
-------------------------------------
前面dwData已经算出
  __asm
  {
    mov eax, dwData        //eax=0x63617263
    bswap eax                //eax=0x63726163
    mov edx, 0xCED7D3A2
    sub edx,eax                //edx=0x6B65723F
    bswap edx                //edx=0x3F72656B
    mov dwData,edx
  }
so dwData=0x3F72656B
2013-9-28 23:18
0
雪    币: 87
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
膜拜!嘿嘿。
2013-9-28 23:25
0
雪    币: 88
活跃值: (335)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
8
好眼力
2013-9-29 09:37
0
雪    币: 88
活跃值: (335)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
9
嗯,不错哦。。。我又积累了几个宏操作
2013-9-29 09:43
0
雪    币: 88
活跃值: (335)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
10
哈哈,怎么就骗了一个精华呢
2013-9-29 09:44
0
雪    币: 6390
活跃值: (3480)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主辛苦了,学习原创。
2013-9-29 12:08
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
key的第八位取什么值都可以吧.
2013-9-29 12:57
0
雪    币: 88
活跃值: (335)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
13
Yes。生成cm.dll 后,用winHex看了一下内容,自己加的的a,我想作者写的时候可能移位了,结果漏掉了这个位置的校验
2013-9-29 16:43
0
雪    币: 341
活跃值: (85)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
14
LZ辛苦。mark
2013-9-30 22:54
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这个CM确实有意思,谢谢楼主分享
我希望我有一天能把最后的那个问号能变成叹号!
2013-10-1 21:50
0
雪    币: 882
活跃值: (350)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
辛苦了,有空就学习一下
2013-10-4 12:10
0
游客
登录 | 注册 方可回帖
返回
//