Инструкции по сборке FILD, FSTP и FST
Так что я решил эту проблему сегодня. Мне удалось найти и понять процедуру генерации последовательного порта, за исключением нескольких последних инструкций. Я решил написать кейген в сборке впервые. Все шло хорошо, пока я не пришел к последним нескольким инструкциям серийной рутины. Я использую MASM и сборку Intel (Intel, AT&T, как вы их называете?) Это мой текущий код:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
SerialCalc proto :DWORD
.data
EnterText db "...enter a name...",0
temp db "temp",0
Format db "%i-x019871",0
.data?
NameBuffer db 100 dup(?)
SerialBuffer db 150 dup(?)
SerialLength dd ?
hInstance HINSTANCE ?
.const
IDC_NAME equ 1002
IDC_SERIAL equ 1003
IDC_GENERATE equ 1004
IDC_NAMELABEL equ 1005
IDC_SERIALLABEL equ 1006
IDD_MAIN equ 1001
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, hInstance, IDD_MAIN, NULL, addr DlgProc, NULL
invoke ExitProcess, 0
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.if uMsg == WM_INITDIALOG
invoke GetDlgItem,hWnd,IDC_NAME ;get IDC_NAME
invoke SetFocus,eax ;focus on it
.elseif uMsg == WM_COMMAND
mov eax, wParam ;wParam = control that issued the WM_COMMAND message
.if ax == IDC_NAME ;if it was the name box
shr eax, 16 ;shift right and get more info?
.if ax == EN_CHANGE ;if the text was changed
invoke GetDlgItemText, hWnd, IDC_NAME, addr NameBuffer, 100 ;get text
invoke lstrlen, addr NameBuffer ;get length
mov SerialLength, eax ;move length into var
.if eax == 0 ;if length is 0
invoke SetDlgItemTextA, hWnd, IDC_SERIAL, addr EnterText ;"...enter a name..."
.elseif eax > 0 ;if length is bigger than 0
invoke SerialCalc, hWnd ;calc
invoke SetDlgItemTextA, hWnd, IDC_SERIAL, addr SerialBuffer ;"serial"
.endif
.endif
.endif
.elseif uMsg == WM_CLOSE
invoke EndDialog, hWnd, 0
.endif
xor eax,eax
ret
DlgProc endp
SerialCalc proc hWnd:HWND
;push ecx allocate space for 1 local variable; i was trying to do something with local variables, but I failed
mov edx, SerialLength
imul edx, edx, 875CDh
mov eax, 51EB851Fh
mul edx
mov eax, edx
shr eax, 5h
imul eax, eax, -370h
xor edx, edx ;mov edx, 0
;problems start here; I took this code from a solution i found
;push edx
;push eax
;fild qword ptr [esp]
;add esp, 8
;fstp real8 ptr [SerialBuffer]
;more stuff should come here sprintf etc.. but since I haven't solved my main problem yet I decided not to rush
SerialCalc endp
end start
И это актуальная последовательная процедура в самой программе:
MOV EDX,EAX
IMUL EDX,EDX,875CD
MOV EAX,51EB851F
MUL EDX
MOV EAX,EDX
SHR EAX,5
IMUL EAX,EAX,-370
MOV EDX,0
PUSH EDX ; ||format = NULL
PUSH EAX ; ||s = FE8BC1A0
FILD QWORD PTR SS:[ESP] ; ||
LEA ESP,DWORD PTR SS:[ESP+8] ; ||
FSTP QWORD PTR SS:[EBP-410] ; ||
FLD QWORD PTR SS:[EBP-410] ; ||
FSTP QWORD PTR SS:[ESP+8] ; ||
MOV DWORD PTR SS:[ESP+4],Crackme_.00401469 ; ||ASCII "%i-x019871"
LEA EAX,[LOCAL.194] ; ||
MOV DWORD PTR SS:[ESP],EAX ; ||
CALL <JMP.&msvcrt.sprintf> ; |\sprintf
LEA EAX,[LOCAL.194] ; |
MOV DWORD PTR SS:[ESP+4],EAX ; |
LEA EAX,[LOCAL.130] ; |
MOV DWORD PTR SS:[ESP],EAX ; |
CALL <JMP.&msvcrt.strcmp> ; \strcmp
Подпрограмма вычисляет серийный номер, который заканчивается в EAX, помещает его в стек, а затем, насколько я понимаю, использует FILD, чтобы поместить его в стек FPU, FSPT, чтобы снять его с FPU и поместить в EBP-410, FLD снова вставляет EBP-410 в FPU и, наконец, использует FSTP для сохранения его в ESP+8 в качестве параметра для sprintf. Спринт и strcmp здесь на самом деле не имеют значения, но я все равно включил их, чтобы вы могли лучше понять, что происходит.
Кстати, это МЕСТНОЕ 194. Это место, где будет размещена отформатированная строка.
Я искал в Интернете и нашел описания этих инструкций, но не нашел ни одного фактического примера или материала, который мог бы помочь передать это моему кейгену.
Итак, последний вопрос: как мне перенести это на мой кейген? Я всегда получаю сообщение "Программа перестала работать", или в последовательном окне ничего не отображается. Комментарии в моей подпрограмме SerialCalc - это та часть, которую я оторвал от решения другого парня, просто чтобы попробовать, сработает ли это, но, к сожалению, это не сработало.
Скажите, если вам нужна более подробная информация о проблеме или какая-либо дополнительная информация.
Я прошу прощения за мое noobiness!
Заранее спасибо, Тунтуни.
1 ответ
Я наконец получил это! Кажется, я не правильно сбалансировал стек после инструкций или чего-то еще. В любом случае, я использовал Visual Studio для написания встроенной сборки и, наконец, все заработало. Спасибо за прочтение.