首页
社区
课程
招聘
[原创]一个crackme----重复前人的路
发表于: 2009-4-30 12:58 6680

[原创]一个crackme----重复前人的路

2009-4-30 12:58
6680

今天翻电脑偶尔发现一篇很早以前写的crackme破文,是PEDIY CrackMe 2007里面的,偷个懒就不修改了,虽然文章看起来很幼稚,但毕竟是自己动手的,保持原来的好,适合初学者,错误再所难免,请大家不要那东西砸我就好了    

不多说了,言归正转:

     用PEID查下,“MASM32 / TASM32”没壳。先运行程序提示“Patch me if you can ”。

     确定之后界面出来了。点Check,没反应!随便输入点什么东西再点,还是没反应!!

     用OD加载后,查找一下字符串"Patch me if you can" ,或者是查找当前模块的API函数,因为有输入框,自然而然就想到API函数 :GetWindowText,下断点,运行程序,
    输入用户名:pediy
    注册玛:787878

  F9。。。。。
停在:
... ...
00401219   . >mov     dword ptr [403C64], <jmp.&user32.GetWindowTextA>
00401223   . >sub     dword ptr [403C64], 9
0040122A   > >push    1FF
0040122F   . >cmp     ebx, 1
00401232   . >jnz     short 00401241
00401234   . >push    00403054
00401239   . >push    dword ptr [40304C]
0040123F   . >jmp     short 0040124C
00401241   > >push    00403654
00401246   . >push    dword ptr [403050]
0040124C   > >cmp     ebx, 1
0040124F   . >je      short 00401258
00401251   . >add     dword ptr [403C64], 9
00401258   > >call    dword ptr [403C64]
0040125E   . >inc     ebx
0040125F   . >cmp     ebx, 2
00401262   .^>jl      short 0040122A
00401264   . >mov     dword ptr [403C70], <jmp.&kernel32.lstrlenA>
0040126E   . >dec     dword ptr [403C70]
00401274   . >mov     dword ptr [403C68], <jmp.&user32.GetWindowTextLengthA>
0040127E   . >inc     dword ptr [403C68]
00401284   . >push    dword ptr [40304C]
0040128A   . >dec     dword ptr [403C68]

00401290   .  FF15 683C4000 call    dword ptr [403C68]             ;  <jmp.&user32.GetWindowTextLengthA>(ASCII "pediy")
00401296   .  83F8 05       cmp     eax, 5                         ;用户名是否大于等于5,关键跳
00401299   .  0F8C 43010000 jl      004013E2
0040129F   .  83F8 08       cmp     eax, 8                         ;用户名是否小于8,关键跳
004012A2   .  0F8D 3A010000 jge     004013E2
004012A8   .  8BC8          mov     ecx, eax                       ;用户名是长度5                     
004012AA   .  890D 543C4000 mov     dword ptr [403C54], ecx
004012B0   .  33DB          xor     ebx, ebx
004012B2   .  8D35 54304000 lea     esi, dword ptr [403054]          ;  Address=00403054, (ASCII "pediy")     从4012B8--4012DF是用户名的第一次变化,变化后地址在4012DA指定的byte ptr [ebx+edi]中:
004012B8   .  8D3D 54324000 lea     edi, dword ptr [403254]          ;  Address=00403254
004012BE   > /8A4431 FF     mov     al, byte ptr [ecx+esi-1]         ;  第一次取值(ASCII "y")
004012C2   . |80F9 04       cmp     cl, 4
004012C5   . |74 13         je      short 004012DA
004012C7   . |3C 4D         cmp     al, 4D
004012C9   . |7C 04         jl      short 004012CF
004012CB   . |2C 11         sub     al, 11
004012CD   . |EB 02         jmp     short 004012D1
004012CF   > |04 15         add     al, 15
004012D1   > |32C1          xor     al, cl
004012D3   . |34 02         xor     al, 2
004012D5   . |88043B        mov     byte ptr [ebx+edi], al           ;  al=6F ('o')  ds:[00403254]=00
004012D8   . |EB 04         jmp     short 004012DE
004012DA   > |C6043B 2D     mov     byte ptr [ebx+edi], 2D
004012DE   > |43            inc     ebx
004012DF   .^\E0 DD         loopdne short 004012BE

