飘云 发表于 2010-5-7 16:47:47

批量文件改名工具 2.0.0算法分析+ASM注册函数

【破文标题】批量文件改名工具 2.0.0算法分析+ASM注册函数
【破文作者】飘云/P.Y.G
【官方主页】https://www.chinapyg.com
【作者博客】http://blog.piaoyunsoft.com
【破解平台】WinXp SP3
【破解工具】PEiD0.94、OD
【作者邮箱】[email protected]
【软件名称】批量文件改名工具 2.0.0
【软件大小】499 K
【原版下载】http://www.newhua.com/soft/90436.htm
【破解过程】

PEID 探测-->Borland Delphi 6.0 - 7.0

很好,,无壳~

OD载入~~输入信息:

Email:[email protected]
注册码:123456789

在OD下断来到(如果找不到这个算法位置,说明您目前还不适合看本文):

004AE490push    ebp
004AE491mov   ebp, esp
004AE493add   esp, -10
004AE496xor   ecx, ecx
004AE498mov   dword ptr [ebp-10], ecx
004AE49Bmov   dword ptr [ebp-C], ecx
004AE49Emov   dword ptr [ebp-8], edx
004AE4A1mov   dword ptr [ebp-4], eax
004AE4A4xor   eax, eax
004AE4A6push    ebp
004AE4A7push    004AE5B8
004AE4ACpush    dword ptr fs:[eax]
004AE4AFmov   dword ptr fs:[eax], esp
004AE4B2mov   eax, dword ptr [ebp-4]
004AE4B5call    004AE344                         ;关键CALLF7进
004AE4BAtest    al, al
004AE4BCje      004AE59D                         ;关键跳
004AE4C2mov   byte ptr , 1
004AE4C9mov   edx, 004AE5CC                  ;※注册成功※
004AE4CEmov   eax, dword ptr [ebp-4]
.
.
.
.


{----------------------关键CALL:call    004AE344--------------------}
004AE344push    ebp
004AE345mov   ebp, esp
004AE347add   esp, -10
004AE34Axor   edx, edx
004AE34Cmov   dword ptr [ebp-C], edx
004AE34Fmov   dword ptr [ebp-10], edx
004AE352mov   dword ptr [ebp-4], eax
004AE355xor   eax, eax
004AE357push    ebp
004AE358push    004AE3B0
004AE35Dpush    dword ptr fs:[eax]
004AE360mov   dword ptr fs:[eax], esp
004AE363lea   edx, dword ptr [ebp-C]
004AE366mov   eax, dword ptr [ebp-4]
004AE369mov   eax, dword ptr [eax+30C]
004AE36Fcall    0045DD80
004AE374mov   eax, dword ptr [ebp-C]
004AE377push    eax
004AE378lea   edx, dword ptr [ebp-10]
004AE37Bmov   eax, dword ptr [ebp-4]
004AE37Emov   eax, dword ptr [eax+308]
004AE384call    0045DD80
004AE389mov   eax, dword ptr [ebp-10]          ;指向邮箱
004AE38Cpop   edx
004AE38Dcall    004AE1A4                         ;算法CALL1 -->F7进去
004AE392mov   byte ptr [ebp-5], al             ;关键赋值
004AE395xor   eax, eax
004AE397pop   edx
004AE398pop   ecx
004AE399pop   ecx
004AE39Amov   dword ptr fs:[eax], edx
004AE39Dpush    004AE3B7
004AE3A2lea   eax, dword ptr [ebp-10]
004AE3A5mov   edx, 2
004AE3AAcall    00404834
004AE3AFretn
004AE3B0jmp   00404190
004AE3B5jmp   short 004AE3A2
004AE3B7mov   al, byte ptr [ebp-5]
004AE3BAmov   esp, ebp
004AE3BCpop   ebp
004AE3BDretn

{----------------------算法CALL1:call    004AE1A4---------------------}
004AE1A4push    ebp
004AE1A5mov   ebp, esp
004AE1A7add   esp, -14
004AE1AAxor   ecx, ecx
004AE1ACmov   dword ptr [ebp-10], ecx
004AE1AFmov   dword ptr [ebp-8], edx
004AE1B2mov   dword ptr [ebp-4], eax
004AE1B5mov   eax, dword ptr [ebp-4]
004AE1B8call    00404CC0
004AE1BDmov   eax, dword ptr [ebp-8]
004AE1C0call    00404CC0
004AE1C5xor   eax, eax
004AE1C7push    ebp
004AE1C8push    004AE243
004AE1CDpush    dword ptr fs:[eax]
004AE1D0mov   dword ptr fs:[eax], esp
004AE1D3mov   byte ptr [ebp-B], 0
004AE1D7mov   eax, dword ptr [ebp-4]         ;指向邮箱
004AE1DAcall    00404AD0                         ;邮箱长度
004AE1DFtest    al, al
004AE1E1jbe   short 004AE201
004AE1E3mov   byte ptr [ebp-11], al
004AE1E6mov   byte ptr [ebp-A], 1            ;1
004AE1EA/xor   eax, eax
004AE1EC|mov   al, byte ptr [ebp-A]
004AE1EF|mov   edx, dword ptr [ebp-4]          ;指向邮箱地址
004AE1F2|mov   al, byte ptr [edx+eax-1]      ;逐位
004AE1F6|add   byte ptr [ebp-B], al            ;字节累加
004AE1F9|inc   byte ptr [ebp-A]
004AE1FC|dec   byte ptr [ebp-11]
004AE1FF\jnz   short 004AE1EA
004AE201lea   ecx, dword ptr [ebp-10]
004AE204mov   dl, byte ptr [ebp-B]             ;取出累加结果(单字节哦~~~)
004AE207mov   eax, 004AE25C                  ;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
004AE20Ccall    004A0028                         ;算法CALL2
004AE211mov   eax, dword ptr [ebp-10]          ;真码
004AE214mov   edx, dword ptr [ebp-8]         ;假码
004AE217call    00404C1C
004AE21Csete    byte ptr [ebp-9]               ;标志位
004AE220xor   eax, eax
004AE222pop   edx
004AE223pop   ecx
004AE224pop   ecx
004AE225mov   dword ptr fs:[eax], edx
004AE228push    004AE24A
004AE22Dlea   eax, dword ptr [ebp-10]
004AE230call    00404810
004AE235lea   eax, dword ptr [ebp-8]
004AE238mov   edx, 2
004AE23Dcall    00404834
004AE242retn
004AE243jmp   00404190
004AE248jmp   short 004AE22D
004AE24Amov   al, byte ptr [ebp-9]             ;标志位传到al~~ 作为注册标志
004AE24Dmov   esp, ebp
004AE24Fpop   ebp
004AE250retn


{----------------------算法CALL2:call    004A0028---------------------}

004A0028push    ebp
004A0029mov   ebp, esp
004A002Badd   esp, -18
004A002Epush    ebx
004A002Fxor   ebx, ebx
004A0031mov   dword ptr [ebp-18], ebx
004A0034mov   dword ptr [ebp-C], ecx
004A0037mov   byte ptr [ebp-5], dl
004A003Amov   dword ptr [ebp-4], eax
004A003Dmov   eax, dword ptr [ebp-4]
004A0040call    00404CC0
004A0045xor   eax, eax
004A0047push    ebp
004A0048push    004A0112
004A004Dpush    dword ptr fs:[eax]
004A0050mov   dword ptr fs:[eax], esp
004A0053mov   eax, dword ptr [ebp-C]
004A0056call    00404810
004A005Bxor   eax, eax
004A005Dmov   al, byte ptr [ebp-5]             ;前面邮箱的累加结果
004A0060xor   eax, 12BFD54                     ;异或 0x12BFD54
004A0065mov   edx, dword ptr           ;指向一个全局变量
004A006Bmov   dword ptr [edx], eax             ;给变量赋初始值
004A006Dxor   eax, eax
004A006Fmov   dword ptr [ebp-10], eax
004A0072/mov   eax, dword ptr [ebp-4]          ;指向密码表
004A0075|call    00404AD0
004A007A|call    004030E8                        ;★重要CALL-->获取一个数[与上面的全局变量值有关,进去看]
004A007F|inc   eax
004A0080|mov   edx, dword ptr [ebp-4]          ;指向密码表
004A0083|mov   al, byte ptr [edx+eax-1]      ;根据eax的结果从密码表中查表获取字符传送到al
004A0087|mov   byte ptr [ebp-11], al
004A008A|cmp   byte ptr [ebp-11], 2D         ;-
004A008E|je      short 004A0072
004A0090|cmp   byte ptr [ebp-11], 30         ;0
004A0094|je      short 004A0072
004A0096|cmp   byte ptr [ebp-11], 4F         ;O
004A009A|je      short 004A0072
004A009C|cmp   byte ptr [ebp-11], 20         ;空格
004A00A0|je      short 004A0072
004A00A2|cmp   byte ptr [ebp-11], 2E         ;.
004A00A6|je      short 004A0072                  ;对获取的字符进行过滤~~如果为上面五种字符则跳过,重新选取,直到符合条件为止
004A00A8|lea   eax, dword ptr [ebp-18]
004A00AB|mov   dl, byte ptr [ebp-11]         ;下面是保存符合条件的字符
004A00AE|call    004049F8
004A00B3|mov   edx, dword ptr [ebp-18]
004A00B6|mov   eax, dword ptr [ebp-C]
004A00B9|call    00404AD8
004A00BE|mov   eax, dword ptr [ebp-C]
004A00C1|mov   eax, dword ptr [ebp-C]
004A00C4|mov   eax, dword ptr [eax]            ;符合条件的字符的个数~~
004A00C6|call    00404AD0
004A00CB|cmp   eax, 13                         ;符合条件的字符串一共是0x13位~
004A00CE\jnz   short 004A0072
004A00D0mov   eax, dword ptr [ebp-C]
004A00D3call    00404D28
004A00D8mov   byte ptr [eax+4], 2D             ;KEY替换成-
004A00DCmov   eax, dword ptr [ebp-C]
004A00DFcall    00404D28
004A00E4mov   byte ptr [eax+9], 2D             ;KEY替换成 -
004A00E8mov   eax, dword ptr [ebp-C]
004A00EBcall    00404D28
004A00F0mov   byte ptr [eax+E], 2D             ;KEY替换成 -
004A00F4xor   eax, eax                         ;上面替换之后的就是注册码了~
004A00F6pop   edx
004A00F7pop   ecx
004A00F8pop   ecx
004A00F9mov   dword ptr fs:[eax], edx
004A00FCpush    004A0119
004A0101lea   eax, dword ptr [ebp-18]
004A0104call    00404810
004A0109lea   eax, dword ptr [ebp-4]
004A010Ccall    00404810
004A0111retn
004A0112jmp   00404190
004A0117jmp   short 004A0101
004A0119pop   ebx
004A011Amov   esp, ebp
004A011Cpop   ebp
004A011Dretn


{----------------------重要CALL:call    004030E8---------------------}
004030E8push    ebx
004030E9xor   ebx, ebx
004030EBimul    edx, dword ptr [ebx+4B4008], 808>;和全局变量的值相乘后 保存到edx
004030F5inc   edx                              ;edx+1
004030F6mov   dword ptr [ebx+4B4008], edx      ;继续保存回去
004030FCmul   edx                              ;edx * eax,结果放在edx中
004030FEmov   eax, edx                         ;保存最终结果,也就是要输出的
00403100pop   ebx
00403101retn

【算法总结】
1.按字节方式累加邮箱ASCII
2.累加结果 XOR 12BFD54h
3.将XOR的结果作为下一步第一轮的初始值
4.对3步的结果进行查表处理
5.将指定位置的字符串替换成分隔符'-'(注意:不是插入)
6.最终注册码形式:1111-2222-3333-4444
注册信息保存在:

【算法函数】
.data
szConstTable      db      '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',0

.code
;=================================================
;注册算法:
;1.按字节方式累加邮箱ASCII
;2.累加结果 XOR 12BFD54h
;3.将XOR的结果作为下一步第一轮的初始值
;4.对3步的结果进行查表处理
;5.将指定位置的字符串替换成分隔符'-'(注意:不是插入)
;6.最终注册码形式:1111-2222-3333-4444
;注册信息保存在:
;=================================================
KeyGen    proc    uses ecx edx lpEmail:DWORD
    LOCAL    @szKey:BYTE
    LOCAL    @bEmaiByte:BYTE
    LOCAL    @dwTemp:DWORD
   
    invoke    RtlZeroMemory,addr @szKey,sizeof @szKey   
   
    xor      ecx,ecx
    xor      edx,edx
    xor      esi,esi
   
    ;=============================
    ;对Email进行计算
    invoke    lstrlen,lpEmail    ;获取Email长度
    mov      edx,eax            ;保存长度
    mov      cl, 1
    mov      esi,lpEmail
   
    @@:
      xor    eax, eax
      mov    al, cl
      mov    al, byte ptr [esi+eax-1]
      add    @bEmaiByte, al
      inc    cl
      dec    edx
      jnz    @B
    ;=============================

    ;=============================
    ;主要获取可视字符过程、查表
    mov      al,@bEmaiByte
    xor      eax,12BFD54h
    mov      @dwTemp, eax
    xor      esi,esi
    @@:
      invoke    lstrlen,addr szConstTable      
      xor      ebx, ebx
      imul    edx, dword ptr [@dwTemp], 8088405h
      inc      edx
      mov      dword ptr [@dwTemp], edx
      mul      edx
      mov      eax,edx
      inc      eax
      mov      al,byte ptr eax-1]
      cmp      al, 2Dh
      je      @B
      cmp      al, 30h
      je      @B
      cmp      al, 4Fh
      je      @B
      cmp      al, 20h
      je      @B
      cmp      al, 2Eh
      je      @B
      mov      byte ptr[@szKey+esi],al
      inc      esi
      invoke    lstrlen,addr @szKey
      cmp      eax, 13h
      jnz    @B
      ;=============================

    ;插入分隔符
    mov      byte ptr [@szKey+4h],2Dh
    mov      byte ptr [@szKey+9h],2Dh
    mov      byte ptr [@szKey+0Eh],2Dh

    ;输出最终注册码
    lea      eax,@szKey

    ret

KeyGen endp


【版权声明】 本文纯属技术交流, 原创于PYG官方论坛, 转载请注明作者并保持文章的完整, 谢谢!

Nisy 发表于 2010-5-7 18:54:09

还是习惯VC的传参 Del还是有点怪怪的 ~

月之精灵 发表于 2010-5-7 19:25:18

Nisy跑到我前面去了哈/:018

老万 发表于 2010-5-7 19:32:45

学习了飘老大的破文,谢谢
页: [1]
查看完整版本: 批量文件改名工具 2.0.0算法分析+ASM注册函数