首页
社区
课程
招聘
[原创]Unpack and KeygenMe
发表于: 2006-5-5 20:00 9723

[原创]Unpack and KeygenMe

2006-5-5 20:00
9723
收藏
免费 7
支持
分享
最新回复 (28)
雪    币: 296
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
2
是个Unpackme
上传的附件:
2006-5-5 20:13
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
3
PESpin v1.3的壳,应该不难吧,如果有必要我可以上传未加壳的。
2006-5-5 20:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
上传未加壳的,可以吗?
2006-5-5 21:03
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
5
先试试吧,实在不行了再上传。
2006-5-5 21:12
0
雪    币: 333
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wan
6
PESpin是个对偶等来说是有难度的壳啊
2006-5-5 22:06
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
刚回家,呵呵,五一真累.粗略看了一下,还没时间仔细跟,laomms上传个未加壳的好了,我对壳不精通,脱壳后尚未修复.
00401000   dd      MSVBVM60.__vbaVarSub              (初始 CPU 选择)
0040F060   push    ebp                               点击确定
0040F38D   push    eax                               以上获取机器码入eax
0040F394   fadd    qword ptr [401240]                此处研究一下相加的数值
0040F3AA   lea     ecx, [ebp-200]                    以上将相加得到的数值DECTOHEX
0040F4B1   call    00413B10                          MD5
0040F5B1   cmp     di, si                            以上判断用户名是否为空
0040F647   lea     ecx, [ebp-258]                    以上"请输入用户名"
0040F6C9   mov     edi, eax                          以上判断信箱是否为空
0040F780   lea     edx, [ebp-258]                    以上"邮箱号不能为空"或"请检查EMAIL格式"
0040F7FA   mov     edx, [ebp-200]                    信箱入edx
0040F80B   call    [eax+6F8]                         检查信箱是否符合常规
0040F90D   mov     ecx, [ebp-200]                    注册码入ecx
0040F91F   mov     edi, eax                          以上判断注册码是否为空
0040F9C0   lea     eax, [ebp-258]                    以上"注册码不能为空"
0040FB24   push    0040BFC0                          "未注册"
0040FDDB   push    eax                               以上得到Val=411120
0040FDEE   fadd    qword ptr [401238]                val+320968016
0040FE6B   je      short 0040FEA3                    关键跳转1
0040FE89   push    0040BDE8                          还需努力
0040FF3F   call    00413B10                          取注册表date=20060501数值的MD5值之MID(MD5(date),9,16=0x10)
004106F2   call    00413B10                          MD5
00410E18   push    0040BE10                          恭喜你
00410EE4   push    0040C1B8                          未注册

中间的针对用户名,信箱,假注册码进行的MD5等计算还没有时间看,稍不小心就容易引起浮点数溢出.等晚上有时间试试看.
2006-5-6 14:58
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
8
只是列出了几个字串的代码处,脱壳后,就算不解决自校检,用VB资源工具直接就可以查到,分析的不正确,还得努力....
2006-5-6 15:08
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
最初由 laomms 发布
这只是尾部处理的地方,分析的不正确....

具体算法在关键跳转之处,我只是标示了一下注释,好以后跟.~呵呵,回家打扫卫生呢,把没加壳的传上来.
2006-5-6 15:10
0
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
10
PESpin 的壳,没有一定的脱壳基础的人,是不可能脱掉的~
2006-5-6 15:22
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
11
假如认为壳有难度,我换个壳,ASPACK的。
2006-5-6 16:58
0
雪    币: 372
活跃值: (31)
能力值: ( LV12,RANK:410 )
在线值:
发帖
回帖
粉丝
12
运行提示:You do not have an appropriate license to use this functionality

