【破文标题】 安琪个人助理 5.6H 超强版注册算法分析+汇编注册机
【破文作者】 snake
【软件名称】 安琪个人助理 5.6H 超强版
【下载地址】 http://yncnc.onlinedown.net/soft/4660.htm
【软件简介】 电脑上的"商务通",集成了通讯录、日程表、笔记本、家庭记账、炒股理财、电子邮件、信息速查等功能,特别为中国人设计。她可以保存、处理大量的个人信息,无论是保存、查询、处理通讯录等信息,还是管理工作日志、个人日记、日程安排、待办事宜以及家庭记账、炒股理财等,《安琪个人助理》都将成为您最得力的助手。
【调试环境】 Win2000、PEiD、DEDE、Ollydbg
【作者声明】 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
----------------------------------------------------------------------------------------------
【破解过程】
一、程序脱壳
用PEiD查壳,为UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo,手动脱之。
Ollydbg载入主程序
00B15FD0 A> 60 pushad
00B15FD1 BE 00008B00 mov esi,AngelPIM.008B0000
00B15FD6 8DBE 0010B5FF lea edi,dword ptr ds:[esi+FFB51000]
00B15FDC C787 CCD04D00 8A>mov dword ptr ds:[edi+4DD0CC],B744D28A
00B15FE6 57 push edi
00B15FE7 83CD FF or ebp,FFFFFFFF
00B15FEA EB 0E jmp short AngelPIM.00B15FFA
......
F8一次,在命令栏下命令 hr esp,回车,F9运行
00B16132 8903 mov dword ptr ds:[ebx],eax
00B16134 83C3 04 add ebx,4
00B16137 ^ EB E1 jmp short AngelPIM.00B1611A
00B16139 FF96 58E57100 call dword ptr ds:[esi+71E558]
00B1613F 61 popad
00B16140 ^ E9 FF58DCFF jmp AngelPIM.008DBA44 ; 断在这里,飞向光明之颠!^_^
00B16145 0000 add byte ptr ds:[eax],al
00B16147 0060 61 add byte ptr ds:[eax+61],ah
......
F8到这里
008DBA44 55 push ebp ; 程序OEP处用LordPE完全Dump这个进程
008DBA45 8BEC mov ebp,esp
008DBA47 B9 1F000000 mov ecx,1F
008DBA4C 6A 00 push 0
008DBA4E 6A 00 push 0
008DBA50 49 dec ecx
008DBA51 ^ 75 F9 jnz short AngelPIM.008DBA4C
008DBA53 51 push ecx
008DBA54 53 push ebx
......
脱壳后程序可正常运行,用PEiD查为Borland Delphi 6.0 - 7.0编写。
---------------------------------------------------------------------------------------------
二、算法分析
运行脱壳后程序,输入相关信息
注册ID编号: VMQRYUVT-JNPLVZYDK
用户姓名: snake
软件受权序列号:78787878787878787878787
注:若输入的序列号位数不对,则提示“您输入的软件授权序列号长度不对,请仔细检查!”,序列号应为23位。
注册后提示:注册码若正确,则能正常打开功能窗口否则软件自动关闭。请仔细阅读注册码邮件。
因软件是Borland Delphi语言编写,只好请出DeDe小分析一下,好找个合适的断点继续分析
单元名 模块名 事件 RVA 提示
MAIN TMainForm mnZipCodeClick 008BCD18 0015
就找008BCD18这个断点吧,看着也顺眼,不影响心情,呵呵。
----------------------------------------------------------------------------------------
Ollydbg载入脱壳后的程序,F9运行,输入注册信息,注册,弹出提示信息,确定。
在命令栏输入bp 008BCD18,回车,点击[工具]-->[邮编区号],程序被断下
008BCD18 . 55 push ebp ; 断在这里
008BCD19 . 8BEC mov ebp,esp
008BCD1B . 83C4 F8 add esp,-8
008BCD1E . 53 push ebx
008BCD1F . 56 push esi
008BCD20 . 57 push edi
008BCD21 . 8955 F8 mov dword ptr ss:[ebp-8],edx
008BCD24 . 8945 FC mov dword ptr ss:[ebp-4],eax
008BCD27 . 8B45 FC mov eax,dword ptr ss:[ebp-4]
008BCD2A . 50 push eax
008BCD2B . 8B0D 24EC8E00 mov ecx,dword ptr ds:[8EEC24] ; x.008F7C94
008BCD31 . 8B15 64AD8700 mov edx,dword ptr ds:[87AD64] ; x.0087ADB0
008BCD37 . 8B45 FC mov eax,dword ptr ss:[ebp-4]
008BCD3A . E8 8D140000 call x.008BE1CC ; F7跟进
008BCD3F . A1 24EC8E00 mov eax,dword ptr ds:[8EEC24]
008BCD44 . 8338 00 cmp dword ptr ds:[eax],0
008BCD47 . 74 36 je short x.008BCD7F
008BCD49 . 33C0 xor eax,eax
008BCD4B . 55 push ebp
008BCD4C . 68 75CD8B00 push x.008BCD75
008BCD51 . 64:FF30 push dword ptr fs:[eax]
008BCD54 . 64:8920 mov dword ptr fs:[eax],esp
008BCD57 . A1 24EC8E00 mov eax,dword ptr ds:[8EEC24]
008BCD5C . 8B00 mov eax,dword ptr ds:[eax]
008BCD5E . 8B80 54030000 mov eax,dword ptr ds:[eax+354]
008BCD64 . B2 01 mov dl,1
008BCD66 . E8 ADCCC0FF call x.004C9A18
008BCD6B . 33C0 xor eax,eax
008BCD6D . 5A pop edx
008BCD6E . 59 pop ecx
008BCD6F . 59 pop ecx
008BCD70 . 64:8910 mov dword ptr fs:[eax],edx
008BCD73 . EB 0A jmp short x.008BCD7F
......
========================= 跟进 008BCD3A E8 8D140000 call x.008BE1CC =========================
008BE1CC $ 55 push ebp
008BE1CD . 8BEC mov ebp,esp
008BE1CF . 51 push ecx
008BE1D0 . B9 2D000000 mov ecx,2D
008BE1D5 > 6A 00 push 0
008BE1D7 . 6A 00 push 0
008BE1D9 . 49 dec ecx
008BE1DA .^ 75 F9 jnz short x.008BE1D5
008BE1DC . 874D FC xchg dword ptr ss:[ebp-4],ecx
008BE1DF . 53 push ebx
008BE1E0 . 894D F4 mov dword ptr ss:[ebp-C],ecx
008BE1E3 . 8955 F8 mov dword ptr ss:[ebp-8],edx
008BE1E6 . 8945 FC mov dword ptr ss:[ebp-4],eax
008BE1E9 . 33C0 xor eax,eax
008BE1EB . 55 push ebp
008BE1EC . 68 80E68B00 push x.008BE680
008BE1F1 . 64:FF30 push dword ptr fs:[eax]
008BE1F4 . 64:8920 mov dword ptr fs:[eax],esp
008BE1F7 . 8B45 FC mov eax,dword ptr ss:[ebp-4]
008BE1FA . 8B80 04030000 mov eax,dword ptr ds:[eax+304]
008BE200 . 8078 40 00 cmp byte ptr ds:[eax+40],0
008BE204 . 75 0A jnz short x.008BE210
008BE206 . E8 D53EB5FF call x.004120E0
008BE20B . E9 48040000 jmp x.008BE658
008BE210 > A1 34F18E00 mov eax,dword ptr ds:[8EF134]
008BE215 . 8B00 mov eax,dword ptr ds:[eax]
008BE217 . E8 104CC3FF call x.004F2E2C
008BE21C . A0 087E8F00 mov al,byte ptr ds:[8F7E08]
008BE221 . 0A05 6C8E8F00 or al,byte ptr ds:[8F8E6C]
008BE227 . 0F85 2B040000 jnz x.008BE658
008BE22D . 803D 6D8E8F00 >cmp byte ptr ds:[8F8E6D],0
008BE234 . 0F85 1E040000 jnz x.008BE658
008BE23A . C605 087E8F00 >mov byte ptr ds:[8F7E08],1
008BE241 . 33C0 xor eax,eax
008BE243 . 55 push ebp
008BE244 . 68 51E68B00 push x.008BE651
008BE249 . 64:FF30 push dword ptr fs:[eax]
008BE24C . 64:8920 mov dword ptr fs:[eax],esp
008BE24F . 8D4D E0 lea ecx,dword ptr ss:[ebp-20]
008BE252 . 33D2 xor edx,edx
008BE254 . B8 98E68B00 mov eax,x.008BE698 ; ASCII "MachineId"
008BE259 . E8 165CFBFF call x.00873E74
008BE25E . 8B45 E0 mov eax,dword ptr ss:[ebp-20] ; 取注册ID编号 VMQRYUVT-JNPLVZYDK
008BE261 . 8D4D E4 lea ecx,dword ptr ss:[ebp-1C]
008BE264 . 33D2 xor edx,edx
008BE266 . E8 095CFBFF call x.00873E74 ; 取假序列号 78787878787878787878787
008BE26B . 837D E4 00 cmp dword ptr ss:[ebp-1C],0 ; 是否为空
008BE26F . 0F84 39010000 je x.008BE3AE
008BE275 . 8D45 DC lea eax,dword ptr ss:[ebp-24]
008BE278 . 50 push eax
008BE279 . 8D4D D4 lea ecx,dword ptr ss:[ebp-2C]
008BE27C . 33D2 xor edx,edx
008BE27E . B8 ACE68B00 mov eax,x.008BE6AC ; ASCII "MachineID"
008BE283 . E8 EC5BFBFF call x.00873E74
008BE288 . 8D45 D4 lea eax,dword ptr ss:[ebp-2C]
008BE28B . 50 push eax
008BE28C . 8D4D CC lea ecx,dword ptr ss:[ebp-34]
008BE28F . 8B15 0CF18E00 mov edx,dword ptr ds:[8EF10C] ; x.008F7C38
008BE295 . 8B12 mov edx,dword ptr ds:[edx] ; 取用户姓名 snake
008BE297 . B8 C0E68B00 mov eax,x.008BE6C0 ; ASCII "RealName"
008BE29C . E8 D35BFBFF call x.00873E74 ; 小写字母转大写字母call
008BE2A1 . 8B45 CC mov eax,dword ptr ss:[ebp-34] ; eax="SNAKE"
008BE2A4 . 8D55 D0 lea edx,dword ptr ss:[ebp-30]
008BE2A7 . E8 5C1DFBFF call x.00870008
008BE2AC . 8B55 D0 mov edx,dword ptr ss:[ebp-30]
008BE2AF . 58 pop eax
008BE2B0 . E8 FB72B4FF call x.004055B0 ; 字符串连接call
008BE2B5 . 8B45 D4 mov eax,dword ptr ss:[ebp-2C] ; eax="VMQRYUVT-JNPLVZYDKSNAKE"
008BE2B8 . 8D55 D8 lea edx,dword ptr ss:[ebp-28]
008BE2BB . E8 A0010100 call x.008CE460 ; 算法call,F7跟进
008BE2C0 . 8B45 D8 mov eax,dword ptr ss:[ebp-28] ; ★eax="D8TXQ-DCZTE-CDKXZ-WQMGF" 真序列号
008BE2C3 . B9 0D000000 mov ecx,0D
008BE2C8 . BA 01000000 mov edx,1
008BE2CD . E8 3675B4FF call x.00405808
008BE2D2 . 8B45 DC mov eax,dword ptr ss:[ebp-24]
008BE2D5 . 50 push eax
008BE2D6 . 8D45 C8 lea eax,dword ptr ss:[ebp-38]
008BE2D9 . 50 push eax
008BE2DA . 8D4D C0 lea ecx,dword ptr ss:[ebp-40]
008BE2DD . 33D2 xor edx,edx
008BE2DF . B8 98E68B00 mov eax,x.008BE698 ; ASCII "MachineId"
008BE2E4 . E8 8B5BFBFF call x.00873E74
008BE2E9 . 8B45 C0 mov eax,dword ptr ss:[ebp-40]
008BE2EC . 8D4D C4 lea ecx,dword ptr ss:[ebp-3C]
008BE2EF . 33D2 xor edx,edx
008BE2F1 . E8 7E5BFBFF call x.00873E74
008BE2F6 . 8B45 C4 mov eax,dword ptr ss:[ebp-3C]
008BE2F9 . B9 0D000000 mov ecx,0D
008BE2FE . BA 01000000 mov edx,1
008BE303 . E8 0075B4FF call x.00405808
008BE308 . 8B55 C8 mov edx,dword ptr ss:[ebp-38]
008BE30B . 58 pop eax
008BE30C . E8 E373B4FF call x.004056F4
008BE311 . 0F84 97000000 je x.008BE3AE ; ★★关键跳转,跳则为正式版,爆破点
008BE317 . 8B15 0CF18E00 mov edx,dword ptr ds:[8EF10C] ; x.008F7C38
008BE31D . 8B12 mov edx,dword ptr ds:[edx]
008BE31F . 8D45 BC lea eax,dword ptr ss:[ebp-44]
008BE322 . B9 D4E68B00 mov ecx,x.008BE6D4 ; ASCII "LastFunc"
008BE327 . E8 C872B4FF call x.004055F4
008BE32C . 8B45 BC mov eax,dword ptr ss:[ebp-44]
008BE32F . B1 01 mov cl,1
008BE331 . 33D2 xor edx,edx
008BE333 . E8 9454FBFF call x.008737CC
008BE338 . A1 34F18E00 mov eax,dword ptr ds:[8EF134]
008BE33D . 8B00 mov eax,dword ptr ds:[eax]
008BE33F . E8 E84AC3FF call x.004F2E2C
008BE344 . 8B15 0CF18E00 mov edx,dword ptr ds:[8EF10C] ; x.008F7C38
008BE34A . 8B12 mov edx,dword ptr ds:[edx]
008BE34C . 8D45 B8 lea eax,dword ptr ss:[ebp-48]
......
========================= 跟进 008BE2BB E8 A0010100 call x.008CE460 =========================
008CE460 /$ 55 push ebp
008CE461 |. 8BEC mov ebp,esp
008CE463 |. B9 12000000 mov ecx,12
008CE468 |> 6A 00 /push 0
008CE46A |. 6A 00 |push 0
008CE46C |. 49 |dec ecx
008CE46D |.^ 75 F9 \jnz short x.008CE468
008CE46F |. 8955 F8 mov [local.2],edx
008CE472 |. 8945 FC mov [local.1],eax
008CE475 |. 8B45 FC mov eax,[local.1]
008CE478 |. E8 1B73B3FF call x.00405798
008CE47D |. 33C0 xor eax,eax
008CE47F |. 55 push ebp
008CE480 |. 68 E5E88C00 push x.008CE8E5
008CE485 |. 64:FF30 push dword ptr fs:[eax]
008CE488 |. 64:8920 mov dword ptr fs:[eax],esp
008CE48B |. EB 26 jmp short x.008CE4B3
008CE48D |> FF75 FC /push [local.1]
008CE490 |. 8B45 FC |mov eax,[local.1]
008CE493 |. E8 1071B3FF |call x.004055A8
008CE498 |. 8D55 D8 |lea edx,[local.10]
008CE49B |. E8 B8D5B3FF |call x.0040BA58
008CE4A0 |. FF75 D8 |push [local.10]
008CE4A3 |. FF75 FC |push [local.1]
008CE4A6 |. 8D45 FC |lea eax,[local.1]
008CE4A9 |. BA 03000000 |mov edx,3
008CE4AE |. E8 B571B3FF |call x.00405668
008CE4B3 |> 8B45 FC mov eax,[local.1] ; eax="VMQRYUVT-JNPLVZYDKSNAKE"
008CE4B6 |. E8 ED70B3FF |call x.004055A8 ; 计算长度call
008CE4BB |. 83F8 08 |cmp eax,8
008CE4BE |.^ 7C CD \jl short x.008CE48D
008CE4C0 |. 8D45 E8 lea eax,[local.6]
008CE4C3 |. BA F8E88C00 mov edx,x.008CE8F8 ; ASCII "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
008CE4C8 |. E8 876EB3FF call x.00405354
008CE4CD |. 8D45 E4 lea eax,[local.7]
008CE4D0 |. BA 40E98C00 mov edx,x.008CE940 ; ASCII "GHghuct28C1F67DXvwfjxn34py5eJKYE9AstuZaLklmMPQBRSUVWdzeNOboqrT"
008CE4D5 |. E8 7A6EB3FF call x.00405354
008CE4DA |. 8D45 E4 lea eax,[local.7]
008CE4DD |. BA 88E98C00 mov edx,x.008CE988 ; ASCII "dzestuvhuct28DKZaLklmMNORSUVXYE9APQBJWboqrTwfjxn34py5eC1F67GHg"
008CE4E2 |. E8 6D6EB3FF call x.00405354
008CE4E7 |. 8D45 E4 lea eax,[local.7]
008CE4EA |. BA D0E98C00 mov edx,x.008CE9D0 ; ASCII "LklmMNORSUVWboE9APQBdzestuvwfjxqrTC1F67GHghuct28Dn34py5eJKZaXY"
008CE4EF |. E8 606EB3FF call x.00405354
008CE4F4 |. 8D45 E4 lea eax,[local.7]
008CE4F7 |. BA 18EA8C00 mov edx,x.008CEA18 ; ASCII "XYE9APQBdzestu34py5eJKZaLkv1F67GHghuwfjxnlmMNORSUVWboqrTCct28D"
008CE4FC |. E8 536EB3FF call x.00405354
008CE501 |. 8D45 E0 lea eax,[local.8]
008CE504 |. BA 60EA8C00 mov edx,x.008CEA60 ; ASCII "!1F67@Hgh#c0$8DX5E9%PQB^zes+uvw)jx?04py5}JKZaP{lmMNO|SU\Wbo(rT"
008CE509 |. E8 466EB3FF call x.00405354
008CE50E |. A0 A0EA8C00 mov al,byte ptr ds:[8CEAA0]
008CE513 |. 50 push eax
008CE514 |. 8D45 D4 lea eax,[local.11]
008CE517 |. 50 push eax
008CE518 |. 33C9 xor ecx,ecx
008CE51A |. BA ACEA8C00 mov edx,x.008CEAAC
008CE51F |. 8B45 FC mov eax,[local.1]
008CE522 |. E8 C54CB4FF call x.004131EC ; 去掉连接符'-'call
008CE527 |. 8B55 D4 mov edx,[local.11] ; edx="VMQRYUVTJNPLVZYDKSNAKE"
008CE52A |. 8D45 FC lea eax,[local.1]
008CE52D |. E8 226EB3FF call x.00405354
008CE532 |. 8D45 EC lea eax,[local.5]
008CE535 |. E8 826DB3FF call x.004052BC
008CE53A |. 8B45 FC mov eax,[local.1] ; eax="VMQRYUVTJNPLVZYDKSNAKE"
008CE53D |. E8 6670B3FF call x.004055A8 ; 计算长度call
008CE542 |. 85C0 test eax,eax ; eax=16
008CE544 |. 7E 4D jle short x.008CE593
008CE546 |. 8945 DC mov [local.9],eax ; [12FAFC]=16,做计数器
008CE549 |. C745 F4 010000>mov [local.3],1 ; [12FB14]=1
008CE550 |> 8D45 D0 /lea eax,[local.12] ; eax=12FAF0
008CE553 |. 50 |push eax
008CE554 |. 8D45 CC |lea eax,[local.13] ; eax=12FAFC
008CE557 |. 8B55 FC |mov edx,[local.1] ; edx="VMQRYUVTJNPLVZYDKSNAKE"
008CE55A |. 8B4D F4 |mov ecx,[local.3] ; ecx=1
008CE55D |. 8A540A FF |mov dl,byte ptr ds:[edx+ecx-1] ; dl='V'
008CE561 |. E8 3E6FB3FF |call x.004054A4 ; 转存字符
008CE566 |. 8B45 CC |mov eax,[local.13] ; eax='V'
008CE569 |. 8B55 E4 |mov edx,[local.7] ; edx="XYE9APQBdzestu34py5eJKZaLkv1F67GHghuwfjxnlmMNORSUVWboqrTCct28D"
008CE56C |. E8 7B73B3FF |call x.004058EC ; 计算eax中字符在edx字符串中的位置序号call
008CE571 |. 8BD0 |mov edx,eax ; edx=32
008CE573 |. B9 01000000 |mov ecx,1 ; ecx=1
008CE578 |. 8B45 E8 |mov eax,[local.6] ; eax="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
008CE57B |. E8 8872B3FF |call x.00405808 ; 取eax字符串中位置为edx-ecx处的字符call
008CE580 |. 8B55 D0 |mov edx,[local.12] ; 取得的新字符
008CE583 |. 8D45 EC |lea eax,[local.5] ; 存放新字符,最终组成新字符串
008CE586 |. E8 2570B3FF |call x.004055B0
008CE58B |. FF45 F4 |inc [local.3]
008CE58E |. FF4D DC |dec [local.9]
008CE591 |.^ 75 BD \jnz short x.008CE550
008CE593 |> 8D45 C8 lea eax,[local.14]
008CE596 |. 50 push eax
008CE597 |. B9 01000000 mov ecx,1
008CE59C |. BA 10000000 mov edx,10
008CE5A1 |. 8B45 EC mov eax,[local.5] ; eax="nh6k1mntKi5OnM1zLli4L2" 生成的字符串
008CE5A4 |. E8 5F72B3FF call x.00405808 ; 取子串call
008CE5A9 |. FF75 C8 push [local.14] ; "z"
008CE5AC |. 8D45 C4 lea eax,[local.15]
008CE5AF |. 50 push eax
008CE5B0 |. 8B45 EC mov eax,[local.5]
008CE5B3 |. E8 F06FB3FF call x.004055A8 ; 计算长度call
008CE5B8 |. 8BC8 mov ecx,eax
008CE5BA |. 83E9 12 sub ecx,12
008CE5BD |. BA 13000000 mov edx,13
008CE5C2 |. 8B45 EC mov eax,[local.5]
008CE5C5 |. E8 3E72B3FF call x.00405808
008CE5CA |. FF75 C4 push [local.15] ; "i4L2"
008CE5CD |. 8D45 C0 lea eax,[local.16]
008CE5D0 |. 50 push eax
008CE5D1 |. B9 05000000 mov ecx,5
008CE5D6 |. BA 01000000 mov edx,1
008CE5DB |. 8B45 EC mov eax,[local.5]
008CE5DE |. E8 2572B3FF call x.00405808
008CE5E3 |. FF75 C0 push [local.16] ; "nh6k1"
008CE5E6 |. 8D45 BC lea eax,[local.17]
008CE5E9 |. 50 push eax
008CE5EA |. B9 01000000 mov ecx,1
008CE5EF |. BA 10000000 mov edx,10
008CE5F4 |. 8B45 EC mov eax,[local.5]
008CE5F7 |. E8 0C72B3FF call x.00405808
008CE5FC |. FF75 BC push [local.17] ; "z"
008CE5FF |. 8D45 B8 lea eax,[local.18]
008CE602 |. 50 push eax
008CE603 |. B9 05000000 mov ecx,5
008CE608 |. BA 06000000 mov edx,6
008CE60D |. 8B45 EC mov eax,[local.5]
008CE610 |. E8 F371B3FF call x.00405808
008CE615 |. FF75 B8 push [local.18] ; "mntKi"
008CE618 |. 8D45 B4 lea eax,[local.19]
008CE61B |. 50 push eax
008CE61C |. B9 01000000 mov ecx,1
008CE621 |. BA 11000000 mov edx,11
008CE626 |. 8B45 EC mov eax,[local.5]
008CE629 |. E8 DA71B3FF call x.00405808
008CE62E |. FF75 B4 push [local.19] ; "L"
008CE631 |. 8D45 B0 lea eax,[local.20]
008CE634 |. 50 push eax
008CE635 |. 8B45 EC mov eax,[local.5]
008CE638 |. E8 6B6FB3FF call x.004055A8
008CE63D |. 8BC8 mov ecx,eax
008CE63F |. 83E9 12 sub ecx,12
008CE642 |. BA 13000000 mov edx,13
008CE647 |. 8B45 EC mov eax,[local.5]
008CE64A |. E8 B971B3FF call x.00405808
008CE64F |. FF75 B0 push [local.20] ; "i4L2"
008CE652 |. 8D45 AC lea eax,[local.21]
008CE655 |. 50 push eax
008CE656 |. B9 05000000 mov ecx,5
008CE65B |. BA 0B000000 mov edx,0B
008CE660 |. 8B45 EC mov eax,[local.5]
008CE663 |. E8 A071B3FF call x.00405808
008CE668 |. FF75 AC push [local.21] ; "5OnM1"
008CE66B |. 8D45 A8 lea eax,[local.22]
008CE66E |. 50 push eax
008CE66F |. B9 01000000 mov ecx,1
008CE674 |. BA 11000000 mov edx,11
008CE679 |. 8B45 EC mov eax,[local.5]
008CE67C |. E8 8771B3FF call x.00405808
008CE681 |. FF75 A8 push [local.22] ; "L"
008CE684 |. 8D45 A4 lea eax,[local.23]
008CE687 |. 50 push eax
008CE688 |. B9 05000000 mov ecx,5
008CE68D |. BA 06000000 mov edx,6
008CE692 |. 8B45 EC mov eax,[local.5]
008CE695 |. E8 6E71B3FF call x.00405808
008CE69A |. FF75 A4 push [local.23] ; "mntKi"
008CE69D |. 8D45 A0 lea eax,[local.24]
008CE6A0 |. 50 push eax
008CE6A1 |. B9 05000000 mov ecx,5
008CE6A6 |. BA 06000000 mov edx,6
008CE6AB |. 8B45 EC mov eax,[local.5]
008CE6AE |. E8 5571B3FF call x.00405808
008CE6B3 |. FF75 A0 push [local.24] ; "mntKi"
008CE6B6 |. 8D45 9C lea eax,[local.25]
008CE6B9 |. 50 push eax
008CE6BA |. B9 01000000 mov ecx,1
008CE6BF |. BA 11000000 mov edx,11
008CE6C4 |. 8B45 EC mov eax,[local.5]
008CE6C7 |. E8 3C71B3FF call x.00405808
008CE6CC |. FF75 9C push [local.25] ; "L"
008CE6CF |. 8D45 98 lea eax,[local.26]
008CE6D2 |. 50 push eax
008CE6D3 |. 8B45 EC mov eax,[local.5]
008CE6D6 |. E8 CD6EB3FF call x.004055A8
008CE6DB |. 8BC8 mov ecx,eax
008CE6DD |. 83E9 12 sub ecx,12
008CE6E0 |. BA 13000000 mov edx,13
008CE6E5 |. 8B45 EC mov eax,[local.5]
008CE6E8 |. E8 1B71B3FF call x.00405808
008CE6ED |. FF75 98 push [local.26] ; "i4L2"
008CE6F0 |. 8D45 94 lea eax,[local.27]
008CE6F3 |. 50 push eax
008CE6F4 |. B9 05000000 mov ecx,5
008CE6F9 |. BA 0B000000 mov edx,0B
008CE6FE |. 8B45 EC mov eax,[local.5]
008CE701 |. E8 0271B3FF call x.00405808
008CE706 |. FF75 94 push [local.27] ; "5OnM1"
008CE709 |. 8D45 90 lea eax,[local.28]
008CE70C |. 50 push eax
008CE70D |. B9 01000000 mov ecx,1
008CE712 |. BA 11000000 mov edx,11
008CE717 |. 8B45 EC mov eax,[local.5]
008CE71A |. E8 E970B3FF call x.00405808
008CE71F |. FF75 90 push [local.28] ; "L"
008CE722 |. 8D45 8C lea eax,[local.29]
008CE725 |. 50 push eax
008CE726 |. B9 05000000 mov ecx,5
008CE72B |. BA 06000000 mov edx,6
008CE730 |. 8B45 EC mov eax,[local.5]
008CE733 |. E8 D070B3FF call x.00405808
008CE738 |. FF75 8C push [local.29] ; "mntKi"
008CE73B |. 8D45 88 lea eax,[local.30]
008CE73E |. 50 push eax
008CE73F |. B9 01000000 mov ecx,1
008CE744 |. BA 12000000 mov edx,12
008CE749 |. 8B45 EC mov eax,[local.5]
008CE74C |. E8 B770B3FF call x.00405808
008CE751 |. FF75 88 push [local.30] ; "l"
008CE754 |. 8D45 84 lea eax,[local.31]
008CE757 |. 50 push eax
008CE758 |. 8B45 EC mov eax,[local.5]
008CE75B |. E8 486EB3FF call x.004055A8
008CE760 |. 8BC8 mov ecx,eax
008CE762 |. 83E9 12 sub ecx,12
008CE765 |. BA 13000000 mov edx,13
008CE76A |. 8B45 EC mov eax,[local.5]
008CE76D |. E8 9670B3FF call x.00405808
008CE772 |. FF75 84 push [local.31] ; "i4L2"
008CE775 |. 8D45 FC lea eax,[local.1]
008CE778 |. BA 12000000 mov edx,12
008CE77D |. E8 E66EB3FF call x.00405668
008CE782 |. 33C0 xor eax,eax
008CE784 |. 8945 F0 mov [local.4],eax
008CE787 |. 8D45 EC lea eax,[local.5]
008CE78A |. E8 2D6BB3FF call x.004052BC ; 连接字符串call,把子串连成新字符串
008CE78F |. 8B45 FC mov eax,[local.1] ; eax="zi4L2nh6k1zmntKiLi4L25OnM1LmntKimntKiLi4L25OnM1LmntKili4L2"
008CE792 |. E8 116EB3FF call x.004055A8 ; 计算字符串的长度
008CE797 |. 85C0 test eax,eax ; eax=3A
008CE799 |. 7E 55 jle short x.008CE7F0
008CE79B |. 8945 DC mov [local.9],eax ; 计数器
008CE79E |. C745 F4 010000>mov [local.3],1
008CE7A5 |> 8B45 FC /mov eax,[local.1] ; eax=新字符串
008CE7A8 |. 8B55 F4 |mov edx,[local.3] ; edx递增
008CE7AB |. 0FB64410 FF |movzx eax,byte ptr ds:[eax+edx-1] ; 依次取串中的每个字符
008CE7B0 |. 0145 F0 |add [local.4],eax ; 累加
008CE7B3 |. 8D45 80 |lea eax,[local.32]
008CE7B6 |. 50 |push eax
008CE7B7 |. 8B45 F0 |mov eax,[local.4]
008CE7BA |. B9 3E000000 |mov ecx,3E
008CE7BF |. 99 |cdq
008CE7C0 |. F7F9 |idiv ecx
008CE7C2 |. 42 |inc edx
008CE7C3 |. B9 01000000 |mov ecx,1
008CE7C8 |. 8B45 E4 |mov eax,[local.7] ; eax="XYE9APQBdzestu34py5eJKZaLkv1F67GHghuwfjxnlmMNORSUVWboqrTCct28D"
008CE7CB |. E8 3870B3FF |call x.00405808 ; 在eax字符串中的edx位置处取ecx个字符
008CE7D0 |. 8B55 80 |mov edx,[local.32]
008CE7D3 |. 8D45 EC |lea eax,[local.5]
008CE7D6 |. E8 D56DB3FF |call x.004055B0
008CE7DB |. FF45 F4 |inc [local.3]
008CE7DE |. FF4D DC |dec [local.9]
008CE7E1 |.^ 75 C2 \jnz short x.008CE7A5
008CE7E3 |. EB 0B jmp short x.008CE7F0
008CE7E5 |> 8D45 EC /lea eax,[local.5]
008CE7E8 |. 8B55 EC |mov edx,[local.5]
008CE7EB |. E8 C06DB3FF |call x.004055B0
008CE7F0 |> 8B45 EC mov eax,[local.5] ; eax=新字符串"8lGOgeDqwaKQrR2nrukx15uKwafZdXuCl1eHu1d8tXqdCztecMuU6uCR8U"
008CE7F3 |. E8 B06DB3FF |call x.004055A8
008CE7F8 |. 83F8 14 |cmp eax,14
008CE7FB |.^ 7C E8 \jl short x.008CE7E5
008CE7FD |. 8B45 EC mov eax,[local.5]
008CE800 |. E8 A36DB3FF call x.004055A8
008CE805 |. 83F8 0A cmp eax,0A
008CE808 |. 7E 1E jle short x.008CE828
008CE80A |. 8D45 EC lea eax,[local.5]
008CE80D |. 50 push eax
008CE80E |. 8B45 EC mov eax,[local.5] ; 新生成的字符串
008CE811 |. E8 926DB3FF call x.004055A8 ; 字符串长度call
008CE816 |. 8BD0 mov edx,eax ; 字符串长为3A
008CE818 |. 83EA 13 sub edx,13
008CE81B |. B9 0B000000 mov ecx,0B
008CE820 |. 8B45 EC mov eax,[local.5] ; eax为新生成的字符串
008CE823 |. E8 E06FB3FF call x.00405808 ; 取子字符串call
008CE828 |> 8D85 78FFFFFF lea eax,[local.34] ; "d8tXqdCztec"
008CE82E |. 50 push eax
008CE82F |. B9 05000000 mov ecx,5
008CE834 |. BA 01000000 mov edx,1
008CE839 |. 8B45 EC mov eax,[local.5] ; eax="d8tXqdCztec"
008CE83C |. E8 C76FB3FF call x.00405808
008CE841 |. FFB5 78FFFFFF push [local.34] ; "d8tXq"
008CE847 |. 68 ACEA8C00 push x.008CEAAC
008CE84C |. 8D85 74FFFFFF lea eax,[local.35]
008CE852 |. 50 push eax
008CE853 |. B9 05000000 mov ecx,5
008CE858 |. BA 06000000 mov edx,6
008CE85D |. 8B45 EC mov eax,[local.5]
008CE860 |. E8 A36FB3FF call x.00405808
008CE865 |. FFB5 74FFFFFF push [local.35] ; "dCzte"
008CE86B |. 68 ACEA8C00 push x.008CEAAC
008CE870 |. 8D85 70FFFFFF lea eax,[local.36]
008CE876 |. 50 push eax
008CE877 |. B9 01000000 mov ecx,1
008CE87C |. BA 0B000000 mov edx,0B
008CE881 |. 8B45 EC mov eax,[local.5]
008CE884 |. E8 7F6FB3FF call x.00405808
008CE889 |. FFB5 70FFFFFF push [local.36] ; "c"
008CE88F |. 68 B8EA8C00 push x.008CEAB8 ; ASCII "DKXZ-WQMGF"
008CE894 |. 8D85 7CFFFFFF lea eax,[local.33]
008CE89A |. BA 06000000 mov edx,6
008CE89F |. E8 C46DB3FF call x.00405668 ; 字符串连接call
008CE8A4 |. 8B85 7CFFFFFF mov eax,[local.33] ; eax="d8tXq-dCzte-cDKXZ-WQMGF"
008CE8AA |. 8B55 F8 mov edx,[local.2]
008CE8AD |. E8 F6C4B3FF call x.0040ADA8 ; 转换成大写字母
008CE8B2 |. 33C0 xor eax,eax
008CE8B4 |. 5A pop edx
008CE8B5 |. 59 pop ecx
008CE8B6 |. 59 pop ecx
008CE8B7 |. 64:8910 mov dword ptr fs:[eax],edx
008CE8BA |. 68 ECE88C00 push x.008CE8EC
008CE8BF |> 8D85 70FFFFFF lea eax,[local.36]
008CE8C5 |. BA 1B000000 mov edx,1B
008CE8CA |. E8 116AB3FF call x.004052E0
008CE8CF |. 8D45 E0 lea eax,[local.8]
008CE8D2 |. BA 04000000 mov edx,4
008CE8D7 |. E8 046AB3FF call x.004052E0
008CE8DC |. 8D45 FC lea eax,[local.1]
008CE8DF |. E8 D869B3FF call x.004052BC
008CE8E4 \. C3 retn
---------------------------------------------------------------------------------------------------------
【汇编注册机算法部分源码】
.data
szStr1 db 'XYE9APQBdzestu34py5eJKZaLkv1F67GHghuwfjxnlmMNORSUVWboqrTCct28D',0
szStr2 db '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',0
szStrCon db 'DKXZ-WQMGF',0
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;函数功能:从给定字符串中取指定位置和指定个数的子字符串函数
;函数参数:
; lpszStr: 指针,待取子串的字符串地址
; lpszSubStr: 指针,取得的子字符串的地址
; nPos: 取子串的位置
; nNum: 取子串的个数
;返回值:没有
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
StrMidBuffer proc lpszStr:DWORD,nPos:DWORD,nNum:DWORD,lpszSubStr:DWORD
pushad
mov esi,lpszStr
mov edi,lpszSubStr
invoke lstrlen,esi
mov ebx,eax
mov ecx,nNum
mov edx,nPos
dec edx
sub ebx,edx
add edx,lpszStr
mov esi,edx
rep movs BYTE ptr es:[edi],BYTE ptr ds:[esi]
mov BYTE ptr [edi+ecx],0
popad
ret
StrMidBuffer endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
GetRegKey proc hDlg:DWORD
local szRegName[32]:BYTE,szRegNum[64]:BYTE,szRegID[64]:BYTE
local nLen1:DWORD,nLen2:DWORD,szTmp1[80]:BYTE,szTmp2[80]:BYTE,szTmp3[32]:BYTE
pushad
invoke GetDlgItemText,hDlg,IDC_NAME,addr szRegName,sizeof szRegName ;取用户姓名
.if !eax
invoke SetDlgItemText,hDlg,IDC_REG,addr szTextErr1
.else
invoke GetDlgItemText,hDlg,IDC_ID,addr szRegID,sizeof szRegID ;取注册ID编号
.if !eax
invoke SetDlgItemText,hDlg,IDC_REG,addr szTextErr2
.else
;-------------------------------------------------------------------------------------
; 将注册ID编号和用户姓名连接起来、转换为大写并去掉'-'字符
;-------------------------------------------------------------------------------------
invoke lstrlen,addr szRegName
invoke CharUpperBuff,addr szRegName,eax
invoke lstrcat,addr szRegID,addr szRegName
invoke lstrlen,addr szRegID
mov nLen1,eax
mov ecx,eax
xor ebx,ebx
xor edx,edx
@1:
mov al,BYTE ptr [szRegID+edx]
inc edx
dec ecx
cmp al,2dh
je @1
mov BYTE ptr [szTmp1+ebx],al
inc ebx
cmp al,0
jnz @1
;---------------------------------------------------------------------------------------
; 在给定字符串中循环取相应的字符并组成新字符串1
;---------------------------------------------------------------------------------------
invoke lstrlen,addr szStr1
mov nLen2,eax
mov ecx,nLen1
xor edx,edx
xor esi,esi
@2:
push ecx
mov ecx,nLen2
mov al,BYTE ptr [szTmp1+edx]
lea edi,szStr1
repne scas BYTE ptr es:[edi]
mov ebx,nLen2
sub ebx,ecx
dec ebx
mov al,BYTE ptr [szStr2+ebx]
mov BYTE ptr [szTmp2+esi],al
inc edx
inc esi
pop ecx
dec ecx
jnz @2
mov BYTE ptr [szTmp2+esi-1],0
;--------------------------------------------------------------------------------------
; 在新字符串1中取相应的子字符串并连接成新字符串2
;--------------------------------------------------------------------------------------
invoke lstrlen,addr szTmp2
mov nLen1,eax
invoke RtlZeroMemory, addr szTmp1, sizeof szTmp1
invoke StrMidBuffer,addr szTmp2,10h,1,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
mov ecx,nLen1
sub ecx,12h
invoke StrMidBuffer,addr szTmp2,13h,ecx,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
invoke StrMidBuffer,addr szTmp2,1,5,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
invoke StrMidBuffer,addr szTmp2,10h,1,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
invoke StrMidBuffer,addr szTmp2,6,5,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
invoke StrMidBuffer,addr szTmp2,11h,1,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
mov ecx,nLen1
sub ecx,12h
invoke StrMidBuffer,addr szTmp2,13h,ecx,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
invoke StrMidBuffer,addr szTmp2,0Bh,5,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
invoke StrMidBuffer,addr szTmp2,11h,1,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
invoke StrMidBuffer,addr szTmp2,6,5,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
invoke StrMidBuffer,addr szTmp2,6,5,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
invoke StrMidBuffer,addr szTmp2,11h,1,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
mov ecx,nLen1
sub ecx,12h
invoke StrMidBuffer,addr szTmp2,13h,ecx,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
invoke StrMidBuffer,addr szTmp2,0Bh,5,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
invoke StrMidBuffer,addr szTmp2,11h,1,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
invoke StrMidBuffer,addr szTmp2,6,5,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
invoke StrMidBuffer,addr szTmp2,12h,1,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
mov ecx,nLen1
sub ecx,12h
invoke StrMidBuffer,addr szTmp2,13h,ecx,addr szTmp3
invoke lstrcat,addr szTmp1,addr szTmp3
;------------------------------------------------------------------------------------------
; 在新字符串2中循环取相应的字符组成新字符串3
;------------------------------------------------------------------------------------------
invoke RtlZeroMemory, addr szTmp2, sizeof szTmp2
invoke lstrlen,addr szTmp1
mov nLen1,eax
mov ecx,eax
xor edi,edi
xor edx,edx
xor esi,esi
@3:
movzx ebx,BYTE ptr [szTmp1+esi]
add edi,ebx
mov eax,edi
push ecx
mov ecx,3eh
cdq
idiv ecx
mov bl,BYTE ptr [szStr1+edx]
mov BYTE ptr [szTmp2+esi],bl
pop ecx
inc esi
dec ecx
jnz @3
;--------------------------------------------------------------------------------------------
; 在新字符串3中取相应的了字符串与固定字符串连接并转换成大写生成序列号
;--------------------------------------------------------------------------------------------
invoke RtlZeroMemory, addr szRegNum, sizeof szRegNum
mov edx,nLen1
sub edx,13h
mov ecx,0Bh
invoke StrMidBuffer,addr szTmp2,edx,ecx,addr szTmp1
invoke CharUpperBuff,addr szTmp1,ecx
invoke StrMidBuffer,addr szTmp1,1,5,addr szTmp3
invoke lstrcat,addr szRegNum,addr szTmp3
mov BYTE ptr [szRegNum+5],2dh
invoke StrMidBuffer,addr szTmp1,6,5,addr szTmp3
invoke lstrcat,addr szRegNum,addr szTmp3
mov BYTE ptr [szRegNum+11],2dh
invoke StrMidBuffer,addr szTmp1,0Bh,1,addr szTmp3
invoke lstrcat,addr szRegNum,addr szTmp3
invoke lstrcat,addr szRegNum,addr szStrCon
invoke SetDlgItemText,hDlg,IDC_REG,addr szRegNum
.endif
.endif
popad
ret
GetRegKey endp
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
---------------------------------------------------------------------------------------------------------
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)