jzyjd 发表于 2009-3-2 12:58:16

上次发错了,这个才是不明码比较的。高手飘过。

上次发错了,这个才是不明码比较的。高手飘过。

静慕者 发表于 2009-3-3 18:02:49

怎么好像在破解区有这个呢?~

jzyjd 发表于 2009-3-3 21:49:14

有人能破吗?没人能破我就贴出答案来

Luckly 发表于 2009-3-3 22:21:56

这个IDA 真是太棒了... 和看vc一模一样//

signed int __stdcall DialogFunc(HWND a1, UINT a2, WPARAM a3, LPARAM a4)
{
UINT ST14_4_0; // ST14_4@0
signed int result; // eax@2
int v6; // eax@9
LRESULT v7; // eax@11
int v8; // esi@11
signed int v9; // ecx@13
signed int v10; // eax@14
signed int v11; // esi@15

if ( a2 == 273 )
{
    if ( a3 == 1 )
    {
      v6 = SendDlgItemMessageA(a1, 3, 0xEu, 0, 0);
      dword_4021AF = v6;
      if ( !v6 || v6 > 8 || (v8 = v6, v7 = SendDlgItemMessageA(a1, 4, 0xEu, 0, 0), !v7) || v8 != v7 )
      goto LABEL_26;
      SendDlgItemMessageA(a1, 3, 0xDu, 8u, (LPARAM)byte_402160);
      SendDlgItemMessageA(a1, 4, 0xDu, 0x10u, (LPARAM)&unk_402179);
      v9 = -1;
      while ( 1 )
      {
      ++v9;
      v10 = byte_402160;
      if ( !v10 )
          break;
      v11 = -1;
      if ( v10 < 65 || (unsigned int)v10 > 0x7A )
          goto LABEL_26;
      if ( v10 >= 90 )
          v10 -= 32;
      do
          ++v11;
      while ( v10 != byte_402017 );
      *(int *)((char *)&dword_402194 + v9) = byte_40203C;
      }
      if ( sub_401244(&unk_402179, &dword_402194, dword_4021AF) == 1 )
      {
      MessageBoxA(
          0,
          "Congratulations! Please send your keygen (working one) to [email protected]!",
          "Duelist's Crackme #4",
          0x2000u);
      result = 1;
      }
      else
      {
LABEL_26:
      MessageBoxA(
          0,
          "Your registration info is invalid... Note that most of the special chars may raise registration problems!",
          "Duelist's Crackme #4",
          0x2000u);
      result = 0;
      }
    }
    else
    {
      if ( a3 == 2 )
      goto LABEL_25;
      result = 0;
    }
}
else
{
    if ( a2 != 272 )
    {
      if ( a2 != 16 )
      return 0;
LABEL_25:
      ExitProcess(ST14_4_0);
    }
    result = 1;
}
return result;
}

Luckly 发表于 2009-3-3 22:24:37

分析有奖励... 大家加油哦.

xingyue 发表于 2009-3-4 11:10:31

这样算明码了吧!/:014

[ 本帖最后由 xingyue 于 2009-3-4 11:13 编辑 ]

tavor 发表于 2009-3-4 13:51:08

算法分析:
1.用户名只能是字母或数字
2.如果是小写字母,先转换成大写字母
3.先在00402017处开始查找第一个字母并计数,查到的话到0040203C开始处取得相应位置上的密码。
   然后循环处理用户名就可以。
加密字典(原): A1LSK2DJF4HGP3QWO5EIR6UTYZ8MXN7CBV9
加密字典(密): SU7CSJKF09NCSDO9SDF09SDRLVK7809S4NF
算法应该是最简单的凯撒算法(好像叫这个)

破解过程:
1.出错对话框,暂停,找到相应的抛messagebox的地方。
2.试了几次发现下面好像消息分发处理,下条件断点,分别为dword ptr==111和dword ptr==110,也没去细查啥意思,:(
004010F2   . /EB 25         jmp   short chap203.00401119
004010F4 > > |817D 0C 11010>cmp   dword ptr , 111
004010FB   . |0F84 FA000000 je      chap203.004011FB
00401101   . |817D 0C 10010>cmp   dword ptr , 110
00401108 > . |74 16         je      short chap203.00401120
0040110A   . |837D 0C 10    cmp   dword ptr , 10
0040110E   . |0F84 F7000000 je      chap203.0040120B
00401114   . |B8 00000000   mov   eax, 0
00401119   > \5F            pop   edi
3.点击按纽,断下,单步,中间会利用SendDlgItemMessageA方法, WM_GETTEXTLENGTH消息获取用户名和密码的长度,不=的话则报错。
相=的时候,再利用WM_GETTEXT获取用户名和密码,然后对用户名作上面的加密处理得到真密码,然后和用户输入的密码进行比较,然后显示
成功或失败对话框。


[ 本帖最后由 tavor 于 2009-3-4 14:00 编辑 ]

tavor 发表于 2009-3-4 14:35:42

原帖由 Luckly 于 2009-3-3 22:21 发表 https://www.chinapyg.com/images/common/back.gif
这个IDA 真是太棒了... 和看vc一模一样//

signed int __stdcall DialogFunc(HWND a1, UINT a2, WPARAM a3, LPARAM a4)
{
UINT ST14_4_0; // ST14_4@0
signed int result; // eax@2
int v6; // eax@9
...
版主教一下咋设的IDA呀,这效果真棒呀,可我刚装了一下,没有你的这种效果呀。

wsbaaaa 发表于 2009-3-4 15:15:05

上几楼主的好厉害呀,学习中

hflywolf 发表于 2009-3-4 19:02:08

/:012 /:012 /:012
    既然标签已经修改回来,只能说给楼主提个醒,慎用原创标签!/:014

[ 本帖最后由 hflywolf 于 2009-3-4 19:25 编辑 ]
页: [1] 2
查看完整版本: 上次发错了,这个才是不明码比较的。高手飘过。