004012E1   .  8D35 54324000 lea     esi, dword ptr [403254]                       ;  Address=00403254, (ASCII "o-RT\")
004012E7   .  8D3D 54344000 lea     edi, dword ptr [403454]
004012ED   .  8B0D 543C4000 mov     ecx, dword ptr [403C54]                       ;  ds:[00403C54]=00000005
004012F3   .  33DB          xor     ebx, ebx
004012F5   .  C705 5C3C4000>mov     dword ptr [403C5C], <jmp.&kernel32.lstrcatA>
004012FF   .  832D 5C3C4000>sub     dword ptr [403C5C], 2                         ;  ds:[00403C5C]=004016D6 (crackme.004016D6)
00401306   .  C705 783C4000>mov     dword ptr [403C78], 0040207F                  ;  0040207F=0040207F (ASCII ":-)")
00401310   .  C705 7C3C4000>mov     dword ptr [403C7C], 00402070                  ;  ASCII "Correct Serial"
0040131A   .  832D 783C4000>sub     dword ptr [403C78], 5                    ;  ds:[00403C78]=0040207F (crackme.0040207F), ASCII ":-)"
00401321   .  832D 7C3C4000>sub     dword ptr [403C7C], 5        ;  ds:[00403C7C]=00402070 (crackme.00402070), ASCII "Correct Serial"

; 从401328--401349是用户名的第一次变化,变化后地址在401344指定的byte ptr [ebx+edi]中:

00401328   >  80F9 04       cmp     cl, 4
0040132B   .  74 17         je      short 00401344
0040132D   .  8A4431 FF     mov     al, byte ptr [ecx+esi-1]    ;  ds:[00403258]=5C ('\')
00401331   .  3C 4D         cmp     al, 4D
00401333   .  7C 04         jl      short 00401339
00401335   .  2C 11         sub     al, 11
00401337   .  EB 02         jmp     short 0040133B
00401339   >  04 15         add     al, 15
0040133B   >  32C1          xor     al, cl
0040133D   .  34 02         xor     al, 2
0040133F   .  88043B        mov     byte ptr [ebx+edi], al
00401342   .  EB 04         jmp     short 00401348
00401344   >  C6043B 2D     mov     byte ptr [ebx+edi], 2D
00401348   >  43            inc     ebx
00401349   .^ E0 DD         loopdne short 00401328

0040134B   .  C705 603C4000>mov     dword ptr [403C60], <jmp.&user32.MessageBoxA> ;Entry address
00401355   .  832D 603C4000>sub     dword ptr [403C60], 7
0040135C   .  68 54324000   push    00403254                          ;  ASCII "o-RT\"
00401361   .  68 54344000   push    00403454                          ;  ASCII "L-@B]"
00401366   .  8305 5C3C4000>add     dword ptr [403C5C], 2
0040136D   .  FF15 5C3C4000 call    dword ptr [403C5C]               ;  crackme.004016D4
00401373   .  68 54344000   push    00403454; ASCII                 ;  L-@B]o-RT\"
                       ;地址403454就是由输入的用户名变换来的注册码地址 ASCII "L-@B]o-RT\"
00401378   .  FF05 703C4000 inc     dword ptr [403C70]               ;  crackme.004016DC
0040137E   .  FF15 703C4000 call    dword ptr [403C70]               ;  <jmp.&kernel32.lstrlenA>
00401384   .  A3 743C4000   mov     dword ptr [403C74], eax
00401389   .  68 54364000   push    00403654                         ;  ASCII "787878"
0040138E   .  FF15 703C4000 call    dword ptr [403C70]               ;  <jmp.&kernel32.lstrlenA>
//00401394   .  3B05 743C4000 cmp     eax, dword ptr [403C74]
//0040139A      75 46         jnz     short 004013E2                 ;关键跳
0040139C   .  FF35 543C4000 push    dword ptr [403C54]
004013A2   .  68 54344000   push    00403454                         ;  ASCII "L-@B]o-RT\"
004013A7   .  68 54364000   push    00403654                         ;  ASCII "787878"
//004013AC   .  E8 9F000000   call    00401450
           00401450  /$  55            push    ebp
           00401451  |.  8BEC          mov     ebp, esp
           00401453  |.  8B45 0C       mov     eax, dword ptr [ebp+C]  ;Stack ss:[0012FC7C]=00403454 ASCII "L-@B]o-RT\"
           00401456  |.  8B75 08       mov     esi, dword ptr [ebp+8]  ;Stack ss:[0012FC78]=00403654 ASCII "787878"
           00401459  |.  8B4D 10       mov     ecx, dword ptr [ebp+10] ;Stack ss:[0012FC80]=00000005
           0040145C  |> /A6            /cmps    byte ptr [esi], byte ptr es:[edi]
           0040145D  |.  75 0F         |jnz     short 0040146E
           0040145F  |.  49            |dec     ecx
           00401460  |.  83F9 00       |cmp     ecx, 0
           00401463  |.^ 75 F7         \jnz     short 0040145C
           00401465  |.  B8 00000000   mov     eax, 0
           0040146A  |.  C9            leave
           0040146B  |.  C2 0C00       retn    0C
           0040146E  |>  B8 01000000   mov     eax, 1
           00401473  |.  C9            leave
           00401474  \.  C2 0C00       retn    0C

//004013B1   .  83F8 01       cmp     eax, 1
//004013B4      74 2C         je      short 004013E2
004013B6   .  8305 7C3C4000>add     dword ptr [403C7C], 5
004013BD   .  8305 783C4000>add     dword ptr [403C78], 5
004013C4   .  6A 40         push    40
004013C6   .  FF35 783C4000 push    dword ptr [403C78]               ;  crackme.0040207A
004013CC   .  FF35 7C3C4000 push    dword ptr [403C7C]               ;  crackme.0040206B
004013D2   .  FF75 08       push    dword ptr [ebp+8]
004013D5   .  8305 603C4000>add     dword ptr [403C60], 7
004013DC   .  FF15 603C4000 call    dword ptr [403C60]               ;  crackme.0040167B正确
004013E2   >  E8 21000000   call    00401408                         ;  错误

水平有限,出现错误再所难免,竟请批评指正

以下是注册机(C学得很烂,代码有些乱,见谅)

输入用户名:pediy
注册玛:787878

大概步骤:

       用@1表示 4012DA指定的byte ptr [ebx+edi]中
       用@2表示 401344指定的byte ptr [ebx+edi]中
 
        1:先将所输入的5至7位的用户名(按逆向)各位所对应的ASCII值进行:若小于4D则加15(16进制),否则减去11(16进制)-->与ecx异或(ecx的值由7至1递减)-->与2(16进制)异或-->将循环得到的字符串"o-RT\"送入地址@1中 。

        2:然后将@1中处得到的新字串代替上步中的用户名,执行相同操作后,将新字串"L-@B]"送入@2中。

        3:将A、B所得字串连接(@2字串在@1字串前面),即为注册码"L-@B]o-RT\"

#include "stdafx.h"
#include <stdio.h>
#include <string.h>

char zhucema(char aa,int k)
{
  int kk=k+1;
  if(kk==4)
    aa=45;  //16进制数表示为2D
  else if(aa<'M')
  {
    int k1=(int)aa;
    k1+=21;//16进制数表示为15
    k1^=kk;
    k1^=2;//16进制数表示为2
    aa=(char)k1;
  }
  else
  {
    int k1=(int)aa;
    k1-=17;//16进制数表示为11
    k1^=kk;
    k1^=2;//16进制数表示为2
    aa=(char)k1;        
  }
  return aa;
}

int main(int argc, char* argv[])
{
  int i=0,j;
  char a1[8]="\0",a2[8]="\0",zcm[16]="\0",str[8];
  do
  {
    printf("请输入用户名:");
    scanf("%s",str);
    int k=strlen(str);
    if((k>=5)&&(k<8))
    {
      for(i=k-1,j=0;i>0,j<k;i--,j++)
        a1[j]=zhucema(str[i],i);
      for(i=k-1,j=0;i>0,j<k;i--,j++)
        a2[j]=zhucema(a1[i],i);
      strcpy(zcm,a2);
      strcat(zcm,a1);  

      printf("得到注册码是:");
      int k1=strlen(zcm);
      for(i=0;i<k1;i++)
        printf("%c",zcm[i]);  
      printf("\n\n");
      i--;
    }
    else 
    {
      printf("请输入大于4小于8的字符\n");
      i=3;
      continue;
    }
  }while(i);  
  return 0;
}


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (9)
雪    币: 431
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
正在学习中  支持
2009-4-30 13:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
這裏的 accembly code 存在兩個 weakness,比起author post 的“第二篇”的有九或十個,少了很多。
由此看來,author 可能還沒看到這個leakage。
這是學 assembly 所會遇到的盲點。
請 author 再仔看看哪裡有我說的那個 weakness,若真得找不出來的話,我再指出來在什麼地方。
2009-5-4 05:56
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
4
這裏有兩個疑問
1)在
004012B0   .  33DB          xor     ebx, ebx
004012F3   .  33DB          xor     ebx, ebx

