[hide=50]เอามาให้อ่านเล่นๆ
เห็นหากันจัง เผื่อลองทำดูแล้วได้ผล
ซอฟแวร์เป้าหมาย : South Bay Software FolderView 2.2
เว็บ : http://www.southbaypc.com
เครื่องมือที่ใช้ : OllyDbg 1.10
การแพ็คหรือการเข้ารหัส : N/A
ภาษาที่ใช้สร้างโปรแกรม : Microsoft Visual C++ 7.0
วัน เดือน ปี : 15 ก.ค 49
เขียนบทความโดย : Neoclassic
ใช้ OllyDBG หา Sorry, you have entered an incorrect registration code.
search for >> all references text strings >> Sorry, you have entered an incorrect registration code.
ดับเบิ้นคลิ๊กแล้วจะโผ่วมาที่นี่
0040DBB9 |. 68 7CDD4200 PUSH FolderVi.0042DD7C ; |Text = "Sorry, you have entered an incorrect registration code."
แต่เราต้องมาเริ่มต้นการ ทำงานของโปรแกรมที่นี่
0040DB4F |. E8 CCEAFFFF CALL FolderVi.0040C620 >> ต้องมองให้ออก???
========================================================
0040DB4F |. E8 CCEAFFFF CALL FolderVi.0040C620 ;<< รับชื่อ
0040DB54 |. 85C0 TEST EAX,EAX
0040DB56 |. 75 5A JNZ SHORT FolderVi.0040DBB2 ;<< ตรวจสอบ ว่าป้อนชื่อหรือไม่ แล้วโชว์ msg
0040DB58 |. 8D4424 08 LEA EAX,DWORD PTR SS:[ESP+8]
0040DB5C |. 50 PUSH EAX ;<< บันทึกชื่อ
0040DB5D |. 8D8C24 0C0100>LEA ECX,DWORD PTR SS:[ESP+10C]
0040DB64 |. 51 PUSH ECX ;<< บันทึกโค้ด
0040DB65 |. E8 36FBFFFF CALL FolderVi.0040D6A0 ;<< call registration routine
0040DB6A |. 83C4 08 ADD ESP,8
0040DB6D |. 85C0 TEST EAX,EAX ;<< โค้ดที่ป้อนถูก
0040DB6F |. 74 41 JE SHORT FolderVi.0040DBB2 ;<< โค้ดที่ป้อนผิด
0040DB71 |. 8D5424 08 LEA EDX,DWORD PTR SS:[ESP+8]
0040DB75 |. 52 PUSH EDX
0040DB76 |. 8D8424 0C0100>LEA EAX,DWORD PTR SS:[ESP+10C]
==========================================================
0040DB9C |. 83C4 18 ADD ESP,18
0040DB9F |. 6A 01 PUSH 1 ; /Result = 1
0040DBA1 |. 56 PUSH ESI ; |hWnd ;<< else save registration info
0040DBA2 |. FF15 50D34200 CALL DWORD PTR DS:[<&USER32.EndDialog>] ;<< \EndDialog
0040DBA8 |. 33C0 XOR EAX,EAX
0040DBAA |. 5F POP EDI
0040DBAB |. 5E POP ESI
0040DBAC |. 8BE5 MOV ESP,EBP
0040DBAE |. 5D POP EBP
0040DBAF |. C2 1000 RETN 10
0040DBB2 |> 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
=============================================================
0040DBB4 |. 68 F8D54200 PUSH FolderVi.0042D5F8 ; |Title = "FolderView"
0040DBB9 |. 68 7CDD4200 PUSH FolderVi.0042DD7C ; |Text = "Sorry, you have entered an incorrect registration code."
0040DBBE |. 56 PUSH ESI ; |hOwner
0040DBBF |. FF15 98D24200 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
================================================================
ขั้นตอน การทำ (keygen)
หา serial algo มาที่นี่
0040DB65 |. E8 36FBFFFF CALL FolderVi.0040D6A0 ;<< call registration routine
กด enter
===========
โผว่มาบรรทัดนี้
0040D6A0 /$ 81EC 00010000 SUB ESP,100
หาบรรทัดนี้
0040D6CB |. E8 50FCFFFF CALL FolderVi.0040D320
กด enter
=======
มาเจอบรรทัดนี้
0040D320 /$ 81EC 00010000 SUB ESP,100
หาบรรทัดนี้
0040D347 |. FF15 A0D04200 CALL DWORD PTR DS:[<&KERNEL32.lstrlenA>] ; \lstrlenA
และนี่คือจุดเรื่มต้นการทำ keygen ( KERNEL32.lstrlenA >> \lstrlenA )
นี้คือ serial algo
PART 1
0040D347 |. FF15 A0D04200 CALL DWORD PTR DS:[<&KERNEL32.lstrlenA>] ; \lstrlenA ;<< รับความยาวชื่อ
0040D34D |. 8BF0 MOV ESI,EAX ;<< ความยาวชื่อ เก็บไว้ที่ register esi
0040D34F |. 33C9 XOR ECX,ECX ;<< xor ความหมายคือ เหมือนกันเป็น 0 ต่างกันเป็น 1 ดังนั้น register ecx = 0
0040D351 |. 33C0 XOR EAX,EAX ; << xor ความหมายคือ เหมือนกันเป็น 0 ต่างกันเป็น 1 ดังนั้น register eax = 0
0040D353 |. 85F6 TEST ESI,ESI ;<< ตรวจสอบชื่อ <=0 หรือไม่
0040D355 |. 76 16 JBE SHORT FolderVi.0040D36D ;<< ใช่ กระโดด
0040D357 |. 8B15 F0704300 MOV EDX,DWORD PTR DS:[4370F0] ;<< registry edx = 0x32 (00000032)
0040D35D |. 8D49 00 LEA ECX,DWORD PTR DS:[ECX]
0040D360 |> 0FBE1C38 /MOVSX EBX,BYTE PTR DS:[EAX+EDI] ;<< ebx = name
0040D364 |. 03DA |ADD EBX,EDX ;<< ebx = ebx + edx (ADD บวก)
0040D366 |. 03CB |ADD ECX,EBX ;<< ecx = ecx + ebx
0040D368 |. 40 |INC EAX ;<< next char
0040D369 |. 3BC6 |CMP EAX,ESI ;<< all char done?
0040D36B |.^ 72 F3 \JB SHORT FolderVi.0040D360 ;<< หยุด
PART2
0040D384 |. 33C9 XOR ECX,ECX ;<< xor ความหมายคือ เหมือนกันเป็น 0 ต่างกันเป็น 1 ดังนั้น register ecx = 0
0040D386 |. 33C0 XOR EAX,EAX ; << xor ความหมายคือ เหมือนกันเป็น 0 ต่างกันเป็น 1 ดังนั้น register eax = 0
0040D388 |. 85F6 TEST ESI,ESI ;<< ตรวจสอบชื่อ <=0 หรือไม่
0040D38A |. 76 14 JBE SHORT FolderVi.0040D3A0 ;<< ใช่ กระโดด
0040D38C |. 8B15 F4704300 MOV EDX,DWORD PTR DS:[4370F4] ;<< registry edx = 0x28 (00000028)
0040D392 |> 0FBE2C38 /MOVSX EBP,BYTE PTR DS:[EAX+EDI] :<< ebp = name
0040D396 |. 0FAFEA |IMUL EBP,EDX ;<< ebp = ebp * edx (IMUL : Integer multiply คูณ)
0040D399 |. 03CD |ADD ECX,EBP ;<< ecx = ecx + ebp
0040D39B |. 40 |INC EAX ;<< next char เพิ่มค่า eax ไปเรื่อยๆ
0040D39C |. 3BC6 |CMP EAX,ESI ;<< all char done?
0040D39E |.^ 72 F2 \JB SHORT FolderVi.0040D392 ;<< หยุด
PART3
0040D3C0 |. 33C9 XOR ECX,ECX ;<< xor ความหมายคือ เหมือนกันเป็น 0 ต่างกันเป็น 1 ดังนั้น register ecx = 0
0040D3C2 |. 33C0 XOR EAX,EAX ; << xor ความหมายคือ เหมือนกันเป็น 0 ต่างกันเป็น 1 ดังนั้น register eax = 0
0040D3C4 |. 85F6 TEST ESI,ESI ;<< ตรวจสอบชื่อ <=0 หรือไม่
0040D3C6 |. 76 15 JBE SHORT FolderVi.0040D3DD ;<< ใช่ กระโดด
0040D3C8 |. 8B15 F8704300 MOV EDX,DWORD PTR DS:[4370F8] ;<< registry edx = 0x1e (0000001E)
0040D3CE |. 8BFF MOV EDI,EDI
0040D3D0 |> 0FBE2C38 /MOVSX EBP,BYTE PTR DS:[EAX+EDI :<< ebp = name
0040D3D4 |. 03EA |ADD EBP,EDX ;<< ebp = ebp + edx
0040D3D6 |. 03CD |ADD ECX,EBP ;<< ecx = ecx + ebp
0040D3D8 |. 40 |INC EAX ;<< next char เพิ่มค่า eax ไปเรื่อยๆ
0040D3D9 |. 3BC6 |CMP EAX,ESI ;<< all char done?
0040D3DB |.^ 72 F3 \JB SHORT FolderVi.0040D3D0 ;<< หยุด
PART4
0040D3FD |. 33C9 XOR ECX,ECX ;<< xor ความหมายคือ เหมือนกันเป็น 0 ต่างกันเป็น 1 ดังนั้น register ecx = 0
0040D3FF |. 33C0 XOR EAX,EAX ; << xor ความหมายคือ เหมือนกันเป็น 0 ต่างกันเป็น 1 ดังนั้น register eax = 0
0040D401 |. 85F6 TEST ESI,ESI ;<< ตรวจสอบชื่อ <=0 หรือไม่
0040D403 |. 76 19 JBE SHORT FolderVi.0040D41E ;<< ใช่ กระโดด
0040D405 |. 8B15 FC704300 MOV EDX,DWORD PTR DS:[4370FC] ;<< registry edx = 0x0b (0000000
0040D40B |. EB 03 JMP SHORT FolderVi.0040D410
0040D40D | 8D49 00 LEA ECX,DWORD PTR DS:[ECX]
0040D410 |> 0FBE2C38 /MOVSX EBP,BYTE PTR DS:[EAX+EDI] :<< ebp = name
0040D414 |. 0FAFEA |IMUL EBP,EDX ;<< ebp = ebp * edx (IMUL : Integer multiply)
0040D417 |. 03CD |ADD ECX,EBP ;<< ecx = ecx + ebp
0040D419 |. 40 |INC EAX ;<< next char เพิ่มค่า eax ไปเรื่อยๆ
0040D41A |. 3BC6 |CMP EAX,ESI ;<< all char done?
0040D41C |.^ 72 F2 \JB SHORT FolderVi.0040D410 ;<< หยุด
============
หา const
part1
0040D357 |. 8B15 F0704300 MOV EDX,DWORD PTR DS:[4370F0]
DS:[004370F0]=00000032
part2
0040D38C |. 8B15 F4704300 MOV EDX,DWORD PTR DS:[4370F4]
DS:[004370F4]=00000028
part3
0040D3C8 |. 8B15 F8704300 MOV EDX,DWORD PTR DS:[4370F8]
DS:[004370F8]=0000001E
part4
0040D405 |. 8B15 FC704300 MOV EDX,DWORD PTR DS:[4370FC]
DS:[004370FC]=0000000B
====================================================================
โค้ดทำ keygen (MASM)
Generate proc hWnd:HWND
invoke GetDlgItemText,hWnd,IDC_NAME,addr NameBuffer,40
mov edi,offset NameBuffer
invoke lstrlen,edi
mov esi,eax
xor ecx,ecx
xor eax,eax
test esi,esi
jle NOINPUT
mov edx,Hash1
@@:
movsx ebx,byte ptr [eax+edi]
add ebx,edx
add ecx,ebx
inc eax
cmp eax,esi
jl @b
invoke wsprintf,addr SerialBuffer,addr FormatControl,ecx
xor ecx,ecx
mov eax,ecx
mov edx,Hash2
@@:
movsx ebx,byte ptr [eax+edi]
imul ebx,edx
add ecx,ebx
inc eax
cmp eax,esi
jl @b
invoke wsprintf,addr SerialSection,addr FormatControl,ecx
invoke lstrcat,addr SerialBuffer,addr SerialSection
xor ecx,ecx
mov eax,ecx
mov edx,Hash3
@@:
movsx ebx,byte ptr [eax+edi]
add ebx,edx
add ecx,ebx
inc eax
cmp eax,esi
jl @b
invoke wsprintf,addr SerialSection,addr FormatControl,ecx
invoke lstrcat,addr SerialBuffer,addr SerialSection
xor ecx,ecx
mov eax,ecx
mov edx,Hash4
@@:
movsx ebx,byte ptr [eax+edi]
imul ebx,edx
add ecx,ebx
inc eax
cmp eax,esi
jl @b
invoke wsprintf,addr SerialSection,addr EndFormatControl,ecx
invoke lstrcat,addr SerialBuffer,addr SerialSection
invoke SetDlgItemText,hWnd,IDC_SERIAL,addr SerialBuffer
xor eax,eax
ret
NOINPUT:
;invoke RtlZeroMemory,addr SerialBuffer,40
invoke SetDlgItemText,hWnd,IDC_SERIAL,addr MoreInputTxt
xor eax,eax
ret
Generate endp
========================================
โค้ดทำ keygen