首页
社区
课程
招聘
[原创]一个完整的crackme
发表于: 2015-3-26 20:48 14896

[原创]一个完整的crackme

2015-3-26 20:48
14896

【原创】一个完整的crackme

1989年3月26日,诗人海子,山海关卧轨离世。
不,是永生。
今天是他第26个忌日,值此默哀。
他说,公元前我们太小,公元后我们又太老,没有人看到那真正美丽的微笑。(《历史》)
相信,26年前的今天的诗人带着最美微笑。
————————————————**我是华丽分割线**———————————————————

这是我的看雪第一帖,分享一个crackme的全过程,程序来自2012年的xdsec。
入门新手,大牛勿喷,不当之处,大牛指点。
问题要求:crackme4为一个normal的登陆窗口,请以xdsec为username,计算出password使得成功log in,提交password即为key。
程序和注册机在附件。也可以去网盘下载:http://pan.baidu.com/s/1bnvYuej
下面正式开始。
第一部分 脱壳
双击后界面如下。


先用PEID查壳:
  
有壳,也是常见壳,还是手脱吧,反正都是练基本功。

先用OD载入
  
OD检测到有壳,点否。
  
手脱壳,采用堆栈平衡原理来找OEP(我最喜欢的方法)
两次F8,第一个PUSH执行后,ESP改变,命令行hr 0022FFC0 下硬件断点
      
F9运行,停在下面:
  
显然这个位置不是我们想要的OEP的位置,但是看到下面还是PUSH,所以保留硬件断点,F9再走。
  
看到出栈的位置,下面还是一个跳转,想想应该差不多了,F8两次。
  
好吧,OEP到了。
接下来就该Dump了,OD本身带有Dump的插件,但我还是使用了LoadPE,使用它可以correct ImageSize,不管直接Dump会不会成功,修复下也没坏处,接下来直接dump full。另存为dump1.exe。
  

这时候双击执行,发现还是有问题:


那就用ImportREC在修复下。
打开ImportREC,选择进程,查看下OEP的偏移,和OD里面对比下,没有问题。
然后IAT AutoSearch,得到RVA值,在GET Import。最后Fix Dump,选中刚才Dump下的dump1.exe。
  

OK这个时候看脱壳后的程序就没问题了。
脱壳完毕。

第二部分,分析注册原理。
经验告诉我们,先别急着上OD,先用IDA载入,看看程序的结构,动态分析时思路会清晰很多,其实对于这个问题IDA基本就可搞定了,用OD确认下几个变量就可以。
IDA载入,main函数处直接F5。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  void *v3; // esp@1
  signed int i; // [sp+2Ch] [bp-CCh]@1
  char v7; // [sp+30h] [bp-C8h]@1
  char v8; // [sp+40h] [bp-B8h]@1
  char v9; // [sp+70h] [bp-88h]@1
  char v10[4]; // [sp+90h] [bp-68h]@1
  char v11[4]; // [sp+A0h] [bp-58h]@1
  char v12[4]; // [sp+B0h] [bp-48h]@1
  char v13[4]; // [sp+C0h] [bp-38h]@1
  char v14[4]; // [sp+D0h] [bp-28h]@1
  char v15[8]; // [sp+F0h] [bp-8h]@3
  v3 = alloca(16);
  __main();
  strcpy(v14, "Ihujfk'Frsobisndfsb");
  strcpy(v13, "Rtbuifjb");
  strcpy(v12, "wfttphuc");
  strcpy(v11, "thuu~&");
  strcpy(v10, "trddbtt&");
  sub_401756(v14);
  sub_401756(v13);
  sub_40152E(&v9);
  sub_401756(v12);
  gets(&v8);
  sub_4016F2(&v7);
  for ( i = 0; i <= 9; ++i )
  {
    if ( (v15[i - 176] ^ v15[i - 192]) != v15[i - 128] )
    {
      sub_401756(v11);
      return 0;
    }
  }
  sub_401756(v10);
  sub_40E760();
  return 0;
}
signed int __cdecl sub_40152E(int a1)
{
  signed int result; // eax@11
  signed int i; // [sp+28h] [bp-30h]@1
  signed int j; // [sp+28h] [bp-30h]@10
  size_t v4; // [sp+2Ch] [bp-2Ch]@1
  char v5; // [sp+30h] [bp-28h]@1
  char v6[8]; // [sp+50h] [bp-8h]@3
  gets(&v5);
  v4 = strlen(&v5);
  for ( i = 0; i < (signed int)v4; ++i )
  {
    if ( v6[i - 32] <= 96 || v6[i - 32] > 122 )
    {
      if ( v6[i - 32] > 64 )
      {
        if ( v6[i - 32] <= 90 )
          v6[i - 32] = (7 * (v6[i - 32] - 65) + 13) % 26 + 65;
      }
    }
    else
    {
      v6[i - 32] = (7 * (v6[i - 32] - 97) + 13) % 26 + 65;
    }
  }
  for ( j = 0; ; ++j )
  {
    result = j;
    if ( j >= (signed int)v4 )
      break;
    *(_BYTE *)(a1 + 2 * j) = v6[j - 32] / 10 + 48;
    *(_BYTE *)(a1 + 2 * j + 1) = v6[j - 32] % 10 + 48;
    *(_BYTE *)(a1 + 2 * j + 2) = 0;
  }
  return result;
}

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

