首页 > 代码库 > [反汇编练习] 160个CrackMe之010

[反汇编练习] 160个CrackMe之010

[反汇编练习] 160个CrackMe之010.

本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西。

其中,文章中按照如下逻辑编排(解决如下问题):

1、使用什么环境和工具

2、程序分析

3、思路分析和破解流程

4、注册机的探索

----------------------------------

提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大,只要你跟踪了,不用怎么看代码就理解了!

----------------------------------

1、工具和环境:

WinXP SP3 + 52Pojie六周年纪念版OD + PEID + 汇编金手指。

160个CrackMe的打包文件。

下载地址: http://pan.baidu.com/s/1xUWOY  密码: jbnq

注:

1、Win7系统对于模块和程序开启了随机初始地址的功能,会给分析带来很大的负担,所以不建议使用Win7进行分析。

2、以上工具都是在52PoJie论坛下的原版程序,NOD32不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。

wps_clip_image-142827

 

2、程序分析:

想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。

和上一节一样,打开CHM,选择第10个Andrénalin.3,保存下来。运行程序,程序界面如下:

4

 

3、思路分析和破解流程:

点击【OK】按钮之后,直接弹出了错误信息框(囧,虽然我看不明白说的啥),现象完全和之前的程序一样。使用PEID查看之后,Microsoft Visual Basic 5.0 / 6.0,没有加壳,可以直接放到OD中了!

1、打开OD,将exe拖到OD窗口中,等程序暂停后,直接点击运行按钮(F9),不用理会。

2、在exe中输入Key:bbdxf。点击OK按钮,弹出错误信息框,不要关闭。

3、在OD中点击暂停按钮(Ctrl+F2),再点击堆栈K按钮(Ctrl+K),可以看到当前堆栈情况。

1

4、和之前的一样,我们跟踪信息框所在的代码段,选中rtcMsgBox,右键->Show call,返回到反汇编界面。

5、在返回到的位置向上查看代码,寻找类似cmp,je等跳转信息,同样和之前的程序一样,很容易找到了。

