输入/输出说明 - 我应该如何处理?

逆向工程 二元分析
2021-06-22 06:33:59

我在 IDA 中看到了很多进出指令。我知道那些应该做什么,但我不知道如何对待它们,而且我在理解代码方面没有取得任何进展。

简短示例:我当前任务的第一个说明是:

seg000:00000000                 mov     edx, 61666A1Fh
seg000:00000005                 fincstp
seg000:00000007                 fnstenv byte ptr [esp-0Ch]
seg000:0000000B                 pop     esi             ; EIP
seg000:0000000C                 sub     ecx, ecx
seg000:0000000E                 mov     cl, 33h ; '3'
seg000:00000010                 xor     [esi+12h], edx
seg000:00000013                 add     edx, [esi+12h]  ; 
seg000:00000016                 xor     ecx, 0FFFFFF96h
seg000:00000019                 test    [ecx+esi*8+957C08Fh], dl
seg000:00000020                 push    eax             ; ??????
seg000:00000021                 mov     bl, 0DEh ; '¦'
seg000:00000023                 in      al, dx
seg000:00000024                 popa
seg000:00000025                 loope   near ptr 0FFFFFFACh

我有点迷失05h-0Bh因为这是我第一次遇到 FPU 指令,但我认为这ESI应该指向指向的位置EIP

我的主要问题是关于23h.

in al, dx

应该AL从端口加载一个字节6A1Fh吗?这是否与任何相关,或者这样的代码是否应该让我的工作更加努力或隐藏某些东西?也许它是加密的,并且在某个时候某些解密算法会起作用。或者也许这不应该被视为代码?

1个回答

这是自修改代码。您看到的垃圾指令将动态更改,如下所示:

seg000:00000000                 mov     edx, 61666A1Fh
seg000:00000005                 fincstp
seg000:00000007                 fnstenv byte ptr [esp-0Ch]
seg000:0000000B                 pop     esi             ; EIP

现在 esi 指向fincstp指令 ( 00000005)的位置

seg000:0000000C                 sub     ecx, ecx
seg000:0000000E                 mov     cl, 33h ; loop counter
seg000:00000010                 xor     [esi+12h], edx
seg000:00000013                 add     edx, [esi+12h]  ;sliding key

esi+12( 00000017) 正在被改变,变成这个:

seg000:00000016                 xor     ecx, 0FFFFFF96h
seg000:00000019                 test    [ecx+esi*8+957C08Fh], dl

对此:

seg000:00000016                 sub     esi, 0FFFFFFFCh
seg000:00000019                 loop    near ptr 00000010

esi = esi + 4,现在是00000009(and, then, 0x0000000d, 0x00000011, ...),并且循环通过 中的值继续ecx这是一个shellcode风格的解密器。可以在此处此处找到有关此技术的更详细说明