点击确定,就关闭了...
2006-5-6 17:08
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
1、PESPIN脱壳,bp LoadLibraryA,F9运行,出现XXX错误,断在LoadLibraryA,取消断点,Alt+F9返回;
2、Ctrl+B,寻找二进制代码,8304240cc3e8,在C3(retn)上下硬件执行断点,F9
3、进行Stolen Code的修复即可。
4.去除自校验(文件名及文件大小校验);
0040EE04   .  52            push    edx
0040EE05   .  68 C4BD4000   push    0040BDC4                         ;  UNICODE "crackme3-lx"
0040EE0A   .  FF15 AC104000 call    [<&msvbvm60.__vbaStrCmp>]        ;  msvbvm60.__vbaStrCmp
0040EE10   .  8BF0          mov     esi, eax                         ;  文件名比较
0040EE12   .  8D4D C8       lea     ecx, [ebp-38]
0040EE15   .  F7DE          neg     esi
0040EE17   .  1BF6          sbb     esi, esi
0040EE19   .  F7DE          neg     esi
0040EE1B   .  F7DE          neg     esi
0040EE1D   .  FF15 DC114000 call    [<&msvbvm60.__vbaFreeStr>]       ;  msvbvm60.__vbaFreeStr
0040EE23   .  8D4D C0       lea     ecx, [ebp-40]
0040EE26   .  FF15 E0114000 call    [<&msvbvm60.__vbaFreeObj>]       ;  msvbvm60.__vbaFreeObj
0040EE2C   .  66:3BF7       cmp     si, di
0040EE2F      EB 06         jmp     short 0040EE37                   ;  改为JMP
0040EE31   .  FF15 24104000 call    [<&msvbvm60.__vbaEnd>]           ;  msvbvm60.__vbaEnd
0040EE37   >  68 70BD4000   push    0040BD70
0040EE3C   .  FF15 DC104000 call    [<&msvbvm60.__vbaNew>]           ;  msvbvm60.__vbaNew
....
0040EFAC   .  52            push    edx
0040EFAD   .  68 B8BE4000   push    0040BEB8                         ;  UNICODE "\crackme3-lx.exe"
0040EFB2   .  FF15 40104000 call    [<&msvbvm60.__vbaStrCat>]        ;  msvbvm60.__vbaStrCat
0040EFB8   .  8BD0          mov     edx, eax
0040EFBA   .  8D4D C4       lea     ecx, [ebp-3C]
0040EFBD   .  FF15 BC114000 call    [<&msvbvm60.__vbaStrMove>]       ;  msvbvm60.__vbaStrMove
0040EFC3   .  50            push    eax
0040EFC4   .  FF15 70114000 call    [<&msvbvm60.rtcFileLen>]         ;  msvbvm60.rtcFileLen
0040EFCA   .  8BF0          mov     esi, eax
0040EFCC   .  8D45 C4       lea     eax, [ebp-3C]
0040EFCF   .  8D4D C8       lea     ecx, [ebp-38]
0040EFD2   .  50            push    eax
0040EFD3   .  51            push    ecx
0040EFD4   .  6A 02         push    2
0040EFD6   .  FF15 58114000 call    [<&msvbvm60.__vbaFreeStrList>]   ;  msvbvm60.__vbaFreeStrList
0040EFDC   .  83C4 0C       add     esp, 0C
0040EFDF   .  8D4D C0       lea     ecx, [ebp-40]
0040EFE2   .  FFD3          call    ebx
0040EFE4   .  81FE 00E40000 cmp     esi, 0E400                       ;  文件大小比较
0040EFEA      EB 06         jmp     short 0040EFF2                   ;  改为jmp
0040EFEC   .  FF15 24104000 call    [<&msvbvm60.__vbaEnd>]           ;  msvbvm60.__vbaEnd
0040EFF2   >  C745 FC 00000>mov     dword ptr [ebp-4], 0
0040EFF9   .  68 3CF04000   push    0040F03C
0040EFFE   .  EB 1D         jmp     short 0040F01D
脱壳修复完成.
破解部分还在研究,今天喝了太多酒,呵呵,头疼,明天再看,睡觉了.
sn.key以及输入信息处理容易引起浮点数溢出导致VB运行错误,这个laomms是否可以改进?
2006-5-7 00:43
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
14
不错,比较简单的校检。弄好后请贴出胜利截图。
2006-5-7 08:50
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
算法过程研究:
Str1=0651184530274933032758648253457
Str2=crackmelxmadebylangxanginzhejiang
Str3=123456789ABCDEFabcdefghijklmnopq

1.根据文件所在硬盘卷标获得一组数字,此处为1152927745.D盘卷标:44B84801,HEXTODEC即可;
  Val1=1152927745+51184530(定值)=1204112275