上传的附件:
收藏
免费 3
支持
分享
最新回复 (23)
雪    币: 54
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
顶楼主,虽然还没看懂。
2015-3-27 09:31
0
雪    币: 69
活跃值: (270)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
msf
3
不错。  过程很精彩。。。
2015-3-27 11:03
0
雪    币: 62
活跃值: (41)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
如果哪里说得不明白,我可以解释下。
2015-3-27 13:06
0
雪    币: 31
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢!!
读懂还需努力学习,思考和练习。
2015-3-30 01:06
0
雪    币: 31
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
所用工具频谱很宽,谢谢展示所给出的努力方向!!!
学习PEid, OD, IDA 工具。
仰慕学习手脱壳的原理。stack balance principle, OEP...
2015-3-30 01:16
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
7
欢迎你的加入,鼓励支持一下!
2015-3-31 17:57
0
雪    币: 1579
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
老大,我的级别都没了?怎么回事呢?(本来是4个太阳的)
2015-3-31 19:57
0
雪    币: 72
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
高手,学习了。工具使用很熟练,尤其是脱壳说的透彻。
2015-4-1 13:49
0
雪    币: 13632
活跃值: (3967)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢精彩分享    学习
2015-4-1 18:03
0
雪    币: 144
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
很简单,却很实用
2015-4-2 09:25
0
雪    币: 253
活跃值: (67)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼主这修复导入表也太智能化了,要是导入表中间多混点垃圾码呢?
2015-4-2 09:40
0
雪    币: 62
活跃值: (41)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
如果输入表中有垃圾代码可以先尝试用importREC的三个等级处理下,再不行就剪切掉试试,如果还不行,就得想其他办法了,我也刚开始接触脱壳,太复杂的没有处理过,还得向大家学习
2015-4-2 11:07
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢楼主,学习了
2015-4-2 16:42
0
雪    币: 140
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
看看~~~~~~~~~~
2015-4-2 19:22
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
很详细,不错。
2015-4-3 00:45
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
很不错,学习
2015-4-10 08:15
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
感謝樓主詳細教學 , 向您學習!
2015-4-10 10:50
0
雪    币: 2829
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
kkkjkadjfldkasjfkladsjflkas
2015-4-11 00:10
0
雪    币: 1626
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
学习了...
2015-4-12 09:20
0
雪    币: 102
活跃值: (102)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
21
帮顶!不错,继续努力!学习了!
2015-4-13 20:01
0
雪    币: 2741
活跃值: (2176)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
仰慕手动脱壳技术,学习了
2015-4-24 11:14
0
雪    币: 72
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
朋友,你这段代码是怎么来的?自己根据汇编写的吗?
2016-3-28 13:38
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
真心写的不错,很详细,期待再次看到佳作。
2016-4-20 11:37
0
游客
登录 | 注册 方可回帖
返回
//