jasonliyi 发表于 2006-9-15 14:27:18

哇。我师傅的是老大。东西。一定要看看。呵呵

傲月游居 发表于 2006-9-23 16:34:54

 晕,逐位用户名ASCII码相加即是注册码~~老大,学习了~

kine36
528

qxtianlong 发表于 2006-9-26 22:20:28

好久没来了,看看

qxtianlong 发表于 2006-9-27 23:18:25

追码很容易,因为是明码,算法也很简单,貌似我以前做过类似的...
很久么写破文都不会写了....
玩了一会就出来了...


qxtianlong
1093

载入OD,隐藏OD
设断点bp __vbaLenBstr、__vbaStrCmp、rtcMsgBox
F9运行,输入qxtianlong,78787878后中断在

733B49CE MS>8B4424 04         mov eax,dword ptr ss:

下方提示信息为

堆栈 ss:=00150C84, (UNICODE "qxtianlong")
eax=00150C84, (UNICODE "qxtianlong")

然后F8继续跟进,注意这里

733B49D6      8B40 FC         mov eax,dword ptr ds:
733B49D9      D1E8            shr eax,1

他的功能是计算qxtianlong的长度(A)也就是10

F8继续跟进到这里

004045F5      83F8 05         cmp eax,5
004045F8   /0F8D 85000000   jge crackme1.00404683

他的功能估计是看输入的为数是否大于5,大于就继续..(跳到00404683)否则-_-!

00404683      8B45 E4         mov eax,dword ptr ss:
00404686      50                push eax

在00404583看到ebp=0012F468、=0012F4FC中数值为00150C84
可以看到和前面的一样,也就是存放qxtianlong的地址
push eax把00150C84压入堆栈0012F384

继续在这里看到

00404687      FFD6            call esi                                       ; MSVBVM60.__vbaLenBstr

这里应该也是计算字符串长度的..

00404689      8BC8            mov ecx,eax

把EAX中的值送到ECX中(ECX=A)

