吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6000|回复: 0
收起左侧

[分享] 赚取权限第二贴之某打字练习软件的注册算法分析笔记

[复制链接]
datochan 发表于 2009-2-12 23:13
帖第二篇了,看现在的破解业界,几乎人人都是高手,正如MJ说的,一个技术,专门研究一个月就是牛人了,我等菜菜,真的不知道我的这个破文拿出来是不是会被笑话~
为了摆脱新人的现状,我豁出去了,希望各位大大不要笑话我~~~
上次帖的是JAVA的,这次来个VB的吧~~~,这个是我第一次分析VB时的文章,当时费了好大的劲,但是收获不小,希望各位分析过VB程序的大大指点,没有分析过VB的朋友借鉴……
正文如下:
【文章标题】: 某打字练习软件的注册算法分析笔记
【软件介绍】: 用来练习打字的软件!
【作者声明】:
    从来没有想过我能有能力用OD来分析某个软件的算法,因为我以前基本上都是爆破,或者用OD跟出注册码。  在听了很多人对我的鼓励之后,我决定:选一个比较容易的软柿子来捏一下,自己分析一下算法,当作是对自己的锻炼吧!由于是第一次分析,错误之处再所难免,望各位大虾指教!!!
--------------------------------------------------------------------------------
【详细过程】:
  脱壳不说了,至于找关键跳的方法,我忘记哪个“老大”教导我们说的:“VB程序找比较函数”,所以在_vbaStrCmp函数上下断点,应该是可以断到关键比较上的!


