Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых) |
![]() |
eXeL@B —› Программирование —› ASM вставки в Delphi (продолжение) |
Посл.ответ | Сообщение |
|
Создано: 24 марта 2007 19:08 · Личное сообщение · #1 Решил переписать HardLock.dll из RLProtector v0.7.4 beta, но были косяки, которые обсуждались в моем первом топике. Щас вроде написал, ниже отчет: После недолгих эксперементов решил рабочую длл ИДЕ скормить, вот что она выдала: .text:1000102E ; --------------- S U B R O U T I N E --------------------------------------- .text:1000102E .text:1000102E .text:1000102E public HardLockKey .text:1000102E HardLockKey proc near .text:1000102E push 0 ; nFileSystemNameSize .text:10001030 push 0 ; lpFileSystemNameBuffer .text:10001032 push offset FileSystemFlags ; lpFileSystemFlags .text:10001037 push 0 ; lpMaximumComponentLength .text:10001039 push offset VolumeSerialNumber ; lpVolumeSerialNumber .text:1000103E push 0 ; nVolumeNameSize .text:10001040 push 0 ; lpVolumeNameBuffer .text:10001042 push 0 ; lpRootPathName .text:10001044 call GetVolumeInformationA .text:10001049 mov eax, offset FileSystemFlags .text:1000104E mov ebx, offset VolumeSerialNumber .text:10001053 mov eax, [eax] .text:10001055 mov ebx, [ebx] .text:10001057 xor eax, 21350921h .text:1000105C rol eax, 3 .text:1000105F xor eax, ebx .text:10001061 ror ebx, 3 .text:10001064 retn .text:10001064 HardLockKey endp .data:10003000 ; Section 3. (virtual address 00003000) .data:10003000 ; Virtual size : 00000008 ( 8.) .data:10003000 ; Section size in file : 00000000 ( 0.) .data:10003000 ; Offset to raw data for section: 00000000 .data:10003000 ; Flags C0000040: Data Readable Writable .data:10003000 ; Alignment : default .data:10003000 ; ====================================================================== ===== .data:10003000 .data:10003000 ; Segment type: Pure data .data:10003000 ; Segment permissions: Read/Write .data:10003000 _data segment para public 'DATA' use32 .data:10003000 assume cs:_data .data:10003000 ;org 10003000h .data:10003000 ; DWORD FileSystemFlags .data:10003000 FileSystemFlags dd ? ; DATA XREF: HardLockKey+4o .data:10003000 ; HardLockKey+1Bo .data:10003004 ; DWORD VolumeSerialNumber .data:10003004 VolumeSerialNumber dd ? ; DATA XREF: HardLockKey+Bo .data:10003004 ; HardLockKey+20o .data:10003004 _data ends .data:10003004 .data:10003004 .data:10003004 end start Из листинга стало ясно, что адрес 10003000h указывает на FileSystemFlags, а адрес 10003004h на VolumeSerialNumber. В аттаче исходники HardLock.dll на Delphi и пример использования. ----- xchg dword [eax], eax ![]() |
|
Создано: 24 марта 2007 19:09 · Личное сообщение · #2 |
|
Создано: 24 марта 2007 19:09 · Личное сообщение · #3 |
|
Создано: 24 марта 2007 19:51 · Личное сообщение · #4 SLV Асм я потихоньку учу. Если я рипаю, то говорю это и всегда с исходниками выкладываю. Просто я помню когда начинал всем этим заниматься, почти все на асме, было трудно разбираться не зная его, а так все понятнее для меня, может еще кому-нибудь пригодиться и поможет в чем-то разобраться. ----- xchg dword [eax], eax ![]() |
|
Создано: 25 марта 2007 00:25 · Поправил: Chingachguk · Личное сообщение · #5 Если честно, я не понял что за вопрос был, может быть в этом дело: asm mov eax, [Flags] mov ebx, [SN] xor eax, 21350921h И это компЕлируецца как-то странно? Имхо pas&delphi имеют отличную поддержку асм-вставок, и нет смысла бояцца писать тут как в настоящем ассемблере: function HardLockKey2: integer; stdcall; var Flags, SN: integer; key1, key2: integer; begin Flags:= GetFlags; SN:= GetSN; asm mov eax,Flags { This should be translated into something like "mov eax,[ebp-XXX]"} mov ebx,SN xor eax, 21350921h rol eax, 3 xor eax, ebx ror ebx, 3 mov @Result,ebx end; end; Однако tips: 1) Нужно следить за сохранением регистрофф типа ebx,edi,esi... но тут лучше покурить хэлп по этому языку; 2) Отлаживать такую процедуру удобнее не на "комплексе" из dll и приложения, а в tiny приложении на встроенном ассемблере (имхо он нормален) отладить процедурку; 3) Можно не бояцца писать (повторяюсь) почти как "на настоящем асме": function HardLockKey2: integer; stdcall; var Flags, SN: integer; begin asm push ebx call GetFlags xor eax, 21350921h rol eax,3 mov eax,ebx call GetSN xor eax,ebx ror ebx,3 mov @Result,ebx pop ebx end; end; На ошипки не проверял ![]() ----- The one derivative you manage is the one I abhore (c) Slipknot ![]() |
|
Создано: 25 марта 2007 18:12 · Личное сообщение · #6 |
|
Создано: 26 марта 2007 19:56 · Личное сообщение · #7 |
|
Создано: 27 марта 2007 06:42 · Личное сообщение · #8 |
![]() |
eXeL@B —› Программирование —› ASM вставки в Delphi (продолжение) |