-
-
超级简单的算法:录屏 v4.1 注册算法
-
发表于: 2005-7-5 16:10 5243
-
【软件】录屏 v4.1
【作者】forever[RCT]
【语言】borland c++ builder
【保护】注册码
【工具】dede,ida
【简介】
《录屏》 是一款用于将屏幕操作过程及解说录制为演示文件的好工具。记录时采用音频与视频同步,并分开记录为*.AVI(音频),*.AVI.XXX(视频)。便于对文件*.AVI.XXX进行的编辑,可发布的格式为标准的AVI文件,或FLASH文件。
【正文】
这个软件的算法超级简单,但是做注册机却是让我头疼了一阵子.dede中载入,很容易找到下面的关键点。
.text:004E2AE4 _TForm9_SpeedButton2Click proc near ; DATA XREF: .data:0054471Eo
.text:004E2AE4
.text:004E2AE4 Data = byte ptr -8Ch
.text:004E2AE4 var_6C = dword ptr -6Ch
.text:004E2AE4 var_68 = dword ptr -68h
.text:004E2AE4 var_64 = dword ptr -64h
.text:004E2AE4 var_60 = dword ptr -60h
.text:004E2AE4 var_5C = dword ptr -5Ch
.text:004E2AE4 var_58 = dword ptr -58h
.text:004E2AE4 var_54 = dword ptr -54h
.text:004E2AE4 var_44 = word ptr -44h
.text:004E2AE4 var_38 = dword ptr -38h
.text:004E2AE4 var_30 = dword ptr -30h
.text:004E2AE4 var_2C = dword ptr -2Ch
.text:004E2AE4 var_28 = dword ptr -28h
.text:004E2AE4 var_24 = dword ptr -24h
.text:004E2AE4 var_20 = dword ptr -20h
.text:004E2AE4 var_1C = dword ptr -1Ch
.text:004E2AE4 var_18 = dword ptr -18h
.text:004E2AE4 var_14 = dword ptr -14h
.text:004E2AE4 var_10 = dword ptr -10h
.text:004E2AE4 var_C = dword ptr -0Ch
.text:004E2AE4 var_8 = dword ptr -8
.text:004E2AE4 var_4 = dword ptr -4
.text:004E2AE4
.text:004E2AE4 push ebp
.text:004E2AE5 mov ebp, esp
.text:004E2AE7 add esp, 0FFFFFF74h
.text:004E2AED push ebx
.text:004E2AEE mov [ebp+var_5C], edx
.text:004E2AF1 mov [ebp+var_58], eax
.text:004E2AF4 mov eax, offset stru_5441B4
.text:004E2AF9 call @__InitExceptBlockLDTC
.text:004E2AFE mov edx, [ebp+var_58]
.text:004E2B01 add edx, 318h
.text:004E2B07 push edx ; phkResult
.text:004E2B08 push 2001Fh ; samDesired
.text:004E2B0D push 0 ; ulOptions
.text:004E2B0F push offset aSoftwareTrac_7 ; lpSubKey
.text:004E2B14 push 80000001h ; hKey
.text:004E2B19 call RegOpenKeyExA
.text:004E2B1E test eax, eax
.text:004E2B20 jnz loc_4E2F7F
.text:004E2B26 mov ecx, [ebp+var_58]
.text:004E2B29 mov dword ptr [ecx+328h], 6
.text:004E2B33 mov eax, [ebp+var_58]
.text:004E2B36 add eax, 328h
.text:004E2B3B push eax ; lpcbData
.text:004E2B3C lea edx, [ebp+Data]
.text:004E2B42 push edx ; lpData
.text:004E2B43 mov ecx, [ebp+var_58]
.text:004E2B46 add ecx, 324h
.text:004E2B4C push ecx ; lpType
.text:004E2B4D push 0 ; lpReserved
.text:004E2B4F push offset aMm_0 ; lpValueName
.text:004E2B54 mov eax, [ebp+var_58]
.text:004E2B57 push dword ptr [eax+318h] ; hKey
.text:004E2B5D call RegQueryValueExA ; 查询出副本序号
.text:004E2B62 mov [ebp+var_44], 8
.text:004E2B68 lea eax, [ebp+var_4]
.text:004E2B6B call unknown_libname_196
.text:004E2B70 inc [ebp+var_38]
.text:004E2B73 mov [ebp+var_44], 14h
.text:004E2B79 mov [ebp+var_44], 20h
.text:004E2B7F lea eax, [ebp+var_8]
.text:004E2B82 call unknown_libname_196
.text:004E2B87 inc [ebp+var_38]
.text:004E2B8A mov [ebp+var_44], 14h
.text:004E2B90 mov [ebp+var_44], 2Ch
.text:004E2B96 lea edx, [ebp+Data]
.text:004E2B9C lea eax, [ebp+var_C]
.text:004E2B9F call sub_4F3190
.text:004E2BA4 inc [ebp+var_38]
.text:004E2BA7 lea edx, [ebp+var_C]
.text:004E2BAA lea eax, [ebp+var_4] ; 赋值到这里
.text:004E2BAD call System::AnsiString::operator=(System::AnsiString &)
.text:004E2BB2 dec [ebp+var_38]
.text:004E2BB5 lea eax, [ebp+var_C]
.text:004E2BB8 mov edx, 2
.text:004E2BBD call System::AnsiString::~AnsiString(void)
.text:004E2BC2 lea eax, [ebp+var_4]
.text:004E2BC5 call System::AnsiString::Length(void)
.text:004E2BCA mov ecx, eax
.text:004E2BCC add ecx, -6
.text:004E2BCF lea eax, [ebp+var_4]
.text:004E2BD2 mov edx, 7
.text:004E2BD7 call System::AnsiString::Delete(int,int)
.text:004E2BDC mov edx, eax ; 取前6个字符
.text:004E2BDE lea eax, [ebp+var_8]
.text:004E2BE1 call System::AnsiString::operator=(System::AnsiString &)
.text:004E2BE6 xor ecx, ecx
.text:004E2BE8 mov [ebp+var_60], ecx ; var_60清零
.text:004E2BEB mov [ebp+var_44], 14h
.text:004E2BF1 jmp loc_4E2F23
.text:004E2BF6 loc_4E2BF6:
.text:004E2BF6 xor eax, eax
.text:004E2BF8 mov [ebp+var_68], eax ; var_68 清零
.text:004E2BFB mov [ebp+var_44], 14h
.text:004E2C01 jmp loc_4E2EF8
.text:004E2C06 loc_4E2C06:
.text:004E2C06 mov [ebp+var_44], 38h
.text:004E2C0C lea eax, [ebp+var_10]
.text:004E2C0F call unknown_libname_196
.text:004E2C14 mov edx, eax
.text:004E2C16 inc [ebp+var_38]
.text:004E2C19 mov ecx, [ebp+var_58]
.text:004E2C1C mov eax, [ecx+2F8h]
.text:004E2C22 call TControl::GetText(void) ; 取第3组注册码
.text:004E2C27 lea edx, [ebp+var_10]
.text:004E2C2A push edx
.text:004E2C2B lea eax, [ebp+var_14]
.text:004E2C2E call unknown_libname_196
.text:004E2C33 mov ecx, eax
.text:004E2C35 inc [ebp+var_38]
.text:004E2C38 mov eax, offset a0x ; "0x"
.text:004E2C3D pop edx
.text:004E2C3E call System::operator+(char *,System::AnsiString &)
.text:004E2C43 lea eax, [ebp+var_14]
.text:004E2C46 mov eax, [eax]
.text:004E2C48 call Sysutils::StrToInt(System::AnsiString)
.text:004E2C4D mov ebx, eax ; 转成16进制数字在ebx
.text:004E2C4F lea eax, [ebp+var_18]
.text:004E2C52 call unknown_libname_196
.text:004E2C57 mov ecx, eax
.text:004E2C59 inc [ebp+var_38]
.text:004E2C5C lea edx, [ebp+var_8] ; 副版本号
.text:004E2C5F mov eax, offset a0x_0 ; "0x"
.text:004E2C64 call System::operator+(char *,System::AnsiString &)
.text:004E2C69 lea eax, [ebp+var_18]
.text:004E2C6C mov eax, [eax]
.text:004E2C6E call Sysutils::StrToInt(System::AnsiString)
.text:004E2C73 sub ebx, eax ; 第3组注册码减去副版本号
.text:004E2C75 mov edx, [ebp+var_58]
.text:004E2C78 mov ecx, [edx+300h]
.text:004E2C7E mov eax, [ecx+168h]
.text:004E2C84 call unknown_libname_633
.text:004E2C89 call Graphics::TBitmap::GetCanvas(void)
.text:004E2C8E mov ecx, [ebp+var_68] ; var_68(高度)
.text:004E2C91 mov edx, [ebp+var_60] ; var_60(宽度)
.text:004E2C94 call Graphics::TCanvas::GetPixel(int,int)
.text:004E2C99 cmp ebx, eax ; 取点颜色比较
.text:004E2C9B setz al
.text:004E2C9E and eax, 1
.text:004E2CA1 push eax
.text:004E2CA2 dec [ebp+var_38]
.text:004E2CA5 lea eax, [ebp+var_18]
.text:004E2CA8 mov edx, 2
.text:004E2CAD call System::AnsiString::~AnsiString(void)
.text:004E2CB2 dec [ebp+var_38]
.text:004E2CB5 lea eax, [ebp+var_14]
.text:004E2CB8 mov edx, 2
.text:004E2CBD call System::AnsiString::~AnsiString(void)
.text:004E2CC2 dec [ebp+var_38]
.text:004E2CC5 lea eax, [ebp+var_10]
.text:004E2CC8 mov edx, 2
.text:004E2CCD call System::AnsiString::~AnsiString(void)
.text:004E2CD2 pop ecx
.text:004E2CD3 test cl, cl
.text:004E2CD5 jz loc_4E2EF5 ; 比较不等这里则跳走
.text:004E2CDB mov [ebp+var_44], 44h
.text:004E2CE1 lea eax, [ebp+var_1C]
.text:004E2CE4 call unknown_libname_196
.text:004E2CE9 inc [ebp+var_38]
.text:004E2CEC mov [ebp+var_44], 50h
.text:004E2CF2 mov [ebp+var_44], 5Ch
.text:004E2CF8 lea eax, [ebp+var_20]
.text:004E2CFB call unknown_libname_196
.text:004E2D00 inc [ebp+var_38]
.text:004E2D03 mov [ebp+var_44], 50h
.text:004E2D09 mov [ebp+var_44], 68h
.text:004E2D0F lea eax, [ebp+var_24]
.text:004E2D12 call unknown_libname_196
.text:004E2D17 inc [ebp+var_38]
.text:004E2D1A mov [ebp+var_44], 50h
.text:004E2D20 mov [ebp+var_44], 74h
.text:004E2D26 lea eax, [ebp+var_28]
.text:004E2D29 call unknown_libname_196
.text:004E2D2E mov edx, eax
.text:004E2D30 inc [ebp+var_38]
.text:004E2D33 mov eax, [ebp+var_60] ; 宽度索引
.text:004E2D36 call Sysutils::IntToStr(int)
.text:004E2D3B lea edx, [ebp+var_28]
.text:004E2D3E lea eax, [ebp+var_1C]
.text:004E2D41 call System::AnsiString::operator=(System::AnsiString &)
.text:004E2D46 dec [ebp+var_38]
.text:004E2D49 lea eax, [ebp+var_28]
.text:004E2D4C mov edx, 2
.text:004E2D51 call System::AnsiString::~AnsiString(void)
.text:004E2D56 mov [ebp+var_44], 80h
.text:004E2D5C lea eax, [ebp+var_2C]
.text:004E2D5F call unknown_libname_196
.text:004E2D64 mov edx, eax
.text:004E2D66 inc [ebp+var_38]
.text:004E2D69 mov eax, [ebp+var_68] ; 高度索引
.text:004E2D6C call Sysutils::IntToStr(int)
.text:004E2D71 lea edx, [ebp+var_2C]
.text:004E2D74 lea eax, [ebp+var_20]
.text:004E2D77 call System::AnsiString::operator=(System::AnsiString &)
.text:004E2D7C dec [ebp+var_38]
.text:004E2D7F lea eax, [ebp+var_2C]
.text:004E2D82 mov edx, 2
.text:004E2D87 call System::AnsiString::~AnsiString(void)
.text:004E2D8C mov [ebp+var_44], 8Ch
.text:004E2D92 mov ecx, [ebp+var_58]
.text:004E2D95 mov eax, [ecx+300h]
.text:004E2D9B mov eax, [eax+168h]
.text:004E2DA1 call unknown_libname_633
.text:004E2DA6 call Graphics::TBitmap::GetCanvas(void)
.text:004E2DAB mov ecx, [ebp+var_68]
.text:004E2DAE mov edx, [ebp+var_60]
.text:004E2DB1 call Graphics::TCanvas::GetPixel(int,int)
.text:004E2DB6 push eax ; 取颜色值
.text:004E2DB7 lea eax, [ebp+var_30]
.text:004E2DBA call unknown_libname_196
.text:004E2DBF mov ecx, eax
.text:004E2DC1 inc [ebp+var_38]
.text:004E2DC4 mov edx, 6
.text:004E2DC9 pop eax
.text:004E2DCA call Sysutils::IntToHex(int,int)
.text:004E2DCF lea edx, [ebp+var_30]
.text:004E2DD2 lea eax, [ebp+var_24]
.text:004E2DD5 call System::AnsiString::operator=(System::AnsiString &)
.text:004E2DDA dec [ebp+var_38]
.text:004E2DDD lea eax, [ebp+var_30]
.text:004E2DE0 mov edx, 2
.text:004E2DE5 call System::AnsiString::~AnsiString(void)
.text:004E2DEA mov ecx, [ebp+var_58]
.text:004E2DED add ecx, 320h
.text:004E2DF3 push ecx ; lpdwDisposition
.text:004E2DF4 mov eax, [ebp+var_58]
.text:004E2DF7 add eax, 31Ch
.text:004E2DFC push eax ; phkResult
.text:004E2DFD push 0 ; lpSecurityAttributes
.text:004E2DFF push 0F003Fh ; samDesired
.text:004E2E04 push 0 ; dwOptions
.text:004E2E06 push offset unk_543F8F ; lpClass
.text:004E2E0B push 0 ; Reserved
.text:004E2E0D push offset aSoftwareTrac_8 ; lpSubKey
.text:004E2E12 push 80000001h ; hKey
.text:004E2E17 call RegCreateKeyExA
.text:004E2E1C lea eax, [ebp+var_1C]
.text:004E2E1F call System::AnsiString::Length(void)
.text:004E2E24 push eax ; cbData
.text:004E2E25 lea eax, [ebp+var_1C]
.text:004E2E28 call System::AnsiString::c_str(void)
.text:004E2E2D push eax ; lpData
.text:004E2E2E push 1 ; dwType
.text:004E2E30 push 0 ; Reserved
.text:004E2E32 push offset aXd ; lpValueName
.text:004E2E37 mov edx, [ebp+var_58]
.text:004E2E3A push dword ptr [edx+31Ch] ; hKey
.text:004E2E40 call RegSetValueExA
.text:004E2E45 lea eax, [ebp+var_20]
.text:004E2E48 call System::AnsiString::Length(void)
.text:004E2E4D push eax ; cbData
.text:004E2E4E lea eax, [ebp+var_20]
.text:004E2E51 call System::AnsiString::c_str(void)
.text:004E2E56 push eax ; lpData
.text:004E2E57 push 1 ; dwType
.text:004E2E59 push 0 ; Reserved
.text:004E2E5B push offset aYd ; lpValueName
.text:004E2E60 mov edx, [ebp+var_58]
.text:004E2E63 push dword ptr [edx+31Ch] ; hKey
.text:004E2E69 call RegSetValueExA
.text:004E2E6E lea eax, [ebp+var_24]
.text:004E2E71 call System::AnsiString::Length(void)
.text:004E2E76 push eax ; cbData
.text:004E2E77 lea eax, [ebp+var_24]
.text:004E2E7A call System::AnsiString::c_str(void)
.text:004E2E7F push eax ; lpData
.text:004E2E80 push 3 ; dwType
.text:004E2E82 push 0 ; Reserved
.text:004E2E84 push offset aCd ; lpValueName
.text:004E2E89 mov edx, [ebp+var_58]
.text:004E2E8C push dword ptr [edx+31Ch] ; hKey
.text:004E2E92 call RegSetValueExA
.text:004E2E97 mov ecx, [ebp+var_58]
.text:004E2E9A push dword ptr [ecx+31Ch] ; hKey
.text:004E2EA0 call RegCloseKey
.text:004E2EA5 push 40h ; uType
.text:004E2EA7 push offset aVSV ; lpCaption '注册信息'
.text:004E2EAC push offset aVSJZGb ; lpText '注册成功,感谢您的支持!'
.text:004E2EB1 mov eax, [ebp+var_58]
.text:004E2EB4 call Controls::TWinControl::GetHandle(void)
.text:004E2EB9 push eax ; hWnd
.text:004E2EBA call MessageBoxA
.text:004E2EBF dec [ebp+var_38]
.text:004E2EC2 lea eax, [ebp+var_24]
.text:004E2EC5 mov edx, 2
.text:004E2ECA call System::AnsiString::~AnsiString(void)
.text:004E2ECF dec [ebp+var_38]
.text:004E2ED2 lea eax, [ebp+var_20]
.text:004E2ED5 mov edx, 2
.text:004E2EDA call System::AnsiString::~AnsiString(void)
.text:004E2EDF dec [ebp+var_38]
.text:004E2EE2 lea eax, [ebp+var_1C]
.text:004E2EE5 mov edx, 2
.text:004E2EEA call System::AnsiString::~AnsiString(void)
.text:004E2EEF mov [ebp+var_44], 14h
.text:004E2EF5
.text:004E2EF5 loc_4E2EF5:
.text:004E2EF5 inc [ebp+var_68] ; 高度索引加1
.text:004E2EF8
.text:004E2EF8 loc_4E2EF8:
.text:004E2EF8 mov ecx, [ebp+var_58]
.text:004E2EFB mov eax, [ecx+300h]
.text:004E2F01 mov eax, [eax+168h]
.text:004E2F07 call unknown_libname_633 ; 加载一个图片
.text:004E2F0C mov [ebp+var_6C], eax
.text:004E2F0F mov eax, [ebp+var_6C]
.text:004E2F12 mov edx, [eax]
.text:004E2F14 call dword ptr [edx+20h] ; Graphics::TBitmap::GetHeight(void)
.text:004E2F17 cmp eax, [ebp+var_68] ; var_68 小于等于 图片高度 则循环
.text:004E2F1A jge loc_4E2C06
.text:004E2F20 inc [ebp+var_60] ; 宽度索引加1
.text:004E2F23
.text:004E2F23 loc_4E2F23:
.text:004E2F23 mov ecx, [ebp+var_58]
.text:004E2F26 mov eax, [ecx+300h]
.text:004E2F2C mov eax, [eax+168h]
.text:004E2F32 call unknown_libname_633 ; 加载一个图片
.text:004E2F37 mov [ebp+var_64], eax
.text:004E2F3A mov eax, [ebp+var_64]
.text:004E2F3D mov edx, [eax]
.text:004E2F3F call dword ptr [edx+2Ch] ; Graphics::TBitmap::GetWidth(void)
.text:004E2F42 cmp eax, [ebp+var_60] ; var_60 小于等于 图片宽度 则循环
.text:004E2F45 jge loc_4E2BF6
.text:004E2F4B mov ecx, [ebp+var_58]
.text:004E2F4E push dword ptr [ecx+318h] ; hKey
.text:004E2F54 call RegCloseKey
.text:004E2F59 dec [ebp+var_38]
.text:004E2F5C lea eax, [ebp+var_8]
.text:004E2F5F mov edx, 2
.text:004E2F64 call System::AnsiString::~AnsiString(void)
.text:004E2F69 dec [ebp+var_38]
.text:004E2F6C lea eax, [ebp+var_4]
.text:004E2F6F mov edx, 2
.text:004E2F74 call System::AnsiString::~AnsiString(void)
.text:004E2F79 mov [ebp+var_44], 0
.text:004E2F7F
.text:004E2F7F loc_4E2F7F:
.text:004E2F7F mov eax, [ebp+var_58]
.text:004E2F82 call Forms::TCustomForm::Close(void)
.text:004E2F87 mov edx, [ebp+var_54]
.text:004E2F8A mov large fs:0, edx
.text:004E2F91 pop ebx
.text:004E2F92 mov esp, ebp
.text:004E2F94 pop ebp
.text:004E2F95 retn
.text:004E2F95 _TForm9_SpeedButton2Click endp
上面这段算法其实就是把注册码的第三段转换成十六进制数字然后减去副本序号前六位转换成的十六进制数字,结果作为颜色值.然后在一个图片中找是否有这个颜色值.如果有则注册成功,否则注册失败.可见注册码并不是唯一的.
要想做注册机找到这个图片是必须的.跟踪一下程序可以知道这个图片的尺寸是88*64,在资源RCDdata -> TForm9中有两个image控件,,一个是image1,尺寸是122*216,另一个是image3,尺寸是88*64,显然就是image3了.但在资源中是文本格式的.用exescope导不出图片来.怎么办呢?
想想既然是borland的东西,还是由他自己来对付比较好.用delphi建一个工程,新建一个尺寸大一点的窗体,然后把从object Image3: TImage 到 end 之间的文本全部拷贝出来,复制到窗体中.立刻就可以看到是一个人的头像(不会是作者吧?).编译一下,却提示错误.这个好办,在窗体中添加一个image控件,然后再删除就可以了.
有了图片做注册机就好办了.这个注册算法太简单了就不写代码了.感兴趣的自己试试.
======================================================================
感谢: 所有RCT的成员,所有的朋友,还有您:)
======================================================================
[全文完]
【作者】forever[RCT]
【语言】borland c++ builder
【保护】注册码
【工具】dede,ida
【简介】
《录屏》 是一款用于将屏幕操作过程及解说录制为演示文件的好工具。记录时采用音频与视频同步,并分开记录为*.AVI(音频),*.AVI.XXX(视频)。便于对文件*.AVI.XXX进行的编辑,可发布的格式为标准的AVI文件,或FLASH文件。
【正文】
这个软件的算法超级简单,但是做注册机却是让我头疼了一阵子.dede中载入,很容易找到下面的关键点。
.text:004E2AE4 _TForm9_SpeedButton2Click proc near ; DATA XREF: .data:0054471Eo
.text:004E2AE4
.text:004E2AE4 Data = byte ptr -8Ch
.text:004E2AE4 var_6C = dword ptr -6Ch
.text:004E2AE4 var_68 = dword ptr -68h
.text:004E2AE4 var_64 = dword ptr -64h
.text:004E2AE4 var_60 = dword ptr -60h
.text:004E2AE4 var_5C = dword ptr -5Ch
.text:004E2AE4 var_58 = dword ptr -58h
.text:004E2AE4 var_54 = dword ptr -54h
.text:004E2AE4 var_44 = word ptr -44h
.text:004E2AE4 var_38 = dword ptr -38h
.text:004E2AE4 var_30 = dword ptr -30h
.text:004E2AE4 var_2C = dword ptr -2Ch
.text:004E2AE4 var_28 = dword ptr -28h
.text:004E2AE4 var_24 = dword ptr -24h
.text:004E2AE4 var_20 = dword ptr -20h
.text:004E2AE4 var_1C = dword ptr -1Ch
.text:004E2AE4 var_18 = dword ptr -18h
.text:004E2AE4 var_14 = dword ptr -14h
.text:004E2AE4 var_10 = dword ptr -10h
.text:004E2AE4 var_C = dword ptr -0Ch
.text:004E2AE4 var_8 = dword ptr -8
.text:004E2AE4 var_4 = dword ptr -4
.text:004E2AE4
.text:004E2AE4 push ebp
.text:004E2AE5 mov ebp, esp
.text:004E2AE7 add esp, 0FFFFFF74h
.text:004E2AED push ebx
.text:004E2AEE mov [ebp+var_5C], edx
.text:004E2AF1 mov [ebp+var_58], eax
.text:004E2AF4 mov eax, offset stru_5441B4
.text:004E2AF9 call @__InitExceptBlockLDTC
.text:004E2AFE mov edx, [ebp+var_58]
.text:004E2B01 add edx, 318h
.text:004E2B07 push edx ; phkResult
.text:004E2B08 push 2001Fh ; samDesired
.text:004E2B0D push 0 ; ulOptions
.text:004E2B0F push offset aSoftwareTrac_7 ; lpSubKey
.text:004E2B14 push 80000001h ; hKey
.text:004E2B19 call RegOpenKeyExA
.text:004E2B1E test eax, eax
.text:004E2B20 jnz loc_4E2F7F
.text:004E2B26 mov ecx, [ebp+var_58]
.text:004E2B29 mov dword ptr [ecx+328h], 6
.text:004E2B33 mov eax, [ebp+var_58]
.text:004E2B36 add eax, 328h
.text:004E2B3B push eax ; lpcbData
.text:004E2B3C lea edx, [ebp+Data]
.text:004E2B42 push edx ; lpData
.text:004E2B43 mov ecx, [ebp+var_58]
.text:004E2B46 add ecx, 324h
.text:004E2B4C push ecx ; lpType
.text:004E2B4D push 0 ; lpReserved
.text:004E2B4F push offset aMm_0 ; lpValueName
.text:004E2B54 mov eax, [ebp+var_58]
.text:004E2B57 push dword ptr [eax+318h] ; hKey
.text:004E2B5D call RegQueryValueExA ; 查询出副本序号
.text:004E2B62 mov [ebp+var_44], 8
.text:004E2B68 lea eax, [ebp+var_4]
.text:004E2B6B call unknown_libname_196
.text:004E2B70 inc [ebp+var_38]
.text:004E2B73 mov [ebp+var_44], 14h
.text:004E2B79 mov [ebp+var_44], 20h
.text:004E2B7F lea eax, [ebp+var_8]
.text:004E2B82 call unknown_libname_196
.text:004E2B87 inc [ebp+var_38]
.text:004E2B8A mov [ebp+var_44], 14h
.text:004E2B90 mov [ebp+var_44], 2Ch
.text:004E2B96 lea edx, [ebp+Data]
.text:004E2B9C lea eax, [ebp+var_C]
.text:004E2B9F call sub_4F3190
.text:004E2BA4 inc [ebp+var_38]
.text:004E2BA7 lea edx, [ebp+var_C]
.text:004E2BAA lea eax, [ebp+var_4] ; 赋值到这里
.text:004E2BAD call System::AnsiString::operator=(System::AnsiString &)
.text:004E2BB2 dec [ebp+var_38]
.text:004E2BB5 lea eax, [ebp+var_C]
.text:004E2BB8 mov edx, 2
.text:004E2BBD call System::AnsiString::~AnsiString(void)
.text:004E2BC2 lea eax, [ebp+var_4]
.text:004E2BC5 call System::AnsiString::Length(void)
.text:004E2BCA mov ecx, eax
.text:004E2BCC add ecx, -6
.text:004E2BCF lea eax, [ebp+var_4]
.text:004E2BD2 mov edx, 7
.text:004E2BD7 call System::AnsiString::Delete(int,int)
.text:004E2BDC mov edx, eax ; 取前6个字符
.text:004E2BDE lea eax, [ebp+var_8]
.text:004E2BE1 call System::AnsiString::operator=(System::AnsiString &)
.text:004E2BE6 xor ecx, ecx
.text:004E2BE8 mov [ebp+var_60], ecx ; var_60清零
.text:004E2BEB mov [ebp+var_44], 14h
.text:004E2BF1 jmp loc_4E2F23
.text:004E2BF6 loc_4E2BF6:
.text:004E2BF6 xor eax, eax
.text:004E2BF8 mov [ebp+var_68], eax ; var_68 清零
.text:004E2BFB mov [ebp+var_44], 14h
.text:004E2C01 jmp loc_4E2EF8
.text:004E2C06 loc_4E2C06:
.text:004E2C06 mov [ebp+var_44], 38h
.text:004E2C0C lea eax, [ebp+var_10]
.text:004E2C0F call unknown_libname_196
.text:004E2C14 mov edx, eax
.text:004E2C16 inc [ebp+var_38]
.text:004E2C19 mov ecx, [ebp+var_58]
.text:004E2C1C mov eax, [ecx+2F8h]
.text:004E2C22 call TControl::GetText(void) ; 取第3组注册码
.text:004E2C27 lea edx, [ebp+var_10]
.text:004E2C2A push edx
.text:004E2C2B lea eax, [ebp+var_14]
.text:004E2C2E call unknown_libname_196
.text:004E2C33 mov ecx, eax
.text:004E2C35 inc [ebp+var_38]
.text:004E2C38 mov eax, offset a0x ; "0x"
.text:004E2C3D pop edx
.text:004E2C3E call System::operator+(char *,System::AnsiString &)
.text:004E2C43 lea eax, [ebp+var_14]
.text:004E2C46 mov eax, [eax]
.text:004E2C48 call Sysutils::StrToInt(System::AnsiString)
.text:004E2C4D mov ebx, eax ; 转成16进制数字在ebx
.text:004E2C4F lea eax, [ebp+var_18]
.text:004E2C52 call unknown_libname_196
.text:004E2C57 mov ecx, eax
.text:004E2C59 inc [ebp+var_38]
.text:004E2C5C lea edx, [ebp+var_8] ; 副版本号
.text:004E2C5F mov eax, offset a0x_0 ; "0x"
.text:004E2C64 call System::operator+(char *,System::AnsiString &)
.text:004E2C69 lea eax, [ebp+var_18]
.text:004E2C6C mov eax, [eax]
.text:004E2C6E call Sysutils::StrToInt(System::AnsiString)
.text:004E2C73 sub ebx, eax ; 第3组注册码减去副版本号
.text:004E2C75 mov edx, [ebp+var_58]
.text:004E2C78 mov ecx, [edx+300h]
.text:004E2C7E mov eax, [ecx+168h]
.text:004E2C84 call unknown_libname_633
.text:004E2C89 call Graphics::TBitmap::GetCanvas(void)
.text:004E2C8E mov ecx, [ebp+var_68] ; var_68(高度)
.text:004E2C91 mov edx, [ebp+var_60] ; var_60(宽度)
.text:004E2C94 call Graphics::TCanvas::GetPixel(int,int)
.text:004E2C99 cmp ebx, eax ; 取点颜色比较
.text:004E2C9B setz al
.text:004E2C9E and eax, 1
.text:004E2CA1 push eax
.text:004E2CA2 dec [ebp+var_38]
.text:004E2CA5 lea eax, [ebp+var_18]
.text:004E2CA8 mov edx, 2
.text:004E2CAD call System::AnsiString::~AnsiString(void)
.text:004E2CB2 dec [ebp+var_38]
.text:004E2CB5 lea eax, [ebp+var_14]
.text:004E2CB8 mov edx, 2
.text:004E2CBD call System::AnsiString::~AnsiString(void)
.text:004E2CC2 dec [ebp+var_38]
.text:004E2CC5 lea eax, [ebp+var_10]
.text:004E2CC8 mov edx, 2
.text:004E2CCD call System::AnsiString::~AnsiString(void)
.text:004E2CD2 pop ecx
.text:004E2CD3 test cl, cl
.text:004E2CD5 jz loc_4E2EF5 ; 比较不等这里则跳走
.text:004E2CDB mov [ebp+var_44], 44h
.text:004E2CE1 lea eax, [ebp+var_1C]
.text:004E2CE4 call unknown_libname_196
.text:004E2CE9 inc [ebp+var_38]
.text:004E2CEC mov [ebp+var_44], 50h
.text:004E2CF2 mov [ebp+var_44], 5Ch
.text:004E2CF8 lea eax, [ebp+var_20]
.text:004E2CFB call unknown_libname_196
.text:004E2D00 inc [ebp+var_38]
.text:004E2D03 mov [ebp+var_44], 50h
.text:004E2D09 mov [ebp+var_44], 68h
.text:004E2D0F lea eax, [ebp+var_24]
.text:004E2D12 call unknown_libname_196
.text:004E2D17 inc [ebp+var_38]
.text:004E2D1A mov [ebp+var_44], 50h
.text:004E2D20 mov [ebp+var_44], 74h
.text:004E2D26 lea eax, [ebp+var_28]
.text:004E2D29 call unknown_libname_196
.text:004E2D2E mov edx, eax
.text:004E2D30 inc [ebp+var_38]
.text:004E2D33 mov eax, [ebp+var_60] ; 宽度索引
.text:004E2D36 call Sysutils::IntToStr(int)
.text:004E2D3B lea edx, [ebp+var_28]
.text:004E2D3E lea eax, [ebp+var_1C]
.text:004E2D41 call System::AnsiString::operator=(System::AnsiString &)
.text:004E2D46 dec [ebp+var_38]
.text:004E2D49 lea eax, [ebp+var_28]
.text:004E2D4C mov edx, 2
.text:004E2D51 call System::AnsiString::~AnsiString(void)
.text:004E2D56 mov [ebp+var_44], 80h
.text:004E2D5C lea eax, [ebp+var_2C]
.text:004E2D5F call unknown_libname_196
.text:004E2D64 mov edx, eax
.text:004E2D66 inc [ebp+var_38]
.text:004E2D69 mov eax, [ebp+var_68] ; 高度索引
.text:004E2D6C call Sysutils::IntToStr(int)
.text:004E2D71 lea edx, [ebp+var_2C]
.text:004E2D74 lea eax, [ebp+var_20]
.text:004E2D77 call System::AnsiString::operator=(System::AnsiString &)
.text:004E2D7C dec [ebp+var_38]
.text:004E2D7F lea eax, [ebp+var_2C]
.text:004E2D82 mov edx, 2
.text:004E2D87 call System::AnsiString::~AnsiString(void)
.text:004E2D8C mov [ebp+var_44], 8Ch
.text:004E2D92 mov ecx, [ebp+var_58]
.text:004E2D95 mov eax, [ecx+300h]
.text:004E2D9B mov eax, [eax+168h]
.text:004E2DA1 call unknown_libname_633
.text:004E2DA6 call Graphics::TBitmap::GetCanvas(void)
.text:004E2DAB mov ecx, [ebp+var_68]
.text:004E2DAE mov edx, [ebp+var_60]
.text:004E2DB1 call Graphics::TCanvas::GetPixel(int,int)
.text:004E2DB6 push eax ; 取颜色值
.text:004E2DB7 lea eax, [ebp+var_30]
.text:004E2DBA call unknown_libname_196
.text:004E2DBF mov ecx, eax
.text:004E2DC1 inc [ebp+var_38]
.text:004E2DC4 mov edx, 6
.text:004E2DC9 pop eax
.text:004E2DCA call Sysutils::IntToHex(int,int)
.text:004E2DCF lea edx, [ebp+var_30]
.text:004E2DD2 lea eax, [ebp+var_24]
.text:004E2DD5 call System::AnsiString::operator=(System::AnsiString &)
.text:004E2DDA dec [ebp+var_38]
.text:004E2DDD lea eax, [ebp+var_30]
.text:004E2DE0 mov edx, 2
.text:004E2DE5 call System::AnsiString::~AnsiString(void)
.text:004E2DEA mov ecx, [ebp+var_58]
.text:004E2DED add ecx, 320h
.text:004E2DF3 push ecx ; lpdwDisposition
.text:004E2DF4 mov eax, [ebp+var_58]
.text:004E2DF7 add eax, 31Ch
.text:004E2DFC push eax ; phkResult
.text:004E2DFD push 0 ; lpSecurityAttributes
.text:004E2DFF push 0F003Fh ; samDesired
.text:004E2E04 push 0 ; dwOptions
.text:004E2E06 push offset unk_543F8F ; lpClass
.text:004E2E0B push 0 ; Reserved
.text:004E2E0D push offset aSoftwareTrac_8 ; lpSubKey
.text:004E2E12 push 80000001h ; hKey
.text:004E2E17 call RegCreateKeyExA
.text:004E2E1C lea eax, [ebp+var_1C]
.text:004E2E1F call System::AnsiString::Length(void)
.text:004E2E24 push eax ; cbData
.text:004E2E25 lea eax, [ebp+var_1C]
.text:004E2E28 call System::AnsiString::c_str(void)
.text:004E2E2D push eax ; lpData
.text:004E2E2E push 1 ; dwType
.text:004E2E30 push 0 ; Reserved
.text:004E2E32 push offset aXd ; lpValueName
.text:004E2E37 mov edx, [ebp+var_58]
.text:004E2E3A push dword ptr [edx+31Ch] ; hKey
.text:004E2E40 call RegSetValueExA
.text:004E2E45 lea eax, [ebp+var_20]
.text:004E2E48 call System::AnsiString::Length(void)
.text:004E2E4D push eax ; cbData
.text:004E2E4E lea eax, [ebp+var_20]
.text:004E2E51 call System::AnsiString::c_str(void)
.text:004E2E56 push eax ; lpData
.text:004E2E57 push 1 ; dwType
.text:004E2E59 push 0 ; Reserved
.text:004E2E5B push offset aYd ; lpValueName
.text:004E2E60 mov edx, [ebp+var_58]
.text:004E2E63 push dword ptr [edx+31Ch] ; hKey
.text:004E2E69 call RegSetValueExA
.text:004E2E6E lea eax, [ebp+var_24]
.text:004E2E71 call System::AnsiString::Length(void)
.text:004E2E76 push eax ; cbData
.text:004E2E77 lea eax, [ebp+var_24]
.text:004E2E7A call System::AnsiString::c_str(void)
.text:004E2E7F push eax ; lpData
.text:004E2E80 push 3 ; dwType
.text:004E2E82 push 0 ; Reserved
.text:004E2E84 push offset aCd ; lpValueName
.text:004E2E89 mov edx, [ebp+var_58]
.text:004E2E8C push dword ptr [edx+31Ch] ; hKey
.text:004E2E92 call RegSetValueExA
.text:004E2E97 mov ecx, [ebp+var_58]
.text:004E2E9A push dword ptr [ecx+31Ch] ; hKey
.text:004E2EA0 call RegCloseKey
.text:004E2EA5 push 40h ; uType
.text:004E2EA7 push offset aVSV ; lpCaption '注册信息'
.text:004E2EAC push offset aVSJZGb ; lpText '注册成功,感谢您的支持!'
.text:004E2EB1 mov eax, [ebp+var_58]
.text:004E2EB4 call Controls::TWinControl::GetHandle(void)
.text:004E2EB9 push eax ; hWnd
.text:004E2EBA call MessageBoxA
.text:004E2EBF dec [ebp+var_38]
.text:004E2EC2 lea eax, [ebp+var_24]
.text:004E2EC5 mov edx, 2
.text:004E2ECA call System::AnsiString::~AnsiString(void)
.text:004E2ECF dec [ebp+var_38]
.text:004E2ED2 lea eax, [ebp+var_20]
.text:004E2ED5 mov edx, 2
.text:004E2EDA call System::AnsiString::~AnsiString(void)
.text:004E2EDF dec [ebp+var_38]
.text:004E2EE2 lea eax, [ebp+var_1C]
.text:004E2EE5 mov edx, 2
.text:004E2EEA call System::AnsiString::~AnsiString(void)
.text:004E2EEF mov [ebp+var_44], 14h
.text:004E2EF5
.text:004E2EF5 loc_4E2EF5:
.text:004E2EF5 inc [ebp+var_68] ; 高度索引加1
.text:004E2EF8
.text:004E2EF8 loc_4E2EF8:
.text:004E2EF8 mov ecx, [ebp+var_58]
.text:004E2EFB mov eax, [ecx+300h]
.text:004E2F01 mov eax, [eax+168h]
.text:004E2F07 call unknown_libname_633 ; 加载一个图片
.text:004E2F0C mov [ebp+var_6C], eax
.text:004E2F0F mov eax, [ebp+var_6C]
.text:004E2F12 mov edx, [eax]
.text:004E2F14 call dword ptr [edx+20h] ; Graphics::TBitmap::GetHeight(void)
.text:004E2F17 cmp eax, [ebp+var_68] ; var_68 小于等于 图片高度 则循环
.text:004E2F1A jge loc_4E2C06
.text:004E2F20 inc [ebp+var_60] ; 宽度索引加1
.text:004E2F23
.text:004E2F23 loc_4E2F23:
.text:004E2F23 mov ecx, [ebp+var_58]
.text:004E2F26 mov eax, [ecx+300h]
.text:004E2F2C mov eax, [eax+168h]
.text:004E2F32 call unknown_libname_633 ; 加载一个图片
.text:004E2F37 mov [ebp+var_64], eax
.text:004E2F3A mov eax, [ebp+var_64]
.text:004E2F3D mov edx, [eax]
.text:004E2F3F call dword ptr [edx+2Ch] ; Graphics::TBitmap::GetWidth(void)
.text:004E2F42 cmp eax, [ebp+var_60] ; var_60 小于等于 图片宽度 则循环
.text:004E2F45 jge loc_4E2BF6
.text:004E2F4B mov ecx, [ebp+var_58]
.text:004E2F4E push dword ptr [ecx+318h] ; hKey
.text:004E2F54 call RegCloseKey
.text:004E2F59 dec [ebp+var_38]
.text:004E2F5C lea eax, [ebp+var_8]
.text:004E2F5F mov edx, 2
.text:004E2F64 call System::AnsiString::~AnsiString(void)
.text:004E2F69 dec [ebp+var_38]
.text:004E2F6C lea eax, [ebp+var_4]
.text:004E2F6F mov edx, 2
.text:004E2F74 call System::AnsiString::~AnsiString(void)
.text:004E2F79 mov [ebp+var_44], 0
.text:004E2F7F
.text:004E2F7F loc_4E2F7F:
.text:004E2F7F mov eax, [ebp+var_58]
.text:004E2F82 call Forms::TCustomForm::Close(void)
.text:004E2F87 mov edx, [ebp+var_54]
.text:004E2F8A mov large fs:0, edx
.text:004E2F91 pop ebx
.text:004E2F92 mov esp, ebp
.text:004E2F94 pop ebp
.text:004E2F95 retn
.text:004E2F95 _TForm9_SpeedButton2Click endp
上面这段算法其实就是把注册码的第三段转换成十六进制数字然后减去副本序号前六位转换成的十六进制数字,结果作为颜色值.然后在一个图片中找是否有这个颜色值.如果有则注册成功,否则注册失败.可见注册码并不是唯一的.
要想做注册机找到这个图片是必须的.跟踪一下程序可以知道这个图片的尺寸是88*64,在资源RCDdata -> TForm9中有两个image控件,,一个是image1,尺寸是122*216,另一个是image3,尺寸是88*64,显然就是image3了.但在资源中是文本格式的.用exescope导不出图片来.怎么办呢?
想想既然是borland的东西,还是由他自己来对付比较好.用delphi建一个工程,新建一个尺寸大一点的窗体,然后把从object Image3: TImage 到 end 之间的文本全部拷贝出来,复制到窗体中.立刻就可以看到是一个人的头像(不会是作者吧?).编译一下,却提示错误.这个好办,在窗体中添加一个image控件,然后再删除就可以了.
有了图片做注册机就好办了.这个注册算法太简单了就不写代码了.感兴趣的自己试试.
======================================================================
感谢: 所有RCT的成员,所有的朋友,还有您:)
======================================================================
[全文完]
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
看原图
赞赏
雪币:
留言: