本帖最后由 cndml 于 2024-3-5 22:00 编辑
通过跟踪程序的运行可以证明:
1、 按教程里跟踪到这里以后,02395D12 地址下单字节硬件访问断点,
[Asm] 纯文本查看 复制代码 02395CE1 | 8B0D AC403C02 | mov ecx,dword ptr ds:[23C40AC] |
02395CE7 | 89040E | mov dword ptr ds:[esi+ecx],eax |
02395CEA | A1 AC403C02 | mov eax,dword ptr ds:[23C40AC] |
02395CEF | 391C06 | cmp dword ptr ds:[esi+eax],ebx |
02395CF2 | 75 16 | jne 2395D0A |
02395CF4 | 8D85 B4FEFFFF | lea eax,dword ptr ss:[ebp-14C] |
02395CFA | 50 | push eax |
02395CFB | FF15 BC623B02 | call dword ptr ds:[<&LoadLibraryA>] |
02395D01 | 8B0D AC403C02 | mov ecx,dword ptr ds:[23C40AC] |
02395D07 | 89040E | mov dword ptr ds:[esi+ecx],eax |
02395D0A | A1 AC403C02 | mov eax,dword ptr ds:[23C40AC] |
02395D0F | 391C06 | cmp dword ptr ds:[esi+eax],ebx |
02395D12 | 0F84 2F010000 | je 2395E47 |
02395D18 | 33C9 | xor ecx,ecx |
02395D1A | 8B07 | mov eax,dword ptr ds:[edi] |
2、第一次断在这里,执行到返回,会再次断下,发现此处是对代码进行了加密。
[Asm] 纯文本查看 复制代码 023813C2 | 8B12 | mov edx,dword ptr ds:[edx] |
023813C4 | 8955 E4 | mov dword ptr ss:[ebp-1C],edx |
023813C7 | 816D 08 4786C861 | sub dword ptr ss:[ebp+8],61C88647 |
023813CE | 8BF2 | mov esi,edx |
023813D0 | 8BFA | mov edi,edx |
023813D2 | C1EE 05 | shr esi,5 |
3、执行两次ret后,到达这里:注意看堆栈数据,经过测试,第一个参数是01,表示加密,00是解密。第二个参数是代码长度210h,第三个参数是起始地址,第四个参数是双字密钥。
[Asm] 纯文本查看 复制代码 02395E86 | A1 28C13B02 | mov eax,dword ptr ds:[23BC128] |
02395E8B | 8B0D F8003C02 | mov ecx,dword ptr ds:[23C00F8] |
02395E91 | 03C8 | add ecx,eax |
02395E93 | 51 | push ecx |
02395E94 | FF75 DC | push dword ptr ss:[ebp-24] |
02395E97 | E8 10B6FEFF | call 23814AC |
02395E9C | 83C4 10 | add esp,10 |
堆栈数据:
00189224 F5651CEC
00189228 02395C4C
0018922C 00000210
00189230 00000001
00189234 0018EAB4
00189238 B4BB6FC9
0018923C 00000000
4、f9继续运行,再次断在这里,这里位于text1段内,此段程序被多次执行,ret几次后,通过堆栈中的参数,会知道这是对代码进行计算后得到一个双字的密钥,并存储与堆栈中,密钥地址下断点执行。
[Asm] 纯文本查看 复制代码 004E809C | 33D2 | xor edx,edx |
004E809E | 8A11 | mov dl,byte ptr ds:[ecx] |
004E80A0 | 8B45 08 | mov eax,dword ptr ss:[ebp+8] |
004E80A3 | 33C2 | xor eax,edx |
004E80A5 | 25 FF000000 | and eax,FF |
004E80AA | 8B4D 08 | mov ecx,dword ptr ss:[ebp+8] |
004E80AD | C1E9 08 | shr ecx,8 |
5、执行后会断在这里:对比第三步,以及堆栈中的参数,会发现,这次是解密数据,密钥是iat加密那段代码被加密后计算得到的,证明完毕!
[Asm] 纯文本查看 复制代码 023A1A41 | 53 | push ebx |
023A1A42 | 03C8 | add ecx,eax | eax:&"u=繡*Hv="
023A1A44 | FF35 2CC33B02 | push dword ptr ds:[23BC32C] |
023A1A4A | 51 | push ecx |
023A1A4B | FF75 E0 | push dword ptr ss:[ebp-20] |
023A1A4E | E8 59FAFDFF | call 23814AC |
堆栈数据:
00181FFC 5CC68B8C
00182000 023A1A78
00182004 0000013E
00182008 00000000
0018200C 00000007
|