• 标 题:Beyond Compare v1.9d (2千字)
  • 作 者:Blowfish
  • 时 间:2001-2-4 17:27:23
  • 链 接:http://bbs.pediy.com

http://www.scootersoftware.com/bc19d.exe

这是一个非常好用的用来比较、同步文件和目录的工具,特别是用来比较不同版本的源程序之间的不同(VC自带的WinDiff也可以,SourceSafe这种版本控制工具自然也有这种比较功能),应属于程序员的必备工具之一。

破解非常简单,跟踪策略(也就是选择断点的策略)有这么几种:
1、用GetPrivateProfileStringA跟它启动时的判断,因注册码在INI文件种;
2、用hmemcpy跟它输入注册码后的判断;
3、用W32Dasm、DeDe、IDA等反汇编之后利用string reference来选择合适的断点。比如用IDA反汇编之后可以看到_TMainForm_Register1Click( )这个成员函数,这是输入注册码并点击“Register”按钮之后所要执行的回调函数。

最终将注意力集中到如下生成并判断注册码的地方:

sub_4A9CDC    proc near        ; CODE XREF: sub_4A8678+932
                    ; _TMainForm_Register1Click

var_C        = dword    ptr -0Ch
var_8        = dword    ptr -8
var_4        = dword    ptr -4

        push    ebp
        mov    ebp, esp
        push    0
        push    0
        push    0
        push    ebx
        xor    eax, eax
        push    ebp
        push    offset loc_4A9D6B
        push    dword ptr fs:[eax]
        mov    fs:[eax], esp
        push    offset _str_Beyond_Compare_.Text
        push    ds:dword_4B6EB4
        push    ds:dword_4B6EB8
        lea    eax, [ebp+var_8]
        mov    edx, 3
        call    @System@@LStrCatN$qqrv ; System    __linkproc__ LStrCatN(void)
        mov    eax, [ebp+var_8]  //串起来的串
        call    sub_4A72D0        //返回生成的数
        lea    ecx, [ebp+var_4]
        mov    edx, 8
        call    @Sysutils@IntToHex$qqrii ; Sysutils::IntToHex(int,int)
        mov    eax, [ebp+var_4]
        push    eax
        lea    eax, [ebp+var_C]
        mov    edx, offset byte_4B6EEC
        call    unknown_libname_36
        mov    edx, [ebp+var_C]
        pop    eax
        call    @Sysutils@CompareText$qqrx17System@AnsiStringxt1 ; Sysutils::CompareText(System::AnsiString,System::AnsiString)
        test    eax, eax
        setz    ds:byte_4B6EB2
        mov    bl, ds:byte_4B6EB2
        xor    eax, eax
        pop    edx
        pop    ecx
        pop    ecx
        mov    fs:[eax], edx
        push    offset loc_4A9D72

loc_4A9D5D:                ; CODE XREF: sub_4A9CDC+94
        lea    eax, [ebp+var_C]
        mov    edx, 3
        call    sub_403C9C
        retn


loc_4A9D6B:                ; DATA XREF: sub_4A9CDC+D
        jmp    @System@@HandleFinally$qqrv ; System __linkproc__ HandleFinally(void)

        jmp    short loc_4A9D5D


loc_4A9D72:                ; DATA XREF: sub_4A9CDC+7C
        mov    eax, ebx
        pop    ebx
        mov    esp, ebp
        pop    ebp
        retn
sub_4A9CDC    endp


        align 4
_str_Beyond_Compare_ dd    0FFFFFFFFh        ; _top ; DATA XREF: sub_4A9CDC+18
        dd 16                ; Len
        db 'Beyond Compare 1',0          ; Text

显然,它先把字符串    “Beyond Compare 1”和UserName、Organization用LSrtCatN( )串接起来,再用串起来的这个串鼓捣出一个数来,用IntToHex( )将该数转换成十六进制串,最后用CompareText( )来比较注册码。有兴趣的自己写个注册机。

BF