00402050   .  66:85C0       test ax,ax00402053      0F84 C0000000 je 00402119                                           ;  // 和上一个一样的关键跳00402059   .  FF15 6C414000 call dword ptr ds:[<&MSVBVM50.#534>]                  ;  msvbvm50.rtcBeep0040205F   .  8B1D 94414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaVarDup>]        ;  msvbvm50.__vbaVarDup00402065   .  B9 0A000000   mov ecx,0xA0040206A   .  B8 04000280   mov eax,0x800200040040206F   .  898D 64FFFFFF mov dword ptr ss:[ebp-0x9C],ecx00402075   .  898D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ecx0040207B   .  8D95 44FFFFFF lea edx,dword ptr ss:[ebp-0xBC]00402081   .  8D4D 84       lea ecx,dword ptr ss:[ebp-0x7C]00402084   .  8985 6CFFFFFF mov dword ptr ss:[ebp-0x94],eax0040208A   .  8985 7CFFFFFF mov dword ptr ss:[ebp-0x84],eax00402090   .  C785 4CFFFFFF>mov dword ptr ss:[ebp-0xB4],00401B28                  ;  UNICODE "RiCHTiG !"0040209A   .  C785 44FFFFFF>mov dword ptr ss:[ebp-0xBC],0x8004020A4   .  FFD3          call ebx                                              ;  <&MSVBVM50.__vbaVarDup>004020A6   .  8D95 54FFFFFF lea edx,dword ptr ss:[ebp-0xAC]004020AC   .  8D4D 94       lea ecx,dword ptr ss:[ebp-0x6C]004020AF   .  C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],00401ABC004020B9   .  C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8004020C3   .  FFD3          call ebx004020C5   .  8D95 64FFFFFF lea edx,dword ptr ss:[ebp-0x9C]004020CB   .  8D85 74FFFFFF lea eax,dword ptr ss:[ebp-0x8C]004020D1   .  52            push edx004020D2   .  8D4D 84       lea ecx,dword ptr ss:[ebp-0x7C]004020D5   .  50            push eax004020D6   .  51            push ecx004020D7   .  8D55 94       lea edx,dword ptr ss:[ebp-0x6C]004020DA   .  6A 30         push 0x30004020DC   .  52            push edx004020DD   .  FF15 24414000 call dword ptr ds:[<&MSVBVM50.#595>]                  ;  msvbvm50.rtcMsgBox004020E3   .  8D95 14FFFFFF lea edx,dword ptr ss:[ebp-0xEC]004020E9   .  8D4D AC       lea ecx,dword ptr ss:[ebp-0x54]004020EC   .  8985 1CFFFFFF mov dword ptr ss:[ebp-0xE4],eax004020F2   .  C785 14FFFFFF>mov dword ptr ss:[ebp-0xEC],0x3004020FC   .  FFD6          call esi004020FE   .  8D85 64FFFFFF lea eax,dword ptr ss:[ebp-0x9C]00402104   .  8D8D 74FFFFFF lea ecx,dword ptr ss:[ebp-0x8C]0040210A   .  50            push eax0040210B   .  8D55 84       lea edx,dword ptr ss:[ebp-0x7C]0040210E   .  51            push ecx0040210F   .  8D45 94       lea eax,dword ptr ss:[ebp-0x6C]00402112   .  52            push edx00402113   .  50            push eax00402114   .  E9 B5000000   jmp 004021CE00402119   >  8B1D 94414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaVarDup>]        ;  msvbvm50.__vbaVarDup0040211F   .  B9 0A000000   mov ecx,0xA00402124   .  B8 04000280   mov eax,0x8002000400402129   .  898D 64FFFFFF mov dword ptr ss:[ebp-0x9C],ecx0040212F   .  898D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ecx00402135   .  8D95 44FFFFFF lea edx,dword ptr ss:[ebp-0xBC]0040213B   .  8D4D 84       lea ecx,dword ptr ss:[ebp-0x7C]0040213E   .  8985 6CFFFFFF mov dword ptr ss:[ebp-0x94],eax00402144   .  8985 7CFFFFFF mov dword ptr ss:[ebp-0x84],eax0040214A   .  C785 4CFFFFFF>mov dword ptr ss:[ebp-0xB4],00401C1C                  ;  UNICODE "LEiDER Falsch !  "00402154   .  C785 44FFFFFF>mov dword ptr ss:[ebp-0xBC],0x80040215E   .  FFD3          call ebx                                              ;  <&MSVBVM50.__vbaVarDup>00402160   .  8D95 54FFFFFF lea edx,dword ptr ss:[ebp-0xAC]00402166   .  8D4D 94       lea ecx,dword ptr ss:[ebp-0x6C]00402169   .  C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],00401B40                  ;  UNICODE "Leider Falsch!   Nochmal veruschen ! Wenn Du es ni"00402173   .  C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x80040217D   .  FFD3          call ebx0040217F   .  8D8D 64FFFFFF lea ecx,dword ptr ss:[ebp-0x9C]00402185   .  8D95 74FFFFFF lea edx,dword ptr ss:[ebp-0x8C]0040218B   .  51            push ecx0040218C   .  8D45 84       lea eax,dword ptr ss:[ebp-0x7C]0040218F   .  52            push edx00402190   .  50            push eax00402191   .  8D4D 94       lea ecx,dword ptr ss:[ebp-0x6C]00402194   .  6A 10         push 0x1000402196   .  51            push ecx00402197   .  FF15 24414000 call dword ptr ds:[<&MSVBVM50.#595>]                  ;  msvbvm50.rtcMsgBox

关键的跳转就是 je 00402119 ,在OD中选中这一行,很容易就可以发现JE是否跳转决定了提示的成功与失败!好吧,我们来爆破他!选中je 00402119这一行,右键->Binary->Fill with NOPs。回到exe程序,随意输入一个key,点击【OK】按钮,哈哈,是不是成功啦!

2

4、注册码探索

继续向上找,如果看过第9篇的就知道,他们还是基本一样的,请参考009。其中,VB代码反汇编需要参考http://www.cnblogs.com/bbdxf/p/3793545.html,分析之后代码如下:

