Сейчас на форуме: _MBK_, asfa (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Подскажите, где ошибка...
Посл.ответ Сообщение

Ранг: 129.0 (ветеран), 116thx
Активность: 0.060
Статус: Участник

Создано: 24 мая 2009 00:25
· Личное сообщение · #1

Доброго времени суток всем.
Прошу совета и подсказки, где я допустил ошибку при написании кейгена, писал на асме. Вобщем ситуация такая, что при нажатии на кнопку "Generate" выскакивает ошибка и сгенерированный код не показывается, хотя при анализе в оле код генерируется правильно и в конце генерации правильный код я вижу в регистрах EAX и EBP, но вывести его не получаетчя, где-есть ошибка или что-то не правильно делаю...Содержимое Asm и Include файлов прилагаю, если нужно, выложу и ехе файл.
Возможно в коде есть много лишнего, но код генерируется правильно.
Асм начал изучать не давно, но уже написал несколько кейгенов на этом языке и все было нормально, а с этим немного зашел в тупик...
Asm файл:
Code:
  1. .386
  2. .model flat, stdcall  ;32 bit memory model
  3. option casemap :none  ;case sensitive
  4. include Keygen.inc
  5. .code
  6. start:
  7.          invoke GetModuleHandle,NULL
  8.          mov         hInstance,eax
  9.     invoke InitCommonControls
  10.          invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
  11.          invoke ExitProcess,0
  12. ;##################################################################### ###
  13. DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
  14.          mov         eax,uMsg
  15.          .if eax==WM_INITDIALOG
  16.          invoke LoadIcon,hInstance,300
  17.     mov hIcon,eax
  18.     invoke SendMessage,hWin,WM_SETICON,NULL,hIcon
  19.          .elseif eax==WM_COMMAND
  20.          mov eax,wParam
  21.     .if eax==1005 ;button Generate
  22.          invoke GetDlgItemText,hWin,1002,addr szName,30
  23.          push offset szName
  24.          call Generate
  25.    
  26.          invoke SetDlgItemText,hWin,1004,addr serial
  27.          
  28.          
  29.     .elseif eax==1006 ;button About
  30.          invoke MessageBox,hWin,addr TEXT,addr TITULO,MB_APPLMODAL     
  31.          
  32.          
  33.     .elseif eax==1007 ;button Exit
  34.          invoke EndDialog,hWin,0   
  35. .endif   
  36.          .elseif eax==WM_CLOSE
  37.                  invoke EndDialog,hWin,0
  38.          .else
  39.                  mov       eax,FALSE
  40.                  ret
  41.          .endif
  42.          mov         eax,TRUE
  43.          ret
  44. DlgProc endp
  45. Generate:
  46.          xor edx,edx
  47.          xor ecx,ecx
  48.          xor esi,esi
  49.          xor edi,edi
  50.          mov esi,eax
  51.     MOV EDI, DWORD PTR SS:[offset szName]    
  52.     MOV EDX, 026h
  53.     xor eax,eax
  54. L001:
  55.   MOVSX EBX, BYTE PTR [EDI+EAX]
  56.   ADD EBX, EDX
  57.   ADD EAX, 1
  58.   ADD ECX, EBX
  59.   CMP EAX, ESI 
  60.   JL L001
  61.   mov [serial1],ecx
  62.   invoke wsprintf,addr serial1,addr Format,serial1
  63.   invoke lstrcpy,addr serial,addr serial1
  64.  push offset serial
  65.  xor ebp,ebp
  66.  pop ebp
  67.     xor eax,eax
  68.     xor edx,edx
  69.     xor ecx,ecx
  70.          xor ebx,ebx      
  71.     MOV EDI, DWORD PTR SS:[offset szName]    
  72.     MOV EDX, 034h
  73.     xor eax,eax
  74. L002:
  75.   MOVSX EBX, BYTE PTR DS:[EDI+EAX]
  76.   IMUL EBX, EDX
  77.   ADD EAX, 1
  78.   ADD ECX, EBX
  79.   CMP EAX, ESI
  80.   JL L002
  81.   mov [serial2],ecx
  82.   invoke wsprintf,addr serial2,addr Format,serial2
  83.   invoke lstrcat,addr serial,addr serial2 
  84.  push offset serial
  85.  xor ebp,ebp
  86.  pop ebp
  87.     xor eax,eax
  88.     xor edx,edx
  89.     xor ecx,ecx
  90.          xor ebx,ebx      
  91.     MOV EDI, DWORD PTR SS:[offset szName]       
  92.     mov edx,0Ch
  93. L003: 
  94.   MOVSX EBX, BYTE PTR DS:[EDI+EAX]
  95.   ADD EBX, EDX
  96.   ADD EAX, 1
  97.   ADD ECX, EBX
  98.   CMP EAX, ESI
  99.   JL L003
  100.   mov [serial3],ecx
  101.   invoke wsprintf,addr serial3,addr Format,serial3
  102.   invoke lstrcat,addr serial,addr serial3  
  103.   push offset serial
  104.   xor ebp,ebp
  105.   pop ebp
  106.   
  107.     xor eax,eax
  108.     xor edx,edx
  109.     xor ecx,ecx
  110.          xor ebx,ebx      
  111.     MOV EDI, DWORD PTR SS:[offset szName]       
  112.     mov edx,0Eh  
  113. L004: 
  114.    MOVSX EBX, BYTE PTR DS:[EDI+EAX]
  115.   IMUL EBX, EDX
  116.   ADD EAX, 1
  117.   ADD ECX, EBX
  118.   CMP EAX, ESI
  119.   JL L004
  120.   mov [serial4],ecx
  121.   invoke wsprintf,addr serial4,addr Format1,serial4
  122.   invoke lstrcat,addr serial,addr serial4 
  123.   push offset serial
  124.   mov [serial],ebp
  125.   ret
  126.   
  127.   
  128. end start


Include файл:
Code:
  1. include windows.inc
  2. include kernel32.inc
  3. include user32.inc
  4. include Comctl32.inc
  5. include shell32.inc
  6. includelib kernel32.lib
  7. includelib user32.lib
  8. includelib Comctl32.lib
  9. includelib shell32.lib
  10. DlgProc            PROTO   :HWND,:UINT,:WPARAM,:LPARAM
  11. .const
  12. IDD_DIALOG1                  equ 101
  13. ;##################################################################### ####
  14. .data
  15. TEXT               db "Good luck",0
  16. TITULO             db "About keygen",0
  17. szName             dd 16 dup(0),0
  18. serial             dd 16 dup(0),0
  19. Format             db "%02i-",0
  20. Format1            db "%02i",0
  21. serial1             dd 16 dup(0),0
  22. serial2             dd 16 dup(0),0
  23. serial3             dd 16 dup(0),0
  24. serial4             dd 16 dup(0),0
  25. .data?
  26. hInstance                        dd ?
  27. hIcon               dd ?
  28. ;##################################################################### ####


-----
We do what we want because we can.




Ранг: 221.3 (наставник), 135thx
Активность: 0.190.07
Статус: Участник

Создано: 24 мая 2009 03:10
· Личное сообщение · #2

verdizela
Часто используешь стэк без надобности!
Code:
  1.  push offset serial 
  2.  xor ebp,ebp 
  3.  pop ebp

это ваще бессмысленная конструкция

ниже исправленный код процедуры
Code:
  1. Generate proc 
  2.          xor edx,edx 
  3.          xor ecx,ecx 
  4.          xor esi,esi 
  5.          xor edi,edi 
  6.          mov esi,eax 
  7.     MOV EDI, DWORD PTR SS:[offset szName]     
  8.     MOV EDX, 026h 
  9.     xor eax,eax 
  10. L001: 
  11.   MOVSX EBX, BYTE PTR [EDI+EAX] 
  12.   ADD EBX, EDX 
  13.   ADD EAX, 1 
  14.   ADD ECX, EBX 
  15.   CMP EAX, ESI  
  16.   JL L001 
  17.   mov [serial1],ecx 
  18.   invoke wsprintf,addr serial1,addr Format,serial1 
  19.   invoke lstrcpy,addr serial,addr serial1 
  20.     xor eax,eax 
  21.     xor edx,edx 
  22.     xor ecx,ecx 
  23.          xor ebx,ebx       
  24.     MOV EDI, DWORD PTR SS:[offset szName]     
  25.     MOV EDX, 034h 
  26.     xor eax,eax 
  27. L002: 
  28.   MOVSX EBX, BYTE PTR DS:[EDI+EAX] 
  29.   IMUL EBX, EDX 
  30.   ADD EAX, 1 
  31.   ADD ECX, EBX 
  32.   CMP EAX, ESI 
  33.   JL L002 
  34.   mov [serial2],ecx 
  35.   invoke wsprintf,addr serial2,addr Format,serial2 
  36.   invoke lstrcat,addr serial,addr serial2  
  37.     xor eax,eax 
  38.     xor edx,edx 
  39.     xor ecx,ecx 
  40.          xor ebx,ebx       
  41.     MOV EDI, DWORD PTR SS:[offset szName]        
  42.     mov edx,0Ch 
  43. L003:  
  44.   MOVSX EBX, BYTE PTR DS:[EDI+EAX] 
  45.   ADD EBX, EDX 
  46.   ADD EAX, 1 
  47.   ADD ECX, EBX 
  48.   CMP EAX, ESI 
  49.   JL L003 
  50.   mov [serial3],ecx 
  51.   invoke wsprintf,addr serial3,addr Format,serial3 
  52.   invoke lstrcat,addr serial,addr serial3   
  53.     xor eax,eax 
  54.     xor edx,edx 
  55.     xor ecx,ecx 
  56.          xor ebx,ebx       
  57.     MOV EDI, DWORD PTR SS:[offset szName]        
  58.     mov edx,0Eh   
  59. L004:  
  60.    MOVSX EBX, BYTE PTR DS:[EDI+EAX] 
  61.   IMUL EBX, EDX 
  62.   ADD EAX, 1 
  63.   ADD ECX, EBX 
  64.   CMP EAX, ESI 
  65.   JL L004 
  66.   mov [serial4],ecx 
  67.   invoke wsprintf,addr serial4,addr Format1,serial4 
  68.   invoke lstrcat,addr serial,addr serial4  
  69.   ret
  70. Generate endp


это строку тоже можешь удалить, думаю поймешь почему она не нужна
Code:
  1. push offset szName


-----
xchg dword [eax], eax




Ранг: 129.0 (ветеран), 116thx
Активность: 0.060
Статус: Участник

Создано: 24 мая 2009 10:18
· Личное сообщение · #3

v0id2k
Большое спасибо за ответ и за совет. Ошибки я уже исправил, все работает...
Тему, в принципе, я готов закрыть, но пользуясь случаем, хочу задать еще несколько вопросов.
Какой процедурой можно очищать стек от мусора? Я читал об этом и хотел переписать пример этотй процедуры, но не зделал этого и теперь стараюсь вспомнить, где я это видел...
И второй вопрос. После окончания процедуры генерациии в EAX у меня готовый серийник, а как получить длинну строки серийника, тоесть количество знаков...?

-----
We do what we want because we can.





Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 24 мая 2009 13:26 · Поправил: Coderess
· Личное сообщение · #4

Какой процедурой можно очищать стек от мусора?

В конче процедур вызывается leave


После окончания процедуры генерациии в EAX у меня готовый серийник, а как получить длинну строки серийника, тоесть количество знаков...?

я так понимаю указатель хранится в Eax, тогда вызов функции lstrlen или самодельной xstrlen

Code:
  1. xstrlen:
  2.      xor  ecx, ecx
  3. __1:mov al, byte ptr[eax + ecx]
  4.        test al,al
  5.        jz  __2
  6.        inc ecx
  7.        jmp __1
  8. __2:ret


На выходе Ecx - содержит количество символов

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 129.0 (ветеран), 116thx
Активность: 0.060
Статус: Участник

Создано: 24 мая 2009 13:39
· Личное сообщение · #5

Coderess
Большое спасибо за исчерпывающий ответ, теперь все понятно.
Тему закрываю.

-----
We do what we want because we can.



 eXeL@B —› Вопросы новичков —› Подскажите, где ошибка...
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати