OllyDBG 之旅 (四)

0040140D  |.  6A 00         push    0                                ; /RootPathName = NULL
0040140F  |.  E8 B4000000   call    <jmp.&KERNEL32.GetDriveTypeA>    ; \GetDriveTypeA
00401414  |.  A2 EC334000   mov     byte ptr [4033EC], al
00401419  |.  6A 00         push    0                                ; /pFileSystemNameSize = NULL
0040141B  |.  6A 00         push    0                                ; |pFileSystemNameBuffer = NULL
0040141D  |.  6A 00         push    0                                ; |pFileSystemFlags = NULL
0040141F  |.  6A 00         push    0                                ; |pMaxFilenameLength = NULL
00401421  |.  6A 00         push    0                                ; |pVolumeSerialNumber = NULL
00401423  |.  6A 0B         push    0B                               ; |MaxVolumeNameSize = B (11.)
00401425  |.  68 9C334000   push    0040339C                         ; |VolumeNameBuffer = CrackHea.0040339C
0040142A  |.  6A 00         push    0                                ; |RootPathName = NULL
0040142C  |.  E8 A3000000   call    <jmp.&KERNEL32.GetVolumeInformat>; \GetVolumeInformationA
00401431  |.  8D35 9C334000 lea     esi, dword ptr [40339C]
00401437  |.  0FB60D EC3340>movzx   ecx, byte ptr [4033EC]
0040143E  |.  33FF          xor     edi, edi
00401440  |>  8BC1          mov     eax, ecx
00401442  |.  8B1E          mov     ebx, dword ptr [esi]
00401444  |.  F7E3          mul     ebx
00401446  |.  03F8          add     edi, eax
00401448  |.  49            dec     ecx
00401449  |.  83F9 00       cmp     ecx, 0
0040144C  |.^ 75 F2         jnz     short 00401440
0040144E  |.  893D 9C334000 mov     dword ptr [40339C], edi
00401454  |.  61            popad
00401455  \.  C3            retn


0040140D  |.  6A 00         push    0                                ; /RootPathName = NULL
0040140F  |.  E8 B4000000   call    <jmp.&KERNEL32.GetDriveTypeA>    ; \GetDriveTypeA

调用了API - GetDriveTypeA, 参数为 NULL
GetDriveType函数可以获取目录和盘号的属性。
返回值是目录的属性,有如下值:
DRIVE_UNKNOWN        0
DRIVE_NO_ROOT_DIR 1
DRIVE_REMOVABLE     2
DRIVE_FIXED               3
DRIVE_REMOTE           4
DRIVE_CDROM            5
DRIVE_RAMDISK         6

通常硬盘返回值为 DRIVE_FIXED 

一、关于寄存器
寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是寄存器,但只有在CALL/RET在中会默认使用它,其它情况很少使用到,暂时可以不用理会。
EAX是WIN32 API 默认的返回值存放处。
ECX是LOOP指令自动减一的寄存器。
ESP是堆栈指针。
EBP经常用来在堆栈中寻址。
ESI好像常常用在指针寻址中,EDI不大清楚。

00401414  |.  A2 EC334000   mov     byte ptr [4033EC], al              因为 GetDriveTypeA 的返回值不超过一个字段,所以这里 byte & al 就够了
GetDriveTypeA  被暂时放到了 4033EC 这个地址

然后调用了API - GetVolumeInformationA(NULL,NULL,NULL,NULL,NULL,11, CrackHea.0040339C,  NULL) 获取程序所在的盘的卷标并放到
[40339C] 这个地址

00401431  |.  8D35 9C334000 lea     esi, dword ptr [40339C]
00401437  |.  0FB60D EC3340>movzx   ecx, byte ptr [4033EC]
0040143E  |.  33FF          xor     edi, edi
00401440  |>  8BC1          mov     eax, ecx
00401442  |.  8B1E          mov     ebx, dword ptr [esi]
00401444  |.  F7E3          mul     ebx
00401446  |.  03F8          add     edi, eax
00401448  |.  49            dec     ecx                                                              让ECX寄存器自减一,
00401449  |.  83F9 00       cmp     ecx, 0
0040144C  |.^ 75 F2         jnz     short 00401440
0040144E  |.  893D 9C334000 mov     dword ptr [40339C], edi
00401454  |.  61            popad



 

你可能感兴趣的:(OllyDBG 之旅 (四))