九层楼 发表于 2017-10-12 16:05:53

Atlantis Word Processor 3.1.0

本帖最后由 九层楼 于 2017-10-12 16:04 编辑

Atlantis Word Processor 是PYG54 教学中的练习软件, 近日更新到了 3.1.0. 因为教学中老师已经进行过详细的分析, 所以试试新版本.

使用 x64dbg 加载, 尝试注册, 查找字符串, 就可以看到以下代码等等.

004995E0 | 55                     | push ebp                              |
004995E1 | 8B EC                  | mov ebp,esp                           |
004995E3 | 83 C4 F0               | add esp,FFFFFFF0                        |
004995E6 | 53                     | push ebx                              |
004995E7 | 56                     | push esi                              |
004995E8 | 33 C9                  | xor ecx,ecx                           |
004995EA | 89 4D F4               | mov dword ptr ss:,ecx            | 0
004995ED | 89 4D F0               | mov dword ptr ss:,ecx         | 0
004995F0 | 89 55 F8               | mov dword ptr ss:,edx            | code
004995F3 | 89 45 FC               | mov dword ptr ss:,eax            | name
004995F6 | 8D 45 FC               | lea eax,dword ptr ss:            |
004995F9 | E8 9E A8 F6 FF         | call <awp.str copy ?>                   |
004995FE | 8B 45 F8               | mov eax,dword ptr ss:            |
00499601 | E8 F2 A0 F6 FF         | call awp.4036F8                         | ??
00499606 | 33 C0                  | xor eax,eax                           |
00499608 | 55                     | push ebp                              |
00499609 | 68 B9 96 49 00         | push awp.4996B9                         |
0049960E | 64 FF 30               | push dword ptr fs:               |
00499611 | 64 89 20               | mov dword ptr fs:,esp            |
00499614 | 33 DB                  | xor ebx,ebx                           |
00499616 | 8D 45 F4               | lea eax,dword ptr ss:            |
00499619 | 50                     | push eax                              |
0049961A | 8D 55 F0               | lea edx,dword ptr ss:         |
0049961D | 8B 45 F8               | mov eax,dword ptr ss:            |
00499620 | E8 13 1D F7 FF         | call <awp.UpperCase>                  |
00499625 | 8B 45 F0               | mov eax,dword ptr ss:         |
00499628 | B1 30                  | mov cl,30                               | 30:'0'
0049962A | B2 4F                  | mov dl,4F                               | 4F:'O'
0049962C | E8 F7 3C 17 00         | call <awp.replace O with 0>             |
00499631 | 8B 55 F4               | mov edx,dword ptr ss:            |
00499634 | 8D 45 F8               | lea eax,dword ptr ss:            |
00499637 | E8 14 9D F6 FF         | call <awp.str copy>                     |
0049963C | 8B 45 F8               | mov eax,dword ptr ss:            |
0049963F | E8 00 9F F6 FF         | call <awp.str length>                   |
00499644 | 8B F0                  | mov esi,eax                           |
00499646 | 83 FE 01               | cmp esi,1                               |
00499649 | 7C 32                  | jl awp.49967D                           |
0049964B | 8B 45 F8               | mov eax,dword ptr ss:            |
0049964E | 8A 44 30 FF            | mov al,byte ptr ds:          | 从后往前逐个取字符
00499652 | 8B D0                  | mov edx,eax                           |
00499654 | 80 EA 20               | sub dl,20                               |
00499657 | 74 05                  | je awp.49965E                           |
00499659 | 80 EA 0D               | sub dl,D                              |
0049965C | 75 11                  | jne awp.49966F                        |
0049965E | 8D 45 F8               | lea eax,dword ptr ss:            |
00499661 | B9 01 00 00 00         | mov ecx,1                               |
00499666 | 8B D6                  | mov edx,esi                           |
00499668 | E8 1B A1 F6 FF         | call awp.403788                         |
0049966D | EB 09                  | jmp awp.499678                        |
0049966F | 8B 55 F8               | mov edx,dword ptr ss:            | edx = = 注册码数据
00499672 | 04 D0                  | add al,D0                               | 字符 + 0xD0 (会溢出)
00499674 | 2C 0A                  | sub al,A                              | 字符 - 0xA
00499676 | 73 1E                  | jae awp.499696                        | 字符 + 0xD0 需要小于 0x10A, 即 字符 需要小于 0x3A (看来需要是数字)
00499678 | 4E                     | dec esi                                 |
00499679 | 85 F6                  | test esi,esi                            |
0049967B | 75 CE                  | jne awp.49964B                        | 循环16次
0049967D | 8D 55 F4               | lea edx,dword ptr ss:            |
00499680 | 8B 45 FC               | mov eax,dword ptr ss:            |
00499683 | E8 10 FE FF FF         | call awp.499498                         | 扩展并变形 注册码数据 ??
00499688 | 8B 55 F4               | mov edx,dword ptr ss:            |
0049968B | 8B 45 F8               | mov eax,dword ptr ss:            |
0049968E | E8 C1 9F F6 FF         | call <awp.str compare>                  |
00499693 | 0F 94 C3               | sete bl                                 |
00499696 | 33 C0                  | xor eax,eax                           |
00499698 | 5A                     | pop edx                                 |
00499699 | 59                     | pop ecx                                 |
0049969A | 59                     | pop ecx                                 |
0049969B | 64 89 10               | mov dword ptr fs:,edx            |
0049969E | 68 C0 96 49 00         | push awp.4996C0                         |
004996A3 | 8D 45 F0               | lea eax,dword ptr ss:         |
004996A6 | BA 03 00 00 00         | mov edx,3                               |
004996AB | E8 2C 9C F6 FF         | call awp.4032DC                         |
004996B0 | 8D 45 FC               | lea eax,dword ptr ss:            |
004996B3 | E8 38 A2 F6 FF         | call awp.4038F0                         |
004996B8 | C3                     | ret                                     |



