首页
社区
课程
招聘
第一次非爆破,虽然简单,但自己乐屁啦
发表于: 2012-12-3 14:52 8886

第一次非爆破,虽然简单,但自己乐屁啦

2012-12-3 14:52
8886
新手第一篇非爆破

今天网上搜索点儿资料,从国外网站上下载来些ps后缀文件,还以为是Photoshop文件,用PhotoShop打开,哇擦擦,就一图层上面有点英文字母,类似论文题目似的,觉得不对劲。
用UltraEdit打开,乱码,更不对劲了。
于是上网查了一下,原来是PostScript(PS),是专门为打印图形和文字而设计的一个编程语言。得装两个东西,ghostscript和gsview。装过后用gsview打开刚那文件,可以看了,但提示注册。
 
试了一下,那个Online Registration,网页上不去,但不注册也可以用。但是呢,邪恶的心理出来了,咱不是初学逆向嘛,准备自己动手。
右键PEID载入,Nothing found,deep也还是nothing,不管了,直接OD吧。

OD载入后,直接Ctrl + G下GetDlgItemTextA的断点了,瞎猜的。然后F9,出现注册框后,输入registered to : pediy,number:12345-6789
 
然后OK,还真被断下了,Alt + F9回到用户领空,如下 :
0043D93C  |. /0F84 10010000 je      gsview32.0043DA52
0043D942  |. |E9 32010000   jmp     gsview32.0043DA79
0043D947  |> |6A 00         push    0                     ; /IsSigned = FALSE
0043D949  |. |6A 00         push    0                      ; |pSuccess = NULL
0043D94B  |. |68 EB080000   push    8EB                    ; |ControlID = 8EB (2283.)
0043D950  |. |8B4D 08       mov     ecx, dword ptr [ebp+8]          ; |
0043D953  |. |51            push    ecx                          ; |hWnd
0043D954  |. |FF15 58334600 call    dword ptr [<&USER32.GetDlgItemIn>; \GetDlgItemInt
0043D95A  |. |8945 FC       mov     dword ptr [ebp-4], eax
0043D95D  |. |6A 00         push    0                      ; /IsSigned = FALSE
0043D95F  |. |6A 00         push    0                      ; |pSuccess = NULL
0043D961  |. |68 EC080000   push    8EC                    ; |ControlID = 8EC (2284.)
0043D966  |. |8B55 08       mov     edx, dword ptr [ebp+8]    ; |
0043D969  |. |52            push    edx                    ; |hWnd
0043D96A  |. |FF15 58334600 call    dword ptr [<&USER32.GetDlgItemIn>; \GetDlgItemInt
0043D970  |. |8985 F4FEFFFF mov     dword ptr [ebp-10C], eax
0043D976  |. |68 00010000   push    100                   ; /Count = 100 (256.)
0043D97B  |. |8D85 F8FEFFFF lea     eax, dword ptr [ebp-108]   ; |
0043D981  |. |50            push    eax                   ; |Buffer
0043D982  |. |68 EA080000   push    8EA                   ; |ControlID = 8EA (2282.)
0043D987  |. |8B4D 08       mov     ecx, dword ptr [ebp+8]   ; |
0043D98A  |. |51            push    ecx                   ; |hWnd
0043D98B  |. |FF15 04344600 call    dword ptr [<&USER32.GetDlgItemTe>; \GetDlgItemTextA
0043D991  |. |837D FC 00    cmp     dword ptr [ebp-4], 0        ;断到这点
0043D995  |. |74 70         je      short gsview32.0043DA07
0043D997  |. |8B55 FC       mov     edx, dword ptr [ebp-4]
0043D99A  |. |52            push    edx                        ; 第一个码框值
0043D99B  |. |E8 F0FEFDFF   call    gsview32.0041D890
0043D9A0  |. |83C4 04       add     esp, 4
0043D9A3  |. |3985 F4FEFFFF cmp     dword ptr [ebp-10C], eax
0043D9A9     |75 5C         jnz     short gsview32.0043DA07
0043D9AB  |. |8D85 F8FEFFFF lea     eax, dword ptr [ebp-108]
0043D9B1  |. |50            push    eax                              ; /String
0043D9B2  |. |FF15 08334600 call    dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA
0043D9B8  |. |85C0          test    eax, eax
0043D9BA  |. |7E 4B         jle     short gsview32.0043DA07

返回到0043D991,从这点往上看,有两个GetDlgItemInt,猜这两个应该是读取注册码的了。
查这时的EBP为0006EA68,
然后看这两条
0043D95A  |. |8945 FC       mov     dword ptr [ebp-4], eax
在堆栈中查EBP-4 = 0006EA64,值为0x00003039,换成十进制,12345,这就对了

 

下面这句[ebp-10C]也一样
0043D970  |. |8985 F4FEFFFF mov     dword ptr [ebp-10C], eax
 
0x00001A85 = 6789,PS:在这看到了pediy,输入的名字,瞅一下GetDlgItemTextA
0043D976  |. |68 00010000   push    100                   ; /Count = 100 (256.)
0043D97B  |. |8D85 F8FEFFFF lea     eax, dword ptr [ebp-108]   ; |
0043D981  |. |50            push    eax                   ; |Buffer
0043D982  |. |68 EA080000   push    8EA                   ; |ControlID = 8EA (2282.)
0043D987  |. |8B4D 08       mov     ecx, dword ptr [ebp+8]   ; |
0043D98A  |. |51            push    ecx                   ; |hWnd
0043D98B  |. |FF15 04344600 call    dword ptr [<&USER32.GetDlgItemTe>; \GetDlgItemTextA
Buffer的地址是[ebp-108],这就和上面对着了

一路F8到0043D998
0043D99B  |. |E8 F0FEFDFF   call    gsview32.0041D890
0043D9A0  |. |83C4 04       add     esp, 4
0043D9A3  |. |3985 F4FEFFFF cmp     dword ptr [ebp-10C], eax
0043D9A9     |75 5C         jnz     short gsview32.0043DA07
这时下面有一句jnz     short gsview32.0043DA07
看看这点的代码
0043DA07  |> \68 FF000000   push    0FF
0043DA0C  |.  8D85 F0FDFFFF lea     eax, dword ptr [ebp-210]
0043DA12  |.  50            push    eax
0043DA13  |.  68 60030000   push    360
0043DA18  |.  E8 C3F2FFFF   call    gsview32.0043CCE0
0043DA1D  |.  83C4 0C       add     esp, 0C
0043DA20  |.  6A 30         push    30                    ; /Style = 
0043DA22  |.  68 A0014700   push    gsview32.004701A0      ; |Title = "GSview"
0043DA27  |.  8D8D F0FDFFFF lea     ecx, dword ptr [ebp-210]   ; |
0043DA2D  |.  51            push    ecx                   ; |Text
0043DA2E  |.  8B55 08       mov     edx, dword ptr [ebp+8]   ; |
0043DA31  |.  52            push    edx                       ; |hOwner
0043DA32  |.  FF15 38344600 call    dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
0043DA38  |>  B8 01000000   mov     eax, 1
0043DA3D  |.  EB 40         jmp     short gsview32.0043DA7F
看出来是跳到MessageBoxA提示错误了,那上面那个函数,就是关键的了。F7之前先看一下下面两条语句
0043D9A0  |. |83C4 04       add     esp, 4
0043D9A3  |. |3985 F4FEFFFF cmp     dword ptr [ebp-10C], eax
第一条是平衡栈,第二条,函数的返回值竟然是和我们输入的第二个框的码值比较!!!
好吧F7进入0043D99B  |. |E8 F0FEFDFF   call    gsview32.0041D890

0041D890  /$  55            push    ebp
0041D891  |.  8BEC          mov     ebp, esp
0041D893  |.  83EC 14       sub     esp, 14               ;  局部变量区域(20byte)
0041D896  |.  C745 EC 08840>mov     dword ptr [ebp-14], 8408
0041D89D  |.  8B45 08       mov     eax, dword ptr [ebp+8]
0041D8A0  |.  8945 F0       mov     dword ptr [ebp-10], eax   ; 局部变量tmp,初始值=12345
0041D8A3  |.  C745 F8 00000>mov     dword ptr [ebp-8], 0           ;  tmp1
0041D8AA  |.  C745 F4 00000>mov     dword ptr [ebp-C], 0           ;  i
0041D8B1  |.  EB 09         jmp     short gsview32.0041D8BC
0041D8B3  |>  8B4D F4       /mov     ecx, dword ptr [ebp-C]        ;  ecx = i
0041D8B6  |.  83C1 01       |add     ecx, 1                      ;  i++
0041D8B9  |.  894D F4       |mov     dword ptr [ebp-C], ecx
0041D8BC  |>  837D F4 20     cmp     dword ptr [ebp-C], 20        ;  判断是否<=0x20 (32次)
0041D8C0  |.  73 35         |jnb     short gsview32.0041D8F7
0041D8C2  |.  8B55 F8       |mov     edx, dword ptr [ebp-8]        ;  edx=tmp1
0041D8C5  |.  83E2 01       |and     edx, 1                      ;  edx =edx &  1
0041D8C8  |.  8955 FC       |mov     dword ptr [ebp-4], edx        ;  t[ebp-4]
0041D8CB  |.  8B45 F8       |mov     eax, dword ptr [ebp-8]        ;  eax = tmp1
0041D8CE  |.  D1E8          |shr     eax, 1                          ;  eax = eax >> 1
0041D8D0  |.  8B4D F0       |mov     ecx, dword ptr [ebp-10]         ;  ecx = tmp = 12345
0041D8D3  |.  83E1 01       |and     ecx, 1                          ;  ecx = ecx & 1
0041D8D6  |.  C1E1 0F       |shl     ecx, 0F                  ;  ecx = ecx << 15
0041D8D9  |.  03C1         |add     eax, ecx
0041D8DB  |.  8945 F8       |mov    dword ptr [ebp-8], eax      ; tmp1 = ((tmp & 1) << 15) + (tmp1 >> 1)
0041D8DE  |.  837D FC 01    |cmp     dword ptr [ebp-4], 1            ;  (t == 1)?
0041D8E2  |.  75 09         |jnz     short gsview32.0041D8ED         ;  if(t == 1)
0041D8E4  |.  8B55 F8       |mov     edx, dword ptr [ebp-8]
0041D8E7  |.  3355 EC       |xor     edx, dword ptr [ebp-14]
0041D8EA  |.  8955 F8       |mov     dword ptr [ebp-8], edx          ;  tmp1 = tmp1 ^0x8408
0041D8ED  |>  8B45 F0       |mov     eax, dword ptr [ebp-10]
0041D8F0  |.  D1E8          |shr     eax, 1
0041D8F2  |.  8945 F0       |mov     dword ptr [ebp-10], eax         ;  tmp = tmp >> 1
0041D8F5  |.^ EB BC         \jmp     short gsview32.0041D8B3
0041D8F7  |>  8B45 F8       mov     eax, dword ptr [ebp-8]           ;  eax = tmp1
0041D8FA  |.  8BE5          mov     esp, ebp
0041D8FC  |.  5D            pop     ebp
0041D8FD  \.  C3            retn
分析了一下,写成C程序,是下面这
unsigned int  Key(unsigned int  date)
{
  unsigned int uiTmp_ebp_4; 
  unsigned int uiTmp_ebp_10; 
  int i; 
  unsigned int uiTmp_ebp_8; 

  uiTmp_ebp_10 = date;
  uiTmp_ebp_8 = 0;
  for ( i = 0; i < 0x20; ++i )
  {
    uiTmp_ebp_4 = uiTmp_ebp_8 & 1;
    uiTmp_ebp_8 = ((uiTmp_ebp_10 & 1) << 15) + (uiTmp_ebp_8 >> 1);
    if ( uiTmp_ebp_4 == 1 )
    uiTmp_ebp_8 ^= 0x8408u;
    uiTmp_ebp_10 >>= 1;
  }
  return uiTmp_ebp_8;
}

变量名就用和在栈里面的一样了,ebp_4,ebp_8,ebp_10
最后返回时,eax里面的值为0x5039(20537)即key(12345)=20537

这也就是说,第二个框里面是20537了,对应于第一个框的12345

后面的不分析了,自己还以为要有对用户名的验证,但是,重新加载后,输入帐号pediy,12345-20537后,直接成功了,什么也没有,关闭后重新打开也不提示注册了。
猜想应该是在注册表里面写东西了,win+R输入regedit,HLM\Software\ghostgum\gsview,里面显示Name :pediy,receipt:0x00003039(12345)
 
从头想了一下,这只是一个简单的用户注册吧,第一次分析这算法,之前都是直接爆,,,,,对老手来说简单的要死,可是对我这菜鸟来说,还是挺兴奋,嘿嘿

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 368
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
路过了支持下
2012-12-3 15:48
0
雪    币: 107
活跃值: (439)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
F5飘过..........................
2012-12-3 16:28
0
雪    币: 778
活跃值: (208)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
4
支持下,123456
2012-12-6 11:34
0
雪    币: 197
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
支持 看到了算法分析
2012-12-22 10:02
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
作为菜鸟,分析了这个软件,确实如 打pipi 的文章所写,算法简单详细,感谢。
2013-7-21 02:46
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
內容很詳細.對新手有很大的幫助.支持~
2013-7-21 19:33
0
雪    币: 94
活跃值: (120)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
眼花,眼好花。
2013-7-21 20:58
0
游客
登录 | 注册 方可回帖
返回