2.取文件修改日期,作MD5运算;日期用FileDateTime获取,格式2006-5-7 0:38:16
3.Val2=MID(Val1,4,3) & MID(Val1,1,3)=411120
4.Val3=Val2+320968016(定值)=321379136,并与sn.key中值进行比较;
5.注册表date值=20060501取MID(MD5(20060501),9,16)=ffe55834a9ce70ab
6.Val4=机器码=1569364896,
  循环开始,i=1,Length(Val4)
  MID(Val4,i,1)
  MID(Val4,i,1)+1
  MID(Str1,(MID(Val4,i,1)+1),1)
  MID(Str2,(MID(Val4,i,1)+1),1)
  对应列表:
  1 5 6  9 3 6 4 8  9 6
  查Str计数器值等于MID结果+1,对应为:
  2 6 7 10 4 7 5 9 10 7
  在Str1中对应:
  6 8 4  0 1 4 1 3  0 4=6840141304
  在Str2中对应:
  r m e  m c e k x  m e=rmemcekxme
7.取信箱,这里是abc@123.com,j=1,length(mail),开始循环:
  MID(mail,J,1),取HEX值,对应为
  a  b  c  @  1  2  3  .  c  o  m
  61 62 63 49 31 32 33 2E 63 6F 6D
  ADD XOR结果,首次循环XOR结果为0,即首次循环ADD结果=信箱首字符HEX值
  3 xor ADD结果
  最终得到36C
8.Val5=机器码-123456(定值)=1569241440
  DECTOHEX(Val5)=5D88B960
  Not DECTOHEX(Val5)=A277469F
  Val51=(-Val5)-1=1569241441
  Val52=Val51/2=-784620720.49999994880
  Val52浮点数取整后保存得到D13BA350入eax
  D13BA350+75BCD15=D8977065
  将D8977065转换为整数得到Val53=-661163931
  MD5(Val53=-661163931)=1723f150e224878105c3bbdd9aa66d7d
9.Val6=(Val2=411120)+360741618(定值)=361152738
  Val7=((Str1查表结果=6840141304)+mail处理结果HEXTODEC(36C)=876)=6840142180
  Val8=Val7+(Val6=361152738)=7201294918
10.STR4=HEXTODEC(eax=0) & MID(Str2,(MID(Val4,i,1)+1),1)=0RMEMCEKXME
  MID(MID(MD5(20060501),9,16),9,4)=a9ce
  Left(Str4,0)=''
  Right(Str4,10)=RMEMCEKXME
  真密码=a9ce-RMEMCEKXME3f150
0016DA64  2D 52 00 4D 00 45 00 4D 00 43 00  - R.M.E.M.C.
0016DA74     45 00 4B 00 58 00 4D 00 45 00    E.K.X.M.E.
HEX:2D 52 4D 45 4D 43 45 4B 58 4D 45
    -   R  M  E  M  C  E  K  X  M  E
DEC:45 82 77 69 77 67 69 75 88 77 69 减去
    5  6  7  8  9  10 11 12 13 14 15