00499498 | 55                     | push ebp                              |
00499499 | 8B EC                  | mov ebp,esp                           |
0049949B | 83 C4 84               | add esp,FFFFFF84                        |
0049949E | 53                     | push ebx                              |
0049949F | 56                     | push esi                              |
004994A0 | 57                     | push edi                              |
004994A1 | 33 C9                  | xor ecx,ecx                           |
004994A3 | 89 4D 84               | mov dword ptr ss:,ecx         | 0
004994A6 | 89 55 F8               | mov dword ptr ss:,edx            |
004994A9 | 89 45 FC               | mov dword ptr ss:,eax            | = eax = name
004994AC | 8D 45 FC               | lea eax,dword ptr ss:            |
004994AF | E8 E8 A9 F6 FF         | call <awp.str copy ?>                   | 复制了一份 ?
004994B4 | 33 C0                  | xor eax,eax                           |
004994B6 | 55                     | push ebp                              |
004994B7 | 68 D2 95 49 00         | push awp.4995D2                         |
004994BC | 64 FF 30               | push dword ptr fs:               |
004994BF | 64 89 20               | mov dword ptr fs:,esp            |
004994C2 | 8D 55 84               | lea edx,dword ptr ss:         | 0
004994C5 | 8B 45 FC               | mov eax,dword ptr ss:            |
004994C8 | E8 73 27 F7 FF         | call <awp.str copy, not str length>   | eax = 长度数值好像没用到 ?
004994CD | 8B 55 84               | mov edx,dword ptr ss:         |
004994D0 | 8D 45 FC               | lea eax,dword ptr ss:            |
004994D3 | E8 54 A4 F6 FF         | call <awp.Unique String ?>            |
004994D8 | 8B 45 FC               | mov eax,dword ptr ss:            |
004994DB | E8 FC A5 F6 FF         | call <awp.str length>                   |
004994E0 | 48                     | dec eax                                 | 长度-1, 为了测试
004994E1 | 89 45 F0               | mov dword ptr ss:,eax         |
004994E4 | 8B 45 FC               | mov eax,dword ptr ss:            |
004994E7 | E8 E0 A5 F6 FF         | call <awp.is str empty ?>               |
004994EC | 89 45 F4               | mov dword ptr ss:,eax            |
004994EF | 33 C0                  | xor eax,eax                           |
004994F1 | 89 45 EC               | mov dword ptr ss:,eax         | var_0x14 = 0, 计算累加值
004994F4 | 8B 75 F0               | mov esi,dword ptr ss:         | 长度-1
004994F7 | 85 F6                  | test esi,esi                            |
004994F9 | 7C 1E                  | jl awp.499519                           |
004994FB | 46                     | inc esi                                 | 长度+1,恢复长度值
004994FC | 33 DB                  | xor ebx,ebx                           |
004994FE | 8B 45 F4               | mov eax,dword ptr ss:            |
00499501 | 0F B7 0C 58            | movzx ecx,word ptr ds:       |
00499505 | 83 F9 20               | cmp ecx,20                              | 20:' '
00499508 | 7E 0B                  | jle awp.499515                        |
0049950A | 81 F9 80 00 00 00      | cmp ecx,80                              |
00499510 | 7D 03                  | jge awp.499515                        |
00499512 | 01 4D EC               | add dword ptr ss:,ecx         | 累加
00499515 | 43                     | inc ebx                                 |
00499516 | 4E                     | dec esi                                 |
00499517 | 75 E5                  | jne awp.4994FE                        |
00499519 | 8B 45 EC               | mov eax,dword ptr ss:         | 各个unicode字符的"unicode值"累加起来
0049951C | B9 32 00 00 00         | mov ecx,32                              | 除以 0x32
00499521 | 99                     | cdq                                     |
00499522 | F7 F9                  | idiv ecx                              | eax = 商, edx = 余数
00499524 | 8D 04 92               | lea eax,dword ptr ds:      |
00499527 | 8D 04 80               | lea eax,dword ptr ds:      |
0049952A | 89 45 EC               | mov dword ptr ss:,eax         | 余数 * 5 * 5
0049952D | 33 DB                  | xor ebx,ebx                           | i = 0
0049952F | 8D 45 88               | lea eax,dword ptr ss:         |
00499532 | 8B 55 EC               | mov edx,dword ptr ss:         |
00499535 | 03 D3                  | add edx,ebx                           |
00499537 | 8B 14 95 98 7C 64 00   | mov edx,dword ptr ds:   | 用 余数*5*5+i 查表, 所以最大索引的元素是 (0x31 * 5 * 5 + 0x18) * 4 + 0x647C98
0049953E | 89 10                  | mov dword ptr ds:,edx            | 存储于 var_0x78 开始的 DWORD 数组中
00499540 | 43                     | inc ebx                                 | i++
00499541 | 83 C0 04               | add eax,4                               | 下一个 DWORD 数组元素
00499544 | 83 FB 19               | cmp ebx,19                              | [0,0x19)
00499547 | 75 E9                  | jne awp.499532                        |
00499549 | 33 FF                  | xor edi,edi                           | edi = 0
0049954B | 8B 75 F0               | mov esi,dword ptr ss:         | 长度-1
0049954E | 85 F6                  | test esi,esi                            |
00499550 | 7C 2C                  | jl awp.49957E                           |
00499552 | 46                     | inc esi                                 | 恢复长度
00499553 | 33 DB                  | xor ebx,ebx                           | ebx = 0
00499555 | 8B 45 F4               | mov eax,dword ptr ss:            |
00499558 | 0F B7 0C 58            | movzx ecx,word ptr ds:       | ecx = 逐个unicode字符值
0049955C | 83 F9 20               | cmp ecx,20                              | 20:' '
0049955F | 7E 19                  | jle awp.49957A                        |
00499561 | 81 F9 80 00 00 00      | cmp ecx,80                              |
00499567 | 7D 11                  | jge awp.49957A                        |
00499569 | 8B C7                  | mov eax,edi                           | eax = edi = 0
0049956B | 51                     | push ecx                              |
0049956C | B9 19 00 00 00         | mov ecx,19                              |
00499571 | 99                     | cdq                                     |
00499572 | F7 F9                  | idiv ecx                              |
00499574 | 59                     | pop ecx                                 |
00499575 | 01 4C 95 88            | add dword ptr ss:,ecx   | 逐个加到 var_0x78 开始的 DWORD 数组元素上
00499579 | 47                     | inc edi                                 |
0049957A | 43                     | inc ebx                                 |
0049957B | 4E                     | dec esi                                 |
0049957C | 75 D7                  | jne awp.499555                        |
0049957E | 8B 45 F8               | mov eax,dword ptr ss:            |
00499581 | BA 19 00 00 00         | mov edx,19                              |
00499586 | E8 E9 A2 F6 FF         | call awp.403874                         | 复制了一份注册码, 只复制 0x19 个字符 ?
0049958B | 33 DB                  | xor ebx,ebx                           |
0049958D | 8D 75 88               | lea esi,dword ptr ss:         | 要开始查看 var_0x78 数组了
00499590 | 8B 45 F8               | mov eax,dword ptr ss:            | = [] = 注册码数据
00499593 | E8 7C A1 F6 FF         | call awp.403714                         | 释放字串 ?
00499598 | 03 C3                  | add eax,ebx                           |
0049959A | 50                     | push eax                              |
0049959B | 8B 06                  | mov eax,dword ptr ds:            | var_0x78 数组元素除以
0049959D | B9 0A 00 00 00         | mov ecx,A                               | 0xA
004995A2 | 99                     | cdq                                     |
004995A3 | F7 F9                  | idiv ecx                              |
004995A5 | 80 C2 30               | add dl,30                               | 余数 + 0x30
004995A8 | 58                     | pop eax                                 |
004995A9 | 88 10                  | mov byte ptr ds:,dl                | 存回注册码数据中, 好像这里只是需要了空间, 并没有需要注册码数据 ?
004995AB | 43                     | inc ebx                                 |
004995AC | 83 C6 04               | add esi,4                               |
004995AF | 83 FB 19               | cmp ebx,19                              |
004995B2 | 75 DC                  | jne awp.499590                        |
004995B4 | 33 C0                  | xor eax,eax                           |
004995B6 | 5A                     | pop edx                                 |
004995B7 | 59                     | pop ecx                                 |
004995B8 | 59                     | pop ecx                                 |
004995B9 | 64 89 10               | mov dword ptr fs:,edx            |
004995BC | 68 D9 95 49 00         | push awp.4995D9                         |
004995C1 | 8D 45 84               | lea eax,dword ptr ss:         |
004995C4 | E8 27 A3 F6 FF         | call awp.4038F0                         |
004995C9 | 8D 45 FC               | lea eax,dword ptr ss:            |
004995CC | E8 1F A3 F6 FF         | call awp.4038F0                         |
004995D1 | C3                     | ret                                     |
004995D2 | E9 55 98 F6 FF         | jmp awp.402E2C                        |
004995D7 | EB E8                  | jmp awp.4995C1                        |
004995D9 | 5F                     | pop edi                                 |
004995DA | 5E                     | pop esi                                 |
004995DB | 5B                     | pop ebx                                 |
004995DC | 8B E5                  | mov esp,ebp                           |
004995DE | 5D                     | pop ebp                                 |
004995DF | C3                     | ret                                     |

不破不立 发表于 2017-10-12 18:23:31

坐沙发学习
页: [1]
查看完整版本: Atlantis Word Processor 3.1.0