它的 machine code 為什麼不是

004012B0   .  31DB          xor     ebx, ebx
004012F3   .  31DB          xor     ebx, ebx

2)既然用到 32 bits register ebx,應該會會是 6633DB 或是 6631DB 的 machine code。
如果只是 16 bits rgister,是否用 xor bx,bx 即可?
2009-5-5 03:10
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
5
打造自己的反汇编引擎——Intel指令编码学习报告(四)



打造自己的反汇编引擎——Intel指令编码学习报告(三)

[QUOTE=egogg;525251]2.3 操作数大小改写指令:(66H)

    首先做一下试验:
    00401006      8B06          mov     eax, dword ptr [esi]
    00401008      66:8B06       mov     ax, word ptr [esi]
    可以看到,66H使得指令的操作数从32位变到了16位。386时,intel把所有的通用寄存器都增加到了32位,但是intel并没有增加操作这些寄存器的指令,他们解决的办法就是直接使用同16位操作时相同的编码,同时使用操作数大小改写指令作为二者之间的区分。这里要注意改写的涵义:当目前cpu工作在16位模式时,66H的出现将使操作变成32位。也就是cpu工作在16位的时候:
    00401006      8B06          mov     ax, word ptr [esi]
    00401008      66:8B06       mov     eax, dword ptr [esi]