=   40 76 70 61 68 57 58 63 75 63 54
HEX:28 4C 46 3D 44 39 3A 3F 4B 3F 36
    即注册码第5-15位为(LF=D9:?K?6
注册码长度19位,-9后=循环计数10
注册码XXXX(LF=D9:?K?6XXXXX
修改了源程序的地方有:
00410866   xor     eax, eax                          为避免后面计算复杂将eax清零
00410868   nop                                       此处浮点数计算基本都溢出,故NOP掉
0041086A   nop                                       (初始 CPU 选择)
004108F5   push    0                                 为避免乱七八糟改为0
0041090B   push    0A                                为简单化改为0A,即取Str2查表结果

如果是爆破,是很简单的,直接修改如下地址:
00410DA5   je      00410EC8                          爆破点,不跳,跳酒OVER.

至于修改程序地方,只是为了方便计算,而且因为去掉浮点数溢出的CALL,会导致位数不一致,所以修改了三处地方,方便解码后位数一致.
分析有不对的地方,还请指教,呵呵.
上传的附件:
2006-5-7 22:41
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
16
最初由 inraining 发布
算法过程研究:
Str1=0651184530274933032758648253457
Str2=crackmelxmadebylangxanginzhejiang
Str3=123456789ABCDEFabcdefghijklmnopq

........


只能说基本上是分析对的,很不错了,还有,软件注明不要爆破,希望你能继续努力一下,找出注册码.
2006-5-8 07:33
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
我这个不是爆破,呵呵,爆破就没有注册码了。。。我去掉了程序浮点数溢出的CALL+两个push,注册码如何而来已经分析出来,以我的例子注册码就是:
XXXX(LF=D9:?K?6XXXXX,前四后五随便填写任何字符。
2006-5-8 07:51
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
18
另外,请教一下VbaErrVar这个函数的作用?去掉此函数,很多计算过的数据都可以不需要了。
2006-5-8 07:56
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
19
光是中间那段注册码长度就不对,你的推算过程中的最后一步有误.你再仔细看一下.
2006-5-8 08:17
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
20
是中间哪段?由于我更改了push,MID后的结果就变得简单了,我主要是不大清楚VbaErrVar这个CALL,还请指教,谢谢!
2006-5-8 09:04
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
21
这个参数我没有用过,可能是On Error Resume Next引起的,整个过程只用了一个浮点转换函数CDbl,跟机器码无关。
2006-5-8 09:17
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22
最初由 laomms 发布
这个参数我没有用过,可能是On Error Resume Next引起的

昨天在家搞得,今天在公司我有空再看一下,附件好像变成ASPACK得壳了。工作先~
2006-5-8 09:56
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
23
提个问题,有关于机器码得生成,
00411585   .  50            push    eax
00411586   .  C785 70FFFFFF>mov     dword ptr [ebp-90], 1321955
00411590   .  C785 68FFFFFF>mov     dword ptr [ebp-98], 3
0041159A   .  8B1F          mov     ebx, [edi]
0041159C   .  51            push    ecx
0041159D   .  FF15 8C114000 call    [<&MSVBVM60.__vbaVarAdd>]        ;  HEX(C盘序列号)+01321955=B1E2DB86
004115A3   .  8D55 9C       lea     edx, [ebp-64]
004115A6   .  50            push    eax
004115A7   .  52            push    edx
004115A8   .  FF15 20114000 call    [<&MSVBVM60.__vbaStrVarVal>]     ;  HEXTODEC=机器码

SATA硬盘计算出现负值,直接导致后面计算出错。
2006-5-8 11:09
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
24
下午我来贴个完整得算法吧,呵呵,这个crackme由于取硬盘序列号,浮点数运算容易出错,兼容性有些问题。
2006-5-8 12:02
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
25
用户定义的注释
地址       反汇编                                    注释
0040ED50   push    ebp                               自校验开始
0040EE29   call    [<&MSVBVM60.__vbaStrCmp>]         检查文件名是否一致
0040EE4E   jmp     short 0040EE56                    改为jmp
0040F0A4   cmp     esi, 0C062                        比较文件大小是否一致
0040F0AA   jmp     short 0040F0B2                    改为jmp
0040F140   push    ebp                               点击确定
0040F3CD   call    0040BF10                          获取D盘序列号
0040F3D8   mov     ecx, [ebp-310]                    D盘序列号HEX:1811A538入ecx
0040F467   call    [<&MSVBVM60.__vbaStrVarVal>]      序列号HEXTODEC(1811A538)=403809592
0040F474   fadd    qword ptr [401240]                Val1=403809592+51184530(常数)=454994122
0040F484   call    [<&MSVBVM60.__vbaFpI4>]           DECTOHEX(Val1)=1B1EA8CA入eax
0040F52B   call    [<&MSVBVM60.#577>]                获取文件修改日期FileDateTime=2006-5-8 9:37:30
0040F591   call    00413BF0                          MD5(2006-5-8 9:37:30)=C84E9EBB7567AD2FB05387BFDF25F565
0040F5C0   mov     dword ptr [ebp-2C0], 0040BFF0     Str1=0651184530274933032758648253457
0040F5E2   mov     dword ptr [ebp-2C0], 0040C034     Str2=crackmelxmadebylangxanginzhejiang
0040F604   mov     dword ptr [ebp-2C0], 0040C07C     Str3=123456789ABCDEFabcdefghijklmnopq
0040F65E   mov     edx, [ebp-200]                    用户名入edx
0040F66A   call    [<&MSVBVM60.__vbaStrCmp>]         检测用户名是否为空
0040F6D3   mov     dword ptr [ebp-2D0], 0040C0F0     "友情提示"
0040F6F1   mov     dword ptr [ebp-2C0], 0040C0DC     "请输入用户名!"
0040F797   mov     eax, [ebp-200]                    信箱入eax
0040F7A3   call    [<&MSVBVM60.__vbaStrCmp>]         检查信箱是否为空
0040F80C   mov     dword ptr [ebp-2D0], 0040C118     "注意"
0040F82A   mov     dword ptr [ebp-2C0], 0040C100     "邮箱号不能为空!"
0040F8DA   mov     edx, [ebp-200]                    信箱入edx
0040F8EB   call    [eax+6F8]                         检查信箱是否符合规范
0040F977   mov     dword ptr [ebp-2C0], 0040C124     请检查EMAIL格式
0040F9ED   mov     ecx, [ebp-200]                    注册码入ecx
0040F9F9   call    [<&MSVBVM60.__vbaStrCmp>]         检查注册码是否为空
0040FA63   mov     dword ptr [ebp-2C0], 0040C140     "注册码不能为空"
0040FBAB   call    [<&MSVBVM60.__vbaVarTstEq>]       判断sn.key是否存在
0040FC04   push    0040C180                          "未注册"
0040FD01   call    [<&MSVBVM60.__vbaVarTstEq>]       判断sn.key是否存在
0040FE54   call    edi                               MID(Val1,4,3)=994
0040FE90   call    edi                               MID(Val1,3,3)=454
0040FEA7   call    [<&MSVBVM60.__vbaVarCat>]         Val2=MID(Val1,4,3) & MID(Val1,1,3)=994454
0040FEBB   push    eax                               Cat结果994454入栈
0040FEBC   call    [<&MSVBVM60.#581>]                994454取整数赋值得到Val2=994454
0040FECE   fadd    qword ptr [401238]                Val3=Val2+320968016(定值)=321962470=SN.KEY中的值
0040FF42   call    [<&MSVBVM60.__vbaVarTstNe>]       Val3与sn.key中的值进行比较
0040FFE3   call    [<&MSVBVM60.__vbaVarLateMemCallL  读取注册表键值=20060501
0041001F   call    00413BF0                          MID(MD5(20060501),9,16)=ffe55834a9ce70ab
004100A6   push    edx                               Val4=机器码入栈=638581041
00410118   cmp     [ebp-3A0], esi                    循环开始,i=1,Length(Val4)
004101BE   call    edi                               MID(Val4,i,1)
004101F9   call    [<&MSVBVM60.__vbaVarAdd>]         MID(Val4,i,1)+1
00410215   call    edi                               MID(Str1,(MID(Val4,i,1)+1),1)
0041031B   call    edi                               MID(Val4,i,1)
00410356   call    [<&MSVBVM60.__vbaVarAdd>]         MID(Val4,i,1)+1
00410372   call    edi                               MID(Str2,(MID(Val4,i,1)+1),1)
00410382   call    [<&MSVBVM60.#528>]                UpperCase Mid结果
00410417   jmp     00410118                          循环结束
00410480   push    edx                               信箱入栈
00410481   call    [<&MSVBVM60.__vbaLenBstr>]        取信箱长度
004104F2   mov     eax, [ebp-3AC]                    循环开始,j=1,length(mail)
0041059A   call    edi                               MID(mail,j,1)
004105B7   mov     [ebp-2D0], ax                     ax=HEX(MID(mail,j,1)
004105E9   call    [<&MSVBVM60.__vbaVarAdd>]         XOR结果+HEX值,首次Xor结果=0
004105FE   call    [<&MSVBVM60.__vbaVarXor>]         3 XOR ADD结果入ecx
00410604   mov     edx, eax                          循环结束后得到最终XOR结果=36C
0041066F   jmp     004104F2                          循环结束后得到最终XOR结果=36C
004106CC   fsub    qword ptr [401230]                Val5=机器码-123456(定值)=638457585
004106DC   call    [<&MSVBVM60.__vbaFpI4>]           DECTOHEX(Val5)=260E16F1入eax
004106E2   not     eax                               取反=D9F1E90E
0041072C   call    [<&MSVBVM60.__vbaStrVarVal>]      Val51=(-Val5)-1=-638457586
00410742   fdiv    qword ptr [401228]                Val52=-638457586/2=-319228793
00410765   call    [<&MSVBVM60.__vbaFpI4>]           Val52浮点数取整后保存得到ECF8F487入eax
0041076B   add     eax, 75BCD15                      ECF8F487+75BCD15=F454C19C
00410777   call    [<&MSVBVM60.__vbaStrI4>]          将F454C19C转换为整数得到Val53=-195772004
004107D2   call    00413BF0                          MD5(Val53=-195772004)=12C4F04933B7D99A70BA16FEF57CBA9C
0041082F   call    edi                               MID(Val1,4,3)=994
0041086B   call    edi                               MID(Val1,1,3)=454
00410882   call    [<&MSVBVM60.__vbaVarCat>]         Val2=MID(Val1,4,3) & MID(Val1,1,3)=994454
004108CB   push    eax                               994454入栈
004108DE   fadd    qword ptr [401220]                Val6=994454+360741618(定值)=361736072
0041092E   call    [<&MSVBVM60.__vbaVarAdd>]         Val7=((Str1查表结果=413836016)+mail处理结果HEXTODEC(36C)=876)=413836892
00410940   call    [<&MSVBVM60.__vbaVarAdd>]         Val8=(Val7=413836892)+(Val6=361736072)=775572964
00410947   call    [<&MSVBVM60.__vbaI4ErrVar>]       DECTOHEX(Val8)=2E3A4DE4入eax
00410972   call    [<&MSVBVM60.__vbaVarCat>]         STR4=Val8 & MID(Str2,(MID(Val4,i,1)+1),1)=775572964ECXMXRCKR
004109CD   call    edi                               MID(MID(MD5(20060501),9,16),9,4)=a9ce
004109DF   call    [<&MSVBVM60.#617>]                Left(Str4,5)=77557
00410A09   call    [<&MSVBVM60.#619>]                Right(Str4,13)=2964ECXMXRCKR
00410A36   call    edi                               MID(MD5(Val53=-195772004),4,5)=4f049
00410A92   mov     edx, eax                          以上4个CAT将字符串连接起来,得到真码m1=a9ce77557-2964ECXMXRCKR4f049
00410B4E   push    edx                               假注册码入栈
00410B4F   call    [<&MSVBVM60.__vbaLenBstr>]        取注册码长度
00410B55   sub     eax, 9                            长度-9,作为循环记数器
00410BCC   cmp     [ebp-3B4], esi                    循环开始
00410C7E   call    [<&MSVBVM60.__vbaVarAdd>]         j+4,j=1,(length(注册码)-9)
00410C9A   call    edi                               MID(注册码,(j+4),1),j=1,(length(注册码)-9)
00410CAA   call    [<&MSVBVM60.__vbaStrVarVal>]      取MID结果HEX入[eax]
00410CE9   call    [<&MSVBVM60.__vbaVarAdd>]         HEX+j
00410CFE   call    [<&MSVBVM60.__vbaVarAdd>]         HEX+j+4
00410D2E   call    [<&MSVBVM60.__vbaVarCat>]         字符串连接
00410DB7   jmp     00410BCC                          循环结束,得到m2
00410DE3   call    edi                               MID(MID(MD5(20060501),9,16),9,4)=a9ce
00410E0C   call    edi                               MID(MD5(Val53=-195772004),4,5)=4F049
00410E0E   mov     edi, [<&MSVBVM60.__vbaVarCat>]    字符串连接
00410E30   call    edi                               字符串连接
00410E32   push    eax                               最终得到字符串
00410E44   call    [<&MSVBVM60.__vbaVarTstEq>]       真假码比较
00410E85   je      00410FA8                          爆破点
00410ECC   mov     eax, [edi]                        (初始 CPU 选择)
00410EF8   push    0040C1A4                          "恭喜你"
00410F15   push    0040C1B4                          ","
00410F2F   push    0040C1BC                          "你太厉害了!"
00410FC4   push    0040C1D0                          "未注册"
004114E5   call    0040BF10                          获取C盘序列号GetVolumeInformationA
004114F0   mov     eax, [ebp-AC]                     C盘序列号=24DDDFDC入eax
0041159D   call    [<&MSVBVM60.__vbaVarAdd>]         HEX(C盘序列号24DDDFDC)+01321955=260FF931
004115A8   call    [<&MSVBVM60.__vbaStrVarVal>]      HEXTODEC(260FF931)=机器码=638581041

综合:
如果是爆破,是很简单的,直接修改如下地址:
00410DA5   je      00410EC8                          爆破点,不跳,跳就OVER.
算法过程研究:
Str1=0651184530274933032758648253457
Str2=crackmelxmadebylangxanginzhejiang
Str3=123456789ABCDEFabcdefghijklmnopq

1.根据D盘序列号1811A538获得一组数字,此处为403809592,D盘序列号:1811A538,HEXTODEC即可;
  Val1=403809592+51184530(定值)=454994122
2.取文件修改日期,作MD5运算;日期用FileDateTime获取,格式2006-5-8 9:37:30
  MD5(2006-5-8 9:37:30)=C84E9EBB7567AD2FB05387BFDF25F565
3.Val2=MID(Val1,4,3) & MID(Val1,1,3)=994454
4.Val3=Val2+320968016(定值)=321962470,并与sn.key中值进行比较,故创建sn.key,记事本编辑,写入321962470,保存;
5.注册表date值=20060501取MID(MD5(20060501),9,16)=ffe55834a9ce70ab
6.Val4=机器码=638581041,
  循环开始,i=1,Length(Val4)
  MID(Val4,i,1)
  MID(Val4,i,1)+1
  MID(Str1,(MID(Val4,i,1)+1),1)
  MID(Str2,(MID(Val4,i,1)+1),1)
  对应列表:
  6 3 8 5 8 1 0 4 1
  查Str计数器值等于MID结果+1,对应为:
  7 4 9 6 9 2 1 5 2
  在Str1中对应:
  4 1 3 8 3 6 0 1 6=413836016
  在Str2中对应:
  E C X M X R C K R=ECXMXRCKR
7.取信箱,这里是abc@123.com,j=1,length(mail),开始循环:
  MID(mail,J,1),取HEX值,对应为
  a  b  c  @  1  2  3  .  c  o  m
  61 62 63 49 31 32 33 2E 63 6F 6D
  ADD XOR结果,首次循环XOR结果为0,即首次循环ADD结果=信箱首字符HEX值
  3 xor ADD结果
  最终得到36C
8.Val5=机器码-123456(定值)=638457585
  DECTOHEX(Val5)=260E16F1
  取反DECTOHEX(Val5)=D9F1E90E
  Val51=(-Val5)-1=-638457586
  Val52=-638457586/2=-319228793
  Val52浮点数取整后保存得到ECF8F487入eax
  ECF8F487+75BCD15=F454C19C
  将F454C19C转换为整数得到Val53=-195772004
  MD5(Val53=-195772004)=12C4F04933B7D99A70BA16FEF57CBA9C
9.Val6=(Val2=994454)+360741618(定值)=361736072
  Val7=((Str1查表结果=413836016)+mail处理结果HEXTODEC(36C)=876)=413836892
  Val8=(Val7=413836892)+(Val6=361736072)=775572964
  DECTOHEX(Val8)=2E3A4DE4入eax
10.STR4=Val8 & MID(Str2,(MID(Val4,i,1)+1),1)=775572964ECXMXRCKR
  MID(MID(MD5(20060501),9,16),9,4)=a9ce
  Left(Str4,5)=77557
  Right(Str4,13)=2964ECXMXRCKR
  MID(MD5(Val53=-195772004),4,5)=4f049
  得到真码=a9ce77557-2964ECXMXRCKR4f049
  假定77557-2964ECXMXRCKR
11.MID(注册码,(j+4),1),j=1,(length(注册码)-9)
  HEX(MID)+j+4
  循环之后得到解密码m2,
要使得00410E44   call    [<&MSVBVM60.__vbaVarTstEq>]       真假码比较返回TRUE,
则必须m1=m2,逆推过程如下:
     7  7  5  5  7  -  2  9  6  4  E  C  X  M  X  R  C  K  R
HEX:37 37 35 35 37 2D 32 39 36 34 45 43 58 4D 58 52 43 4B 52
   
DEC:55 55 53 53 55 45 50 57 54 52 69 67 88 77 88 82 67 75 82 减去
    5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23
=   50 49 46 45 46 35 39 45 41 38 54 51 71 59 69 62 46 53 59
HEX:32 31 2E 2D 2E 23 27 2D 29 26 36 33 47 3B 45 3E 2E 35 3B
    即注册码第5-23位为21.-.#'-)&63G;E>.5;

注册码长度28位,-9后=循环计数19
注册码XXXX21.-.#'-)&63G;E>.5;XXXXX
前4位,后5位,随便填,不参与注册码运算.
2006-5-8 14:56
0
游客
登录 | 注册 方可回帖
返回
//