代码:
005C9A38   .  FF15 8C124000 call    dword ptr [<&msvbvm60.__vbaStrCo>;  msvbvm60.__vbaStrCopy
005C9A3E   .  83EC 10       sub     esp, 10
005C9A41   .  B9 08000000   mov     ecx, 8
005C9A46   .  8BD4          mov     edx, esp
005C9A48   .  898D 50FFFFFF mov     dword ptr [ebp-B0], ecx
005C9A4E   .  8B1D C8124000 mov     ebx, dword ptr [<&msvbvm60.rtcGe>;  msvbvm60.rtcGetSetting
005C9A54   .  B8 D0EA4100   mov     eax, 0041EAD0                    ;  UNICODE "dlei"
005C9A59   .  890A          mov     dword ptr [edx], ecx
005C9A5B   .  8B8D 54FFFFFF mov     ecx, dword ptr [ebp-AC]
005C9A61   .  8985 58FFFFFF mov     dword ptr [ebp-A8], eax
005C9A67   .  68 C0EA4100   push    0041EAC0                         ; /szKey = "Name"
005C9A6C   .  894A 04       mov     dword ptr [edx+4], ecx           ; |
005C9A6F   .  68 B0EA4100   push    0041EAB0                         ; |Section = "login"
005C9A74   .  68 A0EA4100   push    0041EAA0                         ; |AppName = "运?,B8,"如",B7,"?"
005C9A79   .  8942 08       mov     dword ptr [edx+8], eax           ; |
005C9A7C   .  8B85 5CFFFFFF mov     eax, dword ptr [ebp-A4]          ; |
005C9A82   .  8942 0C       mov     dword ptr [edx+C], eax           ; |
005C9A85   .  FFD3          call    ebx                              ; \rtcGetSetting
005C9A87   .  8B3D 24134000 mov     edi, dword ptr [<&msvbvm60.__vba>;  得到了用户名
005C9A8D   .  8BD0          mov     edx, eax
005C9A8F   .  8D4D D4       lea     ecx, dword ptr [ebp-2C]
005C9A92   .  FFD7          call    edi                              ;  <&msvbvm60.__vbaStrMove>
005C9A94   .  8D4D D4       lea     ecx, dword ptr [ebp-2C]
005C9A97   .  8D55 D8       lea     edx, dword ptr [ebp-28]
005C9A9A   .  51            push    ecx
005C9A9B   .  52            push    edx
005C9A9C   .  E8 2F900200   call    005F2AD0                         ;  这里得到了真码~`
005C9AA1   .  8BD0          mov     edx, eax
005C9AA3   .  8D4D E4       lea     ecx, dword ptr [ebp-1C]
005C9AA6   .  FFD7          call    edi
005C9AA8   .  8D4D D4       lea     ecx, dword ptr [ebp-2C]
005C9AAB   .  FF15 64134000 call    dword ptr [<&msvbvm60.__vbaFreeS>;  msvbvm60.__vbaFreeStr
005C9AB1   .  83EC 10       sub     esp, 10
005C9AB4   .  B9 08000000   mov     ecx, 8
005C9AB9   .  8BD4          mov     edx, esp
005C9ABB   .  898D 50FFFFFF mov     dword ptr [ebp-B0], ecx
005C9AC1   .  B8 ECEA4100   mov     eax, 0041EAEC                    ;  UNICODE "1a2b3c"
005C9AC6   .  68 E0EA4100   push    0041EAE0                         ;  UNICODE "id"
005C9ACB   .  890A          mov     dword ptr [edx], ecx
005C9ACD   .  8B8D 54FFFFFF mov     ecx, dword ptr [ebp-AC]
005C9AD3   .  8985 58FFFFFF mov     dword ptr [ebp-A8], eax
005C9AD9   .  68 B0EA4100   push    0041EAB0                         ;  UNICODE "login"
005C9ADE   .  894A 04       mov     dword ptr [edx+4], ecx
005C9AE1   .  68 A0EA4100   push    0041EAA0
005C9AE6   .  8942 08       mov     dword ptr [edx+8], eax
005C9AE9   .  8B85 5CFFFFFF mov     eax, dword ptr [ebp-A4]
005C9AEF   .  8942 0C       mov     dword ptr [edx+C], eax
005C9AF2   .  FFD3          call    ebx                              ;  得到了我们输入的注册码,我们F7跟进去!~
005C9AF4   .  8BD0          mov     edx, eax
005C9AF6   .  8D4D E0       lea     ecx, dword ptr [ebp-20]
005C9AF9   .  FFD7          call    edi
005C9AFB   .  8B4D E0       mov     ecx, dword ptr [ebp-20]
005C9AFE   .  51            push    ecx                              ; /String
005C9AFF   .  FF15 30104000 call    dword ptr [<&msvbvm60.__vbaLenBs>; \__vbaLenBstr
005C9B05   .  8BC8          mov     ecx, eax
005C9B07   .  FF15 80114000 call    dword ptr [<&msvbvm60.__vbaI2I4>>;  msvbvm60.__vbaI2I4
005C9B0D   .  8B1D 40114000 mov     ebx, dword ptr [<&msvbvm60.rtcMi>;  msvbvm60.rtcMidCharVar
005C9B13   .  8985 F0FEFFFF mov     dword ptr [ebp-110], eax
005C9B19   .  B8 01000000   mov     eax, 1
005C9B1E   .  8945 E8       mov     dword ptr [ebp-18], eax
005C9B21   >  66:3B85 F0FEF>cmp     ax, word ptr [ebp-110]           ;  这个循环在处理我们输入的注册码
005C9B28   .  0F8F A0010000 jg      005C9CCE
005C9B2E   .  0FBFF8        movsx   edi, ax
005C9B31   .  8D55 E0       lea     edx, dword ptr [ebp-20]
005C9B34   .  8D45 C0       lea     eax, dword ptr [ebp-40]
005C9B37   .  8995 58FFFFFF mov     dword ptr [ebp-A8], edx
005C9B3D   .  50            push    eax
005C9B3E   .  8D8D 50FFFFFF lea     ecx, dword ptr [ebp-B0]
005C9B44   .  57            push    edi
005C9B45   .  8D55 B0       lea     edx, dword ptr [ebp-50]
005C9B48   .  51            push    ecx
005C9B49   .  52            push    edx
005C9B4A   .  C745 C8 01000>mov     dword ptr [ebp-38], 1
005C9B51   .  C745 C0 02000>mov     dword ptr [ebp-40], 2
005C9B58   .  C785 50FFFFFF>mov     dword ptr [ebp-B0], 4008
005C9B62   .  FFD3          call    ebx
005C9B64   .  8D45 E0       lea     eax, dword ptr [ebp-20]
005C9B67   .  8D4D 90       lea     ecx, dword ptr [ebp-70]
005C9B6A   .  8985 28FFFFFF mov     dword ptr [ebp-D8], eax
005C9B70   .  51            push    ecx
005C9B71   .  8D95 20FFFFFF lea     edx, dword ptr [ebp-E0]
005C9B77   .  57            push    edi
005C9B78   .  8D45 80       lea     eax, dword ptr [ebp-80]
005C9B7B   .  52            push    edx
005C9B7C   .  50            push    eax
005C9B7D   .  89B5 38FFFFFF mov     dword ptr [ebp-C8], esi
005C9B83   .  C785 30FFFFFF>mov     dword ptr [ebp-D0], 8002
005C9B8D   .  C745 98 01000>mov     dword ptr [ebp-68], 1
005C9B94   .  C745 90 02000>mov     dword ptr [ebp-70], 2
005C9B9B   .  C785 20FFFFFF>mov     dword ptr [ebp-E0], 4008
005C9BA5   .  FFD3          call    ebx
005C9BA7   .  8D4D B0       lea     ecx, dword ptr [ebp-50]
005C9BAA   .  8D95 30FFFFFF lea     edx, dword ptr [ebp-D0]
005C9BB0   .  51            push    ecx
005C9BB1   .  8D45 A0       lea     eax, dword ptr [ebp-60]
005C9BB4   .  52            push    edx
005C9BB5   .  50            push    eax
005C9BB6   .  C785 08FFFFFF>mov     dword ptr [ebp-F8], 9
005C9BC0   .  C785 00FFFFFF>mov     dword ptr [ebp-100], 8002
005C9BCA   .  FF15 48114000 call    dword ptr [<&msvbvm60.__vbaVarCm>;  msvbvm60.__vbaVarCmpGt
005C9BD0   .  8D4D 80       lea     ecx, dword ptr [ebp-80]
005C9BD3   .  50            push    eax
005C9BD4   .  8D95 00FFFFFF lea     edx, dword ptr [ebp-100]
005C9BDA   .  51            push    ecx
005C9BDB   .  8D85 70FFFFFF lea     eax, dword ptr [ebp-90]
005C9BE1   .  52            push    edx
005C9BE2   .  50            push    eax
005C9BE3   .  FF15 9C124000 call    dword ptr [<&msvbvm60.__vbaVarCm>;  msvbvm60.__vbaVarCmpLt
005C9BE9   .  8D8D 60FFFFFF lea     ecx, dword ptr [ebp-A0]
005C9BEF   .  50            push    eax
005C9BF0   .  51            push    ecx
005C9BF1   .  FF15 CC114000 call    dword ptr [<&msvbvm60.__vbaVarAn>;  msvbvm60.__vbaVarAnd
005C9BF7   .  50            push    eax
005C9BF8   .  FF15 2C114000 call    dword ptr [<&msvbvm60.__vbaBoolV>;  msvbvm60.__vbaBoolVarNull
005C9BFE   .  66:8985 FCFEF>mov     word ptr [ebp-104], ax
005C9C05   .  8D55 80       lea     edx, dword ptr [ebp-80]
005C9C08   .  8D45 90       lea     eax, dword ptr [ebp-70]
005C9C0B   .  52            push    edx
005C9C0C   .  8D4D B0       lea     ecx, dword ptr [ebp-50]
005C9C0F   .  50            push    eax
005C9C10   .  8D55 C0       lea     edx, dword ptr [ebp-40]
005C9C13   .  51            push    ecx
005C9C14   .  52            push    edx
005C9C15   .  6A 04         push    4
005C9C17   .  FF15 44104000 call    dword ptr [<&msvbvm60.__vbaFreeV>;  msvbvm60.__vbaFreeVarList
005C9C1D   .  83C4 14       add     esp, 14
005C9C20   .  66:39B5 FCFEF>cmp     word ptr [ebp-104], si
005C9C27   .  0F84 84000000 je      005C9CB1
005C9C2D   .  8B45 DC       mov     eax, dword ptr [ebp-24]
005C9C30   .  8D4D E0       lea     ecx, dword ptr [ebp-20]
005C9C33   .  8D55 C0       lea     edx, dword ptr [ebp-40]
005C9C36   .  8985 38FFFFFF mov     dword ptr [ebp-C8], eax
005C9C3C   .  898D 58FFFFFF mov     dword ptr [ebp-A8], ecx
005C9C42   .  52            push    edx
005C9C43   .  8D85 50FFFFFF lea     eax, dword ptr [ebp-B0]
005C9C49   .  57            push    edi
005C9C4A   .  8D4D B0       lea     ecx, dword ptr [ebp-50]
005C9C4D   .  50            push    eax
005C9C4E   .  51            push    ecx
005C9C4F   .  C785 30FFFFFF>mov     dword ptr [ebp-D0], 8
005C9C59   .  C745 C8 01000>mov     dword ptr [ebp-38], 1
005C9C60   .  C745 C0 02000>mov     dword ptr [ebp-40], 2
005C9C67   .  C785 50FFFFFF>mov     dword ptr [ebp-B0], 4008
005C9C71   .  FFD3          call    ebx
005C9C73   .  8D95 30FFFFFF lea     edx, dword ptr [ebp-D0]
005C9C79   .  8D45 B0       lea     eax, dword ptr [ebp-50]
005C9C7C   .  52            push    edx
005C9C7D   .  8D4D A0       lea     ecx, dword ptr [ebp-60]
005C9C80   .  50            push    eax
005C9C81   .  51            push    ecx
005C9C82   .  FF15 38124000 call    dword ptr [<&msvbvm60.__vbaVarCa>;  msvbvm60.__vbaVarCat
005C9C88   .  50            push    eax
005C9C89   .  FF15 2C104000 call    dword ptr [<&msvbvm60.__vbaStrVa>;  msvbvm60.__vbaStrVarMove
005C9C8F   .  8BD0          mov     edx, eax
005C9C91   .  8D4D DC       lea     ecx, dword ptr [ebp-24]
005C9C94   .  FF15 24134000 call    dword ptr [<&msvbvm60.__vbaStrMo>;  msvbvm60.__vbaStrMove
005C9C9A   .  8D55 A0       lea     edx, dword ptr [ebp-60]
005C9C9D   .  8D45 B0       lea     eax, dword ptr [ebp-50]
005C9CA0   .  52            push    edx
005C9CA1   .  8D4D C0       lea     ecx, dword ptr [ebp-40]
005C9CA4   .  50            push    eax
005C9CA5   .  51            push    ecx
005C9CA6   .  6A 03         push    3
005C9CA8   .  FF15 44104000 call    dword ptr [<&msvbvm60.__vbaFreeV>;  msvbvm60.__vbaFreeVarList
005C9CAE   .  83C4 10       add     esp, 10
005C9CB1   >  8B3D 24134000 mov     edi, dword ptr [<&msvbvm60.__vba>;  msvbvm60.__vbaStrMove
005C9CB7   .  B8 01000000   mov     eax, 1
005C9CBC   .  66:0345 E8    add     ax, word ptr [ebp-18]
005C9CC0   .  0F80 2A010000 jo      005C9DF0
005C9CC6   .  8945 E8       mov     dword ptr [ebp-18], eax
005C9CC9   .^ E9 53FEFFFF   jmp     005C9B21           ;  循环结束。这个循环就是将我们输入的注册码中所有的字母,0,9,全部过滤掉!

      

005C9CCE   >  8B55 DC       mov     edx, dword ptr [ebp-24]          ;  处理完以后的注册码
005C9CD1   .  52            push    edx                              ; /String
005C9CD2   .  FF15 F0114000 call    dword ptr [<&msvbvm60.rtcStrReve>; \将处理完以后的注册码,反序
005C9CD8   .  8BD0          mov     edx, eax
005C9CDA   .  8D4D DC       lea     ecx, dword ptr [ebp-24]
005C9CDD   .  FFD7          call    edi
005C9CDF   .  8B45 E4       mov     eax, dword ptr [ebp-1C]          ;  取出计算好的真码,由这里可以定位到005C9A9C  call  005F2AD0这个函数得到了真码!   
005C9CE2   .  8B4D DC       mov     ecx, dword ptr [ebp-24]          ;  得到我们输入的并经过处理的注册码
005C9CE5   .  50            push    eax
005C9CE6   .  51            push    ecx
005C9CE7   .  FF15 68114000 call    dword ptr [<&msvbvm60.__vbaStrCm>;  开始比较
005C9CED   .  85C0          test    eax, eax
005C9CEF   .  74 33         je      short 005C9D24                   ;  这里就是关键跳了~~~~

005C9CF1   .  8B45 08       mov     eax, dword ptr [ebp+8]
005C9CF4   .  66:8935 3CF05>mov     word ptr [5FF03C], si
005C9CFB   .  50            push    eax
005C9CFC   .  8B10          mov     edx, dword ptr [eax]
005C9CFE   .  FF92 1C050000 call    dword ptr [edx+51C]
好了,到这里我们就可以定位到算法部分了,在005C9A9C  call  005F2AD0处F7,跟进去:
005F2AD0   $  55            push    ebp
005F2AD1   .  8BEC          mov     ebp, esp
005F2AD3   .  83EC 0C       sub     esp, 0C
005F2AD6   .  68 662B4000   push    <jmp.&msvbvm60.__vbaExceptHandle>;  SE 处理程序安装
005F2ADB   .  64:A1 0000000>mov     eax, dword ptr fs:[0]
005F2AE1   .  50            push    eax


005F2B55   .  FF15 30104000 call    dword ptr [<&msvbvm60.__vbaLenBs>; \__vbaLenBstr
005F2B5B   .  8BC8          mov     ecx, eax                         ;  得到用户名的长度
005F2B5D   .  FF15 80114000 call    dword ptr [<&msvbvm60.__vbaI2I4>>;  msvbvm60.__vbaI2I4
005F2B63   .  8B1D 24134000 mov     ebx, dword ptr [<&msvbvm60.__vba>;  msvbvm60.__vbaStrMove
005F2B69   .  8B3D 44104000 mov     edi, dword ptr [<&msvbvm60.__vba>;  msvbvm60.__vbaFreeVarList
005F2B6F   .  66:2D 0100    sub     ax, 1                            ;  这里开始第一次循环
005F2B73   .  0F80 B3090000 jo      005F352C
005F2B79   .  8985 E8FEFFFF mov     dword ptr [ebp-118], eax
005F2B7F   >  8B55 DC       mov     edx, dword ptr [ebp-24]       
005F2B82   .  66:3BB5 E8FEF>cmp     si, word ptr [ebp-118]
005F2B89   .  52            push    edx
005F2B8A   .  0F8F EC000000 jg      005F2C7C                         ;  如果位数大于用户名的长度,则跳
005F2B90   .  FF15 20104000 call    dword ptr [<&msvbvm60.__vbaStrI4>;  msvbvm60.__vbaStrI4
005F2B96   .  8BD0          mov     edx, eax
005F2B98   .  8D4D C8       lea     ecx, dword ptr [ebp-38]
005F2B9B   .  FFD3          call    ebx
005F2B9D   .  50            push    eax                              ; /String
005F2B9E   .  FF15 F0114000 call    dword ptr [<&msvbvm60.rtcStrReve>; \字符串反序
005F2BA4   .  8BD0          mov     edx, eax
005F2BA6   .  8D4D C4       lea     ecx, dword ptr [ebp-3C]
005F2BA9   .  FFD3          call    ebx
005F2BAB   .  50            push    eax
005F2BAC   .  FF15 90124000 call    dword ptr [<&msvbvm60.__vbaI4Str>;  msvbvm60.__vbaI4Str
005F2BB2   .  8945 DC       mov     dword ptr [ebp-24], eax
005F2BB5   .  8D45 C4       lea     eax, dword ptr [ebp-3C]
005F2BB8   .  8D4D C8       lea     ecx, dword ptr [ebp-38]
005F2BBB   .  50            push    eax
005F2BBC   .  51            push    ecx
005F2BBD   .  6A 02         push    2
005F2BBF   .  FF15 98124000 call    dword ptr [<&msvbvm60.__vbaFreeS>;  msvbvm60.__vbaFreeStrList
005F2BC5   .  8B55 0C       mov     edx, dword ptr [ebp+C]
005F2BC8   .  66:8BCE       mov     cx, si
005F2BCB   .  83C4 0C       add     esp, 0C
005F2BCE   .  66:83C1 01    add     cx, 1
005F2BD2   .  8995 4CFFFFFF mov     dword ptr [ebp-B4], edx
005F2BD8   .  8D45 B4       lea     eax, dword ptr [ebp-4C]
005F2BDB   .  0F80 4B090000 jo      005F352C
005F2BE1   .  0FBFD1        movsx   edx, cx
005F2BE4   .  50            push    eax                              ; /Length8
005F2BE5   .  8D85 44FFFFFF lea     eax, dword ptr [ebp-BC]          ; |
005F2BEB   .  52            push    edx                              ; |Start
005F2BEC   .  8D4D A4       lea     ecx, dword ptr [ebp-5C]          ; |
005F2BEF   .  50            push    eax                              ; |dString8
005F2BF0   .  51            push    ecx                              ; |RetBUFFER
005F2BF1   .  C745 BC 01000>mov     dword ptr [ebp-44], 1            ; |
005F2BF8   .  C745 B4 02000>mov     dword ptr [ebp-4C], 2            ; |
005F2BFF   .  C785 44FFFFFF>mov     dword ptr [ebp-BC], 4008         ; |
005F2C09   .  FF15 40114000 call    dword ptr [<&msvbvm60.rtcMidChar>; \rtcMidCharVar
005F2C0F   .  8D55 A4       lea     edx, dword ptr [ebp-5C]
005F2C12   .  8D45 C8       lea     eax, dword ptr [ebp-38]
005F2C15   .  52            push    edx                              ; /String8
005F2C16   .  50            push    eax                              ; |ARG2
005F2C17   .  FF15 2C124000 call    dword ptr [<&msvbvm60.__vbaStrVa>; \__vbaStrVarVal
005F2C1D   .  50            push    eax                              ; /String
005F2C1E   .  FF15 5C104000 call    dword ptr [<&msvbvm60.rtcAnsiVal>; \依次得到用户名每个字符的ASC
005F2C24   .  8B4D DC       mov     ecx, dword ptr [ebp-24]
005F2C27   .  0FBFD0        movsx   edx, ax
005F2C2A   .  2BCA          sub     ecx, edx
005F2C2C   .  0F80 FA080000 jo      005F352C
005F2C32   .  83C1 08       add     ecx, 8           ; +8
005F2C35   .  0F80 F1080000 jo      005F352C
005F2C3B   .  FF15 D8104000 call    dword ptr [<&msvbvm60.__vbaI4Abs>;  msvbvm60.__vbaI4Abs
005F2C41   .  8B55 DC       mov     edx, dword ptr [ebp-24]
005F2C44   .  8D4D C8       lea     ecx, dword ptr [ebp-38]
005F2C47   .  03C2          add     eax, edx
005F2C49   .  0F80 DD080000 jo      005F352C
005F2C4F   .  8945 DC       mov     dword ptr [ebp-24], eax       ;
005F2C52   .  FF15 64134000 call    dword ptr [<&msvbvm60.__vbaFreeS>;  msvbvm60.__vbaFreeStr
005F2C58   .  8D45 A4       lea     eax, dword ptr [ebp-5C]
005F2C5B   .  8D4D B4       lea     ecx, dword ptr [ebp-4C]
005F2C5E   .  50            push    eax
005F2C5F   .  51            push    ecx
005F2C60   .  6A 02         push    2
005F2C62   .  FFD7          call    edi
005F2C64   .  B8 01000000   mov     eax, 1
005F2C69   .  83C4 0C       add     esp, 0C
005F2C6C   .  66:03C6       add     ax, si
005F2C6F   .  0F80 B7080000 jo      005F352C
005F2C75   .  8BF0          mov     esi, eax
005F2C77   .^ E9 03FFFFFF   jmp     005F2B7F
忽忽,这个循环终于看明白了,前后有三次差点就放弃……,幸好我有汇编指令速查手册,否则就凭我那汇编的破水平,还真的分析不下去了!这个循环就是处理用户名,可是我VC用的太差劲,我不知道VC里面用来将字符串反序的函数是什么,只有自己写了,这样上面的代码用C表示代码如下:
CString CYzrfKEYGENDlg::StrReverse(char *str)//这个函数就是将字符串反序
{
  CString mstr(str);
  CString cstr;
  
  for(int i = mstr.GetLength()-1; i >= 0; i--)
  {
    cstr += mstr.GetAt(i);
  }

  return cstr;
}
void CYzrfKEYGENDlg::OnOK() 
{
  // TODO: Add extra valIDAtion here
  UpdateData(TRUE);
  int edx = 0;
  int res = 0;
  CString cstr;
  for(int i=0; i < m_Name.GetLength();i++)
  {
    char code[50];
    int asc = 0;

    itoa(res,code,10);
    cstr = StrReverse(code);
    edx = atoi(cstr);
    res = edx;

    asc = m_Name.GetAt(i);
    edx -= asc;
    edx +=8;
    edx = abs(edx);
    res += edx;    
  }
  cstr.Format("%d",res);//这里的cstr中就是循环的结果了~
  MessageBox(cstr);
}
哎,第一个循环就用了我近10个小时(大部分时间都用来查汇编指令了,看来汇编急需饿补哦`~~~),真的不敢相信我会将这个程序分析完~~~,可是都费了这么多的时间了,现在放弃真的不甘心!!!
    等明天在继续分析第二个循环吧~~~
第二个循环如下:
005F2C7C   > \FF15 20104000 call    dword ptr [<&msvbvm60.__vbaStrI4>]       ;  msvbvm60.__vbaStrI4
005F2C82   .  8BD0          mov     edx, eax                                 ;  将循环处理的结果给EDX
005F2C84   .  8D4D D4       lea     ecx, dword ptr [ebp-2C]
005F2C87   .  FFD3          call    ebx
005F2C89   .  8B75 08       mov     esi, dword ptr [ebp+8]
005F2C8C   .  8B06          mov     eax, dword ptr [esi]                     ;  取出机器码
005F2C8E   .  50            push    eax                                      ; /String
005F2C8F   .  FF15 30104000 call    dword ptr [<&msvbvm60.__vbaLenBstr>]     ; \__vbaLenBstr
005F2C95   .  8BC8          mov     ecx, eax                                 ;  取机器码的长度
005F2C97   .  83E9 01       sub     ecx, 1
005F2C9A   .  0F80 8C080000 jo      005F352C
005F2CA0   .  FF15 80114000 call    dword ptr [<&msvbvm60.__vbaI2I4>]        ;  msvbvm60.__vbaI2I4
005F2CA6   .  8985 E0FEFFFF mov     dword ptr [ebp-120], eax
005F2CAC   .  C745 D8 01000>mov     dword ptr [ebp-28], 1
005F2CB3   >  66:8B8D E0FEF>mov     cx, word ptr [ebp-120]                   ;  这里开始第二次循环
005F2CBA   .  66:394D D8    cmp     word ptr [ebp-28], cx
005F2CBE   .  0F8F 17010000 jg      005F2DDB
005F2CC4   .  8B55 D4       mov     edx, dword ptr [ebp-2C]                  ;  取出上个循环得到的字符串
005F2CC7   .  52            push    edx                                      ; /String
005F2CC8   .  FF15 30104000 call    dword ptr [<&msvbvm60.__vbaLenBstr>]     ; \__vbaLenBstr
005F2CCE   .  8B4D E4       mov     ecx, dword ptr [ebp-1C]                  ;  取它的长度
005F2CD1   .  0FBFD1        movsx   edx, cx
005F2CD4   .  3BD0          cmp     edx, eax
005F2CD6   .  7C 09         jl      short 005F2CE1
005F2CD8   .  C745 E4 01000>mov     dword ptr [ebp-1C], 1
005F2CDF   .  EB 0D         jmp     short 005F2CEE
005F2CE1   >  66:83C1 01    add     cx, 1                                    ;  计数器加1
005F2CE5   .  0F80 41080000 jo      005F352C
005F2CEB   .  894D E4       mov     dword ptr [ebp-1C], ecx
005F2CEE   >  0FBF45 D8     movsx   eax, word ptr [ebp-28]
005F2CF2   .  8D4D B4       lea     ecx, dword ptr [ebp-4C]
005F2CF5   .  8D95 44FFFFFF lea     edx, dword ptr [ebp-BC]
005F2CFB   .  51            push    ecx                                      ; /Length8
005F2CFC   .  50            push    eax                                      ; |Start
005F2CFD   .  8D45 A4       lea     eax, dword ptr [ebp-5C]                  ; |
005F2D00   .  52            push    edx                                      ; |dString8
005F2D01   .  50            push    eax                                      ; |上个循环中的结果
005F2D02   .  C745 BC 01000>mov     dword ptr [ebp-44], 1                    ; |
005F2D09   .  C745 B4 02000>mov     dword ptr [ebp-4C], 2                    ; |
005F2D10   .  89B5 4CFFFFFF mov     dword ptr [ebp-B4], esi                  ; |
005F2D16   .  C785 44FFFFFF>mov     dword ptr [ebp-BC], 4008                 ; |
005F2D20   .  FF15 40114000 call    dword ptr [<&msvbvm60.rtcMidCharVar>]    ; \从上个循环的结果中依次取字符
005F2D26   .  0FBF45 E4     movsx   eax, word ptr [ebp-1C]
005F2D2A   .  8D4D DC       lea     ecx, dword ptr [ebp-24]
005F2D2D   .  8D55 94       lea     edx, dword ptr [ebp-6C]
005F2D30   .  898D 2CFFFFFF mov     dword ptr [ebp-D4], ecx
005F2D36   .  52            push    edx                                      ; /Length8
005F2D37   .  8D8D 24FFFFFF lea     ecx, dword ptr [ebp-DC]                  ; |
005F2D3D   .  50            push    eax                                      ; |Start
005F2D3E   .  8D55 84       lea     edx, dword ptr [ebp-7C]                  ; |
005F2D41   .  51            push    ecx                                      ; |dString8
005F2D42   .  52            push    edx                                      ; |RetBUFFER
005F2D43   .  C745 9C 01000>mov     dword ptr [ebp-64], 1                    ; |
005F2D4A   .  C745 94 02000>mov     dword ptr [ebp-6C], 2                    ; |
005F2D51   .  C785 24FFFFFF>mov     dword ptr [ebp-DC], 4003                 ; |
005F2D5B   .  FF15 40114000 call    dword ptr [<&msvbvm60.rtcMidCharVar>]    ; \从机器码中依次取字符
005F2D61   .  0FBF45 D8     movsx   eax, word ptr [ebp-28]
005F2D65   .  56            push    esi
005F2D66   .  50            push    eax
005F2D67   .  8D45 A4       lea     eax, dword ptr [ebp-5C]
005F2D6A   .  6A 01         push    1
005F2D6C   .  8D4D 84       lea     ecx, dword ptr [ebp-7C]
005F2D6F   .  50            push    eax
005F2D70   .  8D95 74FFFFFF lea     edx, dword ptr [ebp-8C]
005F2D76   .  51            push    ecx
005F2D77   .  52            push    edx
005F2D78   .  FF15 B0104000 call    dword ptr [<&msvbvm60.__vbaVarXor>]      ;  将上两个函数取出的的字符进行异或
005F2D7E   .  50            push    eax
005F2D7F   .  FF15 2C104000 call    dword ptr [<&msvbvm60.__vbaStrVarMove>]  ;  msvbvm60.__vbaStrVarMove
005F2D85   .  8BD0          mov     edx, eax
005F2D87   .  8D4D C8       lea     ecx, dword ptr [ebp-38]
005F2D8A   .  FFD3          call    ebx
005F2D8C   .  50            push    eax
005F2D8D   .  6A 00         push    0
005F2D8F   .  FF15 5C134000 call    dword ptr [<&msvbvm60.__vbaMidStmtBstr>] ;  msvbvm60.__vbaMidStmtBstr
005F2D95   .  8D4D C8       lea     ecx, dword ptr [ebp-38]
005F2D98   .  FF15 64134000 call    dword ptr [<&msvbvm60.__vbaFreeStr>]     ;  msvbvm60.__vbaFreeStr
005F2D9E   .  8D45 84       lea     eax, dword ptr [ebp-7C]
005F2DA1   .  8D4D A4       lea     ecx, dword ptr [ebp-5C]
005F2DA4   .  50            push    eax
005F2DA5   .  8D55 94       lea     edx, dword ptr [ebp-6C]
005F2DA8   .  51            push    ecx
005F2DA9   .  8D45 B4       lea     eax, dword ptr [ebp-4C]
005F2DAC   .  52            push    edx
005F2DAD   .  50            push    eax
005F2DAE   .  6A 04         push    4
005F2DB0   .  FFD7          call    edi
005F2DB2   .  8B0E          mov     ecx, dword ptr [esi]
005F2DB4   .  83C4 14       add     esp, 14
005F2DB7   .  51            push    ecx                                      ; /String
005F2DB8   .  FF15 F0114000 call    dword ptr [<&msvbvm60.rtcStrReverse>]    ; \将字符反序
005F2DBE   .  8BD0          mov     edx, eax
005F2DC0   .  8BCE          mov     ecx, esi
005F2DC2   .  FFD3          call    ebx
005F2DC4   .  B8 01000000   mov     eax, 1
005F2DC9   .  66:0345 D8    add     ax, word ptr [ebp-28]
005F2DCD   .  0F80 59070000 jo      005F352C
005F2DD3   .  8945 D8       mov     dword ptr [ebp-28], eax
005F2DD6   .^ E9 D8FEFFFF   jmp     005F2CB3                                 ;  循环结束
我现在都开始后悔我怎么选择了一个VB程序呢?怎么我连系统的API函数的功能都看不明白啊,<&msvbvm60.rtcMidCharVar>这个函数,都知道它就是VB中的MID(),可是怎么一个取字符串的函数里没有字符串呢?全是什么4003,4008,函数返回的结果本来应该是某个字符串,可是OD返回的结果却是120008,这都是哪里跟哪里啊?

    终于,我经过饿补VB程序的分析方法、狂查看雪精华集。这段代码我也算熬过去了,很多时候真的需要我们有点毅力,不要轻易说放弃哈~~~~,这里谢谢MENGLONG大哥的《浅谈VB6逆向工程》系列文章,让我受益非浅,在这里膜拜一下~~~~~~~~~~~,至于我学到的东西,我贴到文章最后的经验总结中,都是写老生常谈的东西,但都是肺腑之言,希望能对跟我一样菜的朋友有所帮助!

    这段代码就是取出机器码,依次将上一个循环算出的字符串的第一个字符异或,然后在将得到的字符串反序,再进行第二个字符异或,依次类推,如下面:
242245872125
    ↓  3   =    2 xor 1
342245872125
    ↓反序
521278542243
    ↓  4   =    2 xor 6
541278542243
    ↓反序
342245872145

 。。。

341215172145
    ↓  5     =   4 xor 1
341215172155
    ↓反序
551271512143
转换成C的代码如下:
res = 0;
  cres = m_jiqima;
  for(int x = 0;x < m_jiqima.GetLength()-1;x++,res++)
  {
    char a,b;
    char *d;
    if(res == cstr.GetLength())  res = 0;

    a = cres.GetAt(x);//242245872125
    b = cstr.GetAt(res);//16048

    a ^= b;
    if(a > 9) a = 1;
    itoa(a,&b,10);

    cres.Delete(x);
    cres.Insert(x,b);
    d = (LPSTR)(LPCTSTR)cres;
    cres = StrReverse(d);
  }

MessageBox(cres);
第二个循环结束了,休息一下,明天在继续吧~~~

下面看第三个循环:
005F2DDB   >  8B16          mov     edx, dword ptr [esi]              ;  将运算出来的字符串给EDX
005F2DDD   . |52            push    edx                               ; /String
005F2DDE   . |FF15 30104000 call    dword ptr [<&msvbvm60.__vbaLenBst>; \__vbaLenBstr
005F2DE4   . |83F8 12       cmp     eax, 12                           ;  结果应该是18位
005F2DE7   . |0F8D D5000000 jge     005F2EC2
005F2DED   . |8B06          mov     eax, dword ptr [esi]
005F2DEF   . |50            push    eax                               ; /String
005F2DF0   . |FF15 30104000 call    dword ptr [<&msvbvm60.__vbaLenBst>; \取出计算的字符串的长度
005F2DF6   . |8BC8          mov     ecx, eax
005F2DF8   . |FF15 80114000 call    dword ptr [<&msvbvm60.__vbaI2I4>] ;  msvbvm60.__vbaI2I4
005F2DFE   . |8985 D8FEFFFF mov     dword ptr [ebp-128], eax
005F2E04   . |C745 E8 01000>mov     dword ptr [ebp-18], 1
005F2E0B   > |66:8B8D D8FEF>mov     cx, word ptr [ebp-128]
005F2E12   . |66:394D E8    cmp     word ptr [ebp-18], cx
005F2E16   .^ 7F C3         jg      short 005F2DDB
005F2E18   . |8B16          mov     edx, dword ptr [esi]
005F2E1A   . |52            push    edx                               ; /String
005F2E1B   . |FF15 F0114000 call    dword ptr [<&msvbvm60.rtcStrRever>; \将上一个字符倒序
005F2E21   . |0FBF4D E8     movsx   ecx, word ptr [ebp-18]
005F2E25   . |8945 9C       mov     dword ptr [ebp-64], eax
005F2E28   . |8D45 B4       lea     eax, dword ptr [ebp-4C]
005F2E2B   . |50            push    eax                               ; /Length8
005F2E2C   . |8D95 44FFFFFF lea     edx, dword ptr [ebp-BC]           ; |
005F2E32   . |51            push    ecx                               ; |Start
005F2E33   . |8D45 A4       lea     eax, dword ptr [ebp-5C]           ; |
005F2E36   . |52            push    edx                               ; |dString8
005F2E37   . |50            push    eax                               ; |RetBUFFER
005F2E38   . |C745 94 08000>mov     dword ptr [ebp-6C], 8             ; |
005F2E3F   . |C745 BC 01000>mov     dword ptr [ebp-44], 1             ; |
005F2E46   . |C745 B4 02000>mov     dword ptr [ebp-4C], 2             ; |
005F2E4D   . |89B5 4CFFFFFF mov     dword ptr [ebp-B4], esi           ; |
005F2E53   . |C785 44FFFFFF>mov     dword ptr [ebp-BC], 4008          ; |
005F2E5D   . |FF15 40114000 call    dword ptr [<&msvbvm60.rtcMidCharV>; \rtcMidCharVar
005F2E63   . |8D4D 94       lea     ecx, dword ptr [ebp-6C]           ;  得到5,1
005F2E66   . |8D55 A4       lea     edx, dword ptr [ebp-5C]
005F2E69   . |51            push    ecx
005F2E6A   . |8D45 84       lea     eax, dword ptr [ebp-7C]
005F2E6D   . |52            push    edx
005F2E6E   . |50            push    eax
005F2E6F   . |FF15 38124000 call    dword ptr [<&msvbvm60.__vbaVarCat>;  msvbvm60.__vbaVarCat
005F2E75   . |50            push    eax
005F2E76   . |FF15 2C104000 call    dword ptr [<&msvbvm60.__vbaStrVar>;  msvbvm60.__vbaStrVarMove
005F2E7C   . |8BD0          mov     edx, eax
005F2E7E   . |8BCE          mov     ecx, esi
005F2E80   . |FFD3          call    ebx
005F2E82   . |8D4D 84       lea     ecx, dword ptr [ebp-7C]
005F2E85   . |8D55 A4       lea     edx, dword ptr [ebp-5C]
005F2E88   . |51            push    ecx
005F2E89   . |8D45 94       lea     eax, dword ptr [ebp-6C]
005F2E8C   . |52            push    edx
005F2E8D   . |8D4D B4       lea     ecx, dword ptr [ebp-4C]
005F2E90   . |50            push    eax
005F2E91   . |51            push    ecx
005F2E92   . |6A 04         push    4
005F2E94   . |FFD7          call    edi
005F2E96   . |8B16          mov     edx, dword ptr [esi]
005F2E98   . |83C4 14       add     esp, 14
005F2E9B   . |52            push    edx                               ; /String
005F2E9C   . |FF15 30104000 call    dword ptr [<&msvbvm60.__vbaLenBst>; \__vbaLenBstr
005F2EA2   . |83F8 12       cmp     eax, 12
005F2EA5   .^\0F8D 30FFFFFF jge     005F2DDB
005F2EAB   .  B8 02000000   mov     eax, 2
005F2EB0   .  66:0345 E8    add     ax, word ptr [ebp-18]
005F2EB4   .  0F80 72060000 jo      005F352C
005F2EBA   .  8945 E8       mov     dword ptr [ebp-18], eax
005F2EBD   .^ E9 49FFFFFF   jmp     005F2E0B
    这个循环就很容易看明白了,就是,如果第二个循环得到的字符串如果不够18位,则取第一个字母贴到字符串后面,如果还不够,则将新的字符串倒序,取第三个字母,如果还不够18位,则再倒序,取第5个字母,贴到字符串后面,依次类推……
转换成C的代码如下:


代码:
  for(i = 0;cres.GetLength() < 18;i += 2)
  {
    char abc;
    char *d;
    abc = cres.GetAt(i);
    d = (LPSTR)(LPCTSTR)cres;
    cres = StrReverse(d);
    cres += abc;
  }
  MessageBox(cres);
说实话,到这里我反而觉得一切都不是像一开始那么有压力了,似乎这个程序一下就变简单了一样!很神奇哦~~~,这个循环我只用了5分钟就看明白了~~~
    这个是我第一次逆向分析一个软件的算法,虽然耗用了很多的时间,但是收获真的很多,帖出来与大家一起分享!



--------------------------------------------------------------------------------
【经验总结】
    本来以为,VB开发软件很容易,调试VB的程序也应该差不多的^_^,可是这个程序我也算坚持下来,分析完了~~~,收获不少,大概总结如下,希望能对像我一样菜的朋友能有所帮助:
    1、不要怀疑自己的能力:我没有学过汇编语言!但是我查着汇编指令大全也可以大概的分析出来!
    2、做事情要有耐心和毅力,不要轻言放弃:分析这个程序,我真的很多次想要放弃,因为我不知道该如何分析VB的程序,甚至它使用的函数我都查不到是什么意思,怎么用!
    3、看来要学破解,不仅要JAVA学的好,VB也要通的哈~~~~~~
        4、总感觉破解很难,很多人叫我大牛,说实话我曾经迷失过自己,但是我算什么呢菜鸟一个!!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于 聚星亭 , 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年07月22日 13:05:44

[ 本帖最后由 bester 于 2009-2-13 03:22 编辑 ]

免费评分

参与人数 1威望 +1 收起 理由
lqiulu + 1 感谢发布原创作品,[吾爱破解]因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 20:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表