0040468B      FF15 50104000   call dword ptr ds:[<&MSVBVM60.__vbaI2I4>]      ; MSVBVM60.__vbaI2I4
00404691      8B1D 14104000   mov ebx,dword ptr ds:[<&MSVBVM60.__vbaFreeVarLis>; MSVBVM60.__vbaFreeVarList

这里估计就该那用户名做手脚了,跟进CALL看看,free根据字眼来看应该是释放东西用的...

跟进后到

733B49DE MS>56                push esi
733B49DF      8BF1            mov esi,ecx
733B49E1      0FBFC6            movsx eax,si
733B49E4      3BC6            cmp eax,esi
733B49E6      0F85 3D1F0200   jnz MSVBVM60.733D6929
733B49EC      66:8BC6         mov ax,si
733B49EF      5E                pop esi
733B49F0      C3                retn

push esi 函数地址压栈
0012F380   733B49CE      MSVBVM60.__vbaLenBstr
mov esi,ecx
是把ECX中的值送到ESI(A)也就是10
movsx eax,si
cmp eax,esi
比较eax,esi,不等则跳..
mov ax,si
pop esi从堆栈弹出函数地址到ESI

返回后把ds:=73491073 (MSVBVM60.__vbaFreeVarList)送到ebx(ebx=73491073)

00404697      8985 3CFFFFFF   mov dword ptr ss:,eax
eax中的值放到ebp-c4(12f3c4)值为(A)
0040469D      BE 01000000       mov esi,1
004046A2      66:3BB5 3CFFFFFFcmp si,word ptr ss:
si和ebp-c4比较
004046A9   /0F8F 82000000   jg crackme1.00404731
大于就跳
004046AF      8D4D E4         lea ecx,dword ptr ss:
004046B2      8D55 C0         lea edx,dword ptr ss:
ecx=0012f44c edx=0012f428
004046B5      0FBFC6            movsx eax,si
eax=1
004046B8      894D 88         mov dword ptr ss:,ecx
ecx送到ebp-78
0012F3F00012F44C

004046BB      52                push edx
004046BC      8D4D 80         lea ecx,dword ptr ss:
ecx=0012f3e8
004046BF      50                push eax
004046C0      8D55 B0         lea edx,dword ptr ss:
edx=0012f418
004046C3      51                push ecx
004046C4      52                push edx

004046C5      C745 C8 04000280mov dword ptr ss:,80020004
004046CC      C745 C0 0A000000mov dword ptr ss:,0A
004046D3      C745 80 08400000mov dword ptr ss:,4008

ebp-380012F43080020004
ebp-400012F4280000000A
ebp-800012F3E800004008

004046DA      FF15 40104000   call dword ptr ds:[<&MSVBVM60.#632>]             ; MSVBVM60.rtcMidCharVar

跟进

7347B403 MS>55                push ebp
7347B404      8BEC            mov ebp,esp
7347B406      83EC 10         sub esp,10
7347B409      56                push esi    1
7347B40A      57                push edi    0
7347B40B      FF35 C00E4A73   push dword ptr ds:    10
7347B411      FF15 B8103973   call dword ptr ds:[<&KERNEL32.TlsGetValue>]      ; kernel32.TlsGetValue
7347B417      8D70 50         lea esi,dword ptr ds:
7347B41A      56                push esi
7347B41B      FF75 0C         push dword ptr ss:
7347B41E      E8 5096F3FF       call MSVBVM60.733B4A73
7347B423      83F8 FF         cmp eax,-1
7347B426      74 3A             je short MSVBVM60.7347B462
7347B428      FF75 14         push dword ptr ss:
7347B42B      FF75 10         push dword ptr ss:
7347B42E      50                push eax
7347B42F      E8 AB94F3FF       call MSVBVM60.rtcMidCharBstr

...................................
...................................
...................................
...................................

004046E8      FF15 74104000   call dword ptr ds:[<&MSVBVM60.__vbaStrVarVal>]   ; MSVBVM60.__vbaStrVarVal
004046EE      50                push eax
004046EF      FF15 0C104000   call dword ptr ds:[<&MSVBVM60.#693>]             ; MSVBVM60.rtcByteValueBstr
取第一个字母的ASC码值71
004046F5      25 FF000000       and eax,0FF
004046FA      8D4D D8         lea ecx,dword ptr ss:
004046FD      03C7            add eax,edi
004046FF   /0F80 04020000   jo crackme1.00404909
00404705      8BF8            mov edi,eax
edi=71
00404707      FF15 B8104000   call dword ptr ds:[<&MSVBVM60.__vbaFreeStr>]   ; MSVBVM60.__vbaFreeStr
...............
...............
...............
00404719      B8 01000000       mov eax,1
0040471E      83C4 0C         add esp,0C
00404721      66:03C6         add ax,si
SI作为计数器
..........................
..........................
..........................

以下这段是循环以上功能

004046A2      66:3BB5 3CFFFFFFcmp si,word ptr ss:
004046A9      0F8F 82000000   jg crackme1.00404731
004046AF      8D4D E4         lea ecx,dword ptr ss:
004046B2      8D55 C0         lea edx,dword ptr ss:
004046B5      0FBFC6            movsx eax,si
004046B8      894D 88         mov dword ptr ss:,ecx
004046BB      52                push edx
004046BC      8D4D 80         lea ecx,dword ptr ss:
004046BF      50                push eax
004046C0      8D55 B0         lea edx,dword ptr ss:
004046C3      51                push ecx
004046C4      52                push edx
004046C5      C745 C8 04000280mov dword ptr ss:,80020004
004046CC      C745 C0 0A000000mov dword ptr ss:,0A
004046D3      C745 80 08400000mov dword ptr ss:,4008
004046DA      FF15 40104000   call dword ptr ds:[<&MSVBVM60.#632>]             ; MSVBVM60.rtcMidCharVar
004046E0      8D45 B0         lea eax,dword ptr ss:
004046E3      8D4D D8         lea ecx,dword ptr ss:
004046E6      50                push eax
004046E7      51                push ecx
004046E8      FF15 74104000   call dword ptr ds:[<&MSVBVM60.__vbaStrVarVal>]   ; MSVBVM60.__vbaStrVarVal
004046EE      50                push eax
004046EF      FF15 0C104000   call dword ptr ds:[<&MSVBVM60.#693>]             ; MSVBVM60.rtcByteValueBstr
004046F5      25 FF000000       and eax,0FF
004046FA      8D4D D8         lea ecx,dword ptr ss:
004046FD      03C7            add eax,edi
004046FF      0F80 04020000   jo crackme1.00404909
00404705      8BF8            mov edi,eax
00404707      FF15 B8104000   call dword ptr ds:[<&MSVBVM60.__vbaFreeStr>]   ; MSVBVM60.__vbaFreeStr
0040470D      8D55 B0         lea edx,dword ptr ss:
00404710      8D45 C0         lea eax,dword ptr ss:
00404713      52                push edx
00404714      50                push eax
00404715      6A 02             push 2
00404717      FFD3            call ebx
00404719      B8 01000000       mov eax,1
0040471E      83C4 0C         add esp,0C
00404721      66:03C6         add ax,si
00404724      0F80 DF010000   jo crackme1.00404909
0040472A      8BF0            mov esi,eax
0040472C    ^ E9 71FFFFFF       jmp crackme1.004046A2

当条件成立时,调到

00404731      8B45 08         mov eax,dword ptr ss:

此时EDI为445

00404768      50                push eax
00404769      FF15 24104000   call dword ptr ds:[<&MSVBVM60.__vbaHresultCheckO>; MSVBVM60.__vbaHresultCheckObj
0040476F      57                push edi
00404770      FF15 08104000   call dword ptr ds:[<&MSVBVM60.__vbaStrI4>]       ; MSVBVM60.__vbaStrI4
这里注意一下
00404776      8BD0            mov edx,eax

在00404770时已经可以看到注册码了

00404776      8BD0            mov edx,eax
00404778      8D4D D4         lea ecx,dword ptr ss:
0040477B      FF15 A4104000   call dword ptr ds:[<&MSVBVM60.__vbaStrMove>]   ; MSVBVM60.__vbaStrMove
00404781      8B55 D8         mov edx,dword ptr ss:
00404784      50                push eax    正确注册码
00404785      52                push edx    试练码
00404786      FF15 4C104000   call dword ptr ds:[<&MSVBVM60.__vbaStrCmp>]      ; MSVBVM60.__vbaStrCmp
比较

                                                                                          完结于2006/09/27

lgjxj 发表于 2006-9-27 23:46:47

楼上的,有那么长吗,程序是把你输入的用户名累加为结果 ,看下面代码

004046EF    FF15 0C104000   CALL DWORD PTR DS:[<&MSVBVM60.#693>]       ; 这个 CALL 每次抽取用户名字符送入 EAX
004046F5    25 FF000000   AND EAX,0FF
004046FA    8D4D D8         LEA ECX,DWORD PTR SS:
004046FD    03C7            ADD EAX,EDI                              ; 累加

qxtianlong 发表于 2006-9-28 08:30:32

呵呵,楼上的,你那个只是用户名的16进制相加后的数,如果你向后追,虽然也能直接看到10进制的值,但是具体怎么换算的,你就没有追了,如果你追一下,会发现很有意思的....
我只是看了看他是如何换算成10进制的而已...;)

jinbbs 发表于 2006-10-4 22:01:02

学习一下,谢谢

gfclq 发表于 2006-10-7 07:35:53

呵呵,正好俺是初学者,谢谢坛主啊!

yosen2001 发表于 2006-10-7 19:57:52

老办法破的,算法不太懂,呵呵

正在堕落 发表于 2006-10-25 22:34:09

我只会爆,哎!


明码比较也能跟出来:
iceknife         830




可惜不会分析!哪个老大来点容易懂的教程!

[ 本帖最后由 正在堕落 于 2006-10-25 22:37 编辑 ]
页: 1 2 3 [4] 5 6
查看完整版本: [推荐]今天写的一个CrackMe,很适合初学者!