...
...
稍微总结一下,操作数改写指令是在16位和32位(full-register)之间转换的前缀指令,转化的结果跟目前cpu工作的模式有关。还有,就是要注意,全寄存器和部分寄存器之间的概念上的差别。[/QUOTE]
2009-5-5 06:48
0
雪    币: 1140
活跃值: (4217)
能力值: ( LV5,RANK:69 )
在线值:
发帖
回帖
粉丝
6
00440106      33DB         xor ebx,ebx
00440108      31DB         xor ebx,ebx
0044010A      90           nop
0044010B      66:31DB      xor bx,bx
0044010E      66:31DB      xor bx,bx



OD 中编辑是这样的   不知道为什么
2009-5-5 06:50
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=sessiondiy;617201]打造自己的反汇编引擎——Intel指令编码学习报告(四) ("http://bbs.pediy.com/showthread.php?t=75473")

這裏有提到.....「有一种一一对应的关系是一定存在的,那就是一定的操作对应于一定的机器码。」我非常贊同。

我只是覺得這樣的情況,會有一種「既生俞,何生亮」的感覺。

打造自己的反汇编引擎——Intel指令编码学习报告(三) ("http://bbs.pediy.com/showthrea...[/QUOTE]

解說的非常清楚。

不好意思,拿了1990年的東西出來獻醜。
這是我目前近20年來聽到比較滿意的答案。^_^
2009-5-5 14:45
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
8
1) 如果 0044010E      66:31DB      xor bx,bx 改成 0044010E      66:33DB      xor bx,bx

那應該會變成

0044010E      66:33DB      xor bx,bx

2)

sessiondiy 已引用了egogg 的觀點,雖然回答了問題(現象),但卻沒解釋為什麼會這樣的(原因)。
2009-5-5 14:59
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习。。。
期待wsadqeqe的答案
2009-5-6 11:06
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
10
是我暫借朋友 wsadqeqe 來回留言的,當時申請成為會員很麻煩,所以借他來回文。
我的問題已經指逋來了,請往上面看。
謝謝。
2009-5-6 17:43
0
游客
登录 | 注册 方可回帖
返回
//