00401F30   .  51            push ecx00401F31   .  8D45 94       lea eax,dword ptr ss:[ebp-0x6C]00401F34   .  52            push edx00401F35   .  50            push eax00401F36   .  FF15 14414000 call dword ptr ds:[<&MSVBVM50.__vbaLenVar>]           ;  msvbvm50.__vbaLenVar00401F3C   .  8D8D 44FFFFFF lea ecx,dword ptr ss:[ebp-0xBC]00401F42   .  50            push eax00401F43   .  8D95 ECFEFFFF lea edx,dword ptr ss:[ebp-0x114]00401F49   .  51            push ecx00401F4A   .  8D85 FCFEFFFF lea eax,dword ptr ss:[ebp-0x104]00401F50   .  52            push edx00401F51   .  8D4D DC       lea ecx,dword ptr ss:[ebp-0x24]00401F54   .  50            push eax00401F55   .  51            push ecx00401F56   .  FF15 1C414000 call dword ptr ds:[<&MSVBVM50.__vbaVarForInit>]       ;  msvbvm50.__vbaVarForInit00401F5C   .  8B1D 68414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaVarCat>]        ;  msvbvm50.__vbaVarCat00401F62   .  8B3D 00414000 mov edi,dword ptr ds:[<&MSVBVM50.__vbaFreeVarList>]   ;  msvbvm50.__vbaFreeVarList00401F68   >  85C0          test eax,eax00401F6A   .  0F84 BB000000 je 0040202B00401F70   .  8D55 94       lea edx,dword ptr ss:[ebp-0x6C]00401F73   .  8D45 DC       lea eax,dword ptr ss:[ebp-0x24]00401F76   .  52            push edx00401F77   .  50            push eax00401F78   .  C745 9C 01000>mov dword ptr ss:[ebp-0x64],0x100401F7F   .  C745 94 02000>mov dword ptr ss:[ebp-0x6C],0x200401F86   .  FF15 90414000 call dword ptr ds:[<&MSVBVM50.__vbaI4Var>]            ;  msvbvm50.__vbaI4Var00401F8C   .  8D4D BC       lea ecx,dword ptr ss:[ebp-0x44]00401F8F   .  50            push eax                                              ;  // eax=0x01 2 3 4 500401F90   .  8D55 84       lea edx,dword ptr ss:[ebp-0x7C]00401F93   .  51            push ecx                                              ;  // bbdxf00401F94   .  52            push edx00401F95   .  FF15 34414000 call dword ptr ds:[<&MSVBVM50.#632>]                  ;  msvbvm50.rtcMidCharVar00401F9B   .  8D45 84       lea eax,dword ptr ss:[ebp-0x7C]00401F9E   .  8D4D A8       lea ecx,dword ptr ss:[ebp-0x58]00401FA1   .  50            push eax00401FA2   .  51            push ecx00401FA3   .  FF15 64414000 call dword ptr ds:[<&MSVBVM50.__vbaStrVarVal>]        ;  msvbvm50.__vbaStrVarVal00401FA9   .  50            push eax00401FAA   .  FF15 08414000 call dword ptr ds:[<&MSVBVM50.#516>]                  ;  msvbvm50.rtcAnsiValueBstr00401FB0   .  66:05 0A00    add ax,0xA                                            ;  // 每个字符+0xA00401FB4   .  0F80 B0020000 jo 0040226A00401FBA   .  0FBFD0        movsx edx,ax00401FBD   .  52            push edx00401FBE   .  FF15 70414000 call dword ptr ds:[<&MSVBVM50.#537>]                  ;  msvbvm50.rtcBstrFromAnsi00401FC4   .  8985 7CFFFFFF mov dword ptr ss:[ebp-0x84],eax00401FCA   .  8D45 CC       lea eax,dword ptr ss:[ebp-0x34]00401FCD   .  8D8D 74FFFFFF lea ecx,dword ptr ss:[ebp-0x8C]00401FD3   .  50            push eax                                              ;  // 上次存的00401FD4   .  8D95 64FFFFFF lea edx,dword ptr ss:[ebp-0x9C]00401FDA   .  51            push ecx                                              ;  // +0xA之后的字符文本00401FDB   .  52            push edx00401FDC   .  C785 74FFFFFF>mov dword ptr ss:[ebp-0x8C],0x800401FE6   .  FFD3          call ebx                                              ;  __vbaStrCat // 连接字符串,结果放在eax00401FE8   .  8BD0          mov edx,eax                                           ;  // bbdxf循环到x时,超出128,所以被截断了00401FEA   .  8D4D CC       lea ecx,dword ptr ss:[ebp-0x34]00401FED   .  FFD6          call esi00401FEF   .  8D4D A8       lea ecx,dword ptr ss:[ebp-0x58]00401FF2   .  FF15 B0414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeStr>]          ;  msvbvm50.__vbaFreeStr00401FF8   .  8D85 74FFFFFF lea eax,dword ptr ss:[ebp-0x8C]00401FFE   .  8D4D 84       lea ecx,dword ptr ss:[ebp-0x7C]00402001   .  50            push eax00402002   .  8D55 94       lea edx,dword ptr ss:[ebp-0x6C]00402005   .  51            push ecx00402006   .  52            push edx00402007   .  6A 03         push 0x300402009   .  FFD7          call edi0040200B   .  83C4 10       add esp,0x100040200E   .  8D85 ECFEFFFF lea eax,dword ptr ss:[ebp-0x114]00402014   .  8D8D FCFEFFFF lea ecx,dword ptr ss:[ebp-0x104]0040201A   .  8D55 DC       lea edx,dword ptr ss:[ebp-0x24]0040201D   .  50            push eax0040201E   .  51            push ecx0040201F   .  52            push edx00402020   .  FF15 A4414000 call dword ptr ds:[<&MSVBVM50.__vbaVarForNext>]       ;  msvbvm50.__vbaVarForNext00402026   .^ E9 3DFFFFFF   jmp 00401F680040202B   >  8D45 CC       lea eax,dword ptr ss:[ebp-0x34]                       ;  // 循环后的结果存到eax中0040202E   .  8D8D 54FFFFFF lea ecx,dword ptr ss:[ebp-0xAC]00402034   .  50            push eax                                              ;  // eax = 计算输入的文本后的值00402035   .  51            push ecx00402036   .  C785 5CFFFFFF>mov dword ptr ss:[ebp-0xA4],00401A8C                  ;  UNICODE "kXy^rO|*yXo*m\kMuOn*+"00402040   .  C785 54FFFFFF>mov dword ptr ss:[ebp-0xAC],0x8008                    ;  // 修改ecx指针的值为上面的字符串0040204A   .  FF15 40414000 call dword ptr ds:[<&MSVBVM50.__vbaVarTstEq>]         ;  msvbvm50.__vbaVarTstEq00402050   .  66:85C0       test ax,ax00402053      0F84 C0000000 je 00402119                                           ;  // 和上一个一样的关键跳

算法分析如下:

在VB中,使用了 __vbaVarForInit,__vbaFreeVarList,__vbaVarForNext 三个函数完成了一个For循环(参看上面的汇编代码),再循环中,每一次通过rtcMidCharVar取出一个字符,然后使用 rtcAnsiValueBstr 将字符转换为ANSII码值,将ANSII值加上0x0A之后再转换回字符,最后组成的字符串与"kXy^rO|*yXo*m\kMuOn*+"比较,比较的结果决定je跳转的成功和失败。

 

下面使用代码反计算Key值:

C/CPP代码:

#include "stdafx.h"#include "iostream"int _tmain(int argc, _TCHAR* argv[]){	char keyCode[100] = "kXy^rO|*yXo*m\\kMuOn*+";	char keyOld[100] = {0};	int nLen = strlen(keyCode);	printf("%d\r\n",nLen);	for ( int i=0;i<nLen;i++ )	{		keyOld[i] = keyCode[i] - 0x0A;	}	printf("Key: %s\r\n",keyOld);	system("pause");	return 0;}

3

 

BY  笨笨D幸福