能力值:
( LV12,RANK:260 )
|
-
-
3 楼
1,用万能断点法可以得到密码验证地址的断点.(API 的plugins加trace也可以得到,用DEDE的话就更简单了)
2,输入用户名为zenghw 注册码为5705312,分析如下
00401B7A . 50 push eax
00401B7B . E8 44FDFFFF call 004018C4 ; //跟进去后得到用户名zenghw 各个字符除以10的余数和 这里==0x13
00401B80 . 59 pop ecx
00401B81 . 8BF0 mov esi, eax
00401B83 . 8D45 B0 lea eax, dword ptr [ebp-50] ; //password
00401B86 . 50 push eax
00401B87 > . E8 F8620500 call 00457E84 ; //获得password长度
00401B8C . 59 pop ecx
00401B8D . 8BD0 mov edx, eax
00401B8F . 33DB xor ebx, ebx
00401B91 . 8D45 B0 lea eax, dword ptr [ebp-50]
00401B94 > 0FBE08 movsx ecx, byte ptr [eax]
00401B97 . 83F9 30 cmp ecx, 30 ; //判断password各字符是否 >=0 ,即password是否为数字
00401B9A . 7C 09 jl short 00401BA5
00401B9C . 83F9 39 cmp ecx, 39 ; //是否 <=9
00401B9F . 7F 04 jg short 00401BA5
00401BA1 . 43 inc ebx
00401BA2 . 40 inc eax
00401BA3 .^ EB EF jmp short 00401B94
00401BA5 > 3BDA cmp ebx, edx
00401BA7 . 0F85 89000000 jnz 00401C36
00401BAD . 85D2 test edx, edx
00401BAF . 0F84 81000000 je 00401C36
00401BB5 . 83FA 07 cmp edx, 7 ; //判断password长度是否 >=7
00401BB8 . 7C 7C jl short 00401C36
00401BBA . 66:C745 E0 08>mov word ptr [ebp-20], 8
00401BC0 . 66:C745 E0 2C>mov word ptr [ebp-20], 2C ;
00401BC6 . 8B45 F4 mov eax, dword ptr [ebp-C] ; //password
00401BC9 > . E8 8E090100 call 0041255C ; //这个函数把十进制的password转换为十六进制
00401BCE . 50 push eax
00401BCF . E8 2CFDFFFF call 00401900 ; //或上5201314 后值== 1853C2
00401BD4 . 59 pop ecx
00401BD5 . 56 push esi ; //用户zenghw除以10的余数和
00401BD6 . 50 push eax ; //或上5201314的值 == 1853C2
00401BD7 . E8 34FDFFFF call 00401910 ; //关键CALL
00401BDC . 83C4 08 add esp, 8
00401BDF . 8BD0 mov edx, eax
00401BE1 . 85D2 test edx, edx ;
00401BE3 . 7C 05 jl short 00401BEA
00401BE5 . 83FA 0F cmp edx, 0F
00401BE8 . 7E 02 jle short 00401BEC
00401BEA > 33D2 xor edx, edx
00401BEC > A1 24694600 mov eax, dword ptr [466924]
00401BF1 . 6A 00 push 0
00401BF3 . 8B0CD5 902146>mov ecx, dword ptr [edx*8+462190] ; //对话框标题字符串,字符串与EDX地址相关
00401BFA . 8B14D5 8C2146>mov edx, dword ptr [edx*8+46218C]
00401C01 . 8B00 mov eax, dword ptr [eax]
00401C03 > . E8 14F50500 call 0046111C ; //显示窗口
关键CALL里面为浮点运算,我还没搞明白,太晚了,明天继续搞!
当运行到00401BF3 行时,按ENTER键,得到其地址数据为"加油啊,兄弟",上下拉动,也可以找到牛啊,成功的字符串,其中"成功"的字符串为004622F3,再从004621D8地址知道,其数据指向字符串004622F3(因为ds:[00462190]=00462259,所以再翻到00462190即可看到004622E9数据的地址 ), 那么 (0X004621D8 - 0X00462190) / 0X8 =0X09, 因此EDX应该为0x09。
以上只是破解分析,那个关键CALL我还没搞懂,望大牛指点一二!
|
能力值:
( LV4,RANK:50 )
|
-
-
10 楼
00401ABC . 55 push ebp ; 入口(_TForm1_btnRegClick)
00401ABD . 8BEC mov ebp, esp ; 栈指针给帧指针
00401ABF . 81C4 00FEFFFF add esp, -200 ; 开辟局部变量空间
00401AC5 . 53 push ebx ; 入栈
00401AC6 . 56 push esi ; ESI入栈
00401AC7 . 57 push edi ; EDI入栈
00401AC8 . 8BD8 mov ebx, eax ; EAX赋值给EBX
00401ACA . B8 30244600 mov eax, 00462430 ; 地址00462430给EAX
00401ACF . E8 38670500 call 0045820C ; 调用__InitExceptBlockLDTC
00401AD4 . BE DC214600 mov esi, 004621DC ; 将地址004621DC给ESI
00401AD9 . 8DBD 40FEFFFF lea edi, dword ptr [ebp-1C0] ; 将EBP-1C0 地址传递给DDI
00401ADF . B9 64000000 mov ecx, 64 ; 100 给ECX
00401AE4 . F3:A5 rep movs dword ptr es:[edi], d>; 将ESI得数据复制到EDI中,长度0X64
00401AE6 . 66:C745 E0 14>mov word ptr [ebp-20], 14 ; 将0x14填入局部空间EBP-20处
00401AEC . 33C0 xor eax, eax ; EAX清0
00401AEE . 8945 F8 mov dword ptr [ebp-8], eax ; 局部变量2清 0(存放用户名指针)
00401AF1 . 8D55 F8 lea edx, dword ptr [ebp-8] ; 局部变量2地址给EDX
00401AF4 . FF45 EC inc dword ptr [ebp-14] ; 将EBP-14内容加1
00401AF7 . 8B83 F8020000 mov eax, dword ptr [ebx+2F8] ; 将EBX+258 地址单位内容给EAX
00401AFD . E8 6EA00400 call 0044BB70 ; 调用TControl::GetText(void)取得用户名
00401B02 . 66:C745 E0 08>mov word ptr [ebp-20], 8 ; 将8 填入 EBP-20地址单元
00401B08 . 66:C745 E0 20>mov word ptr [ebp-20], 20 ; 将20填入EBP-20 地址单元
00401B0E . 33D2 xor edx, edx ; EDX清0
00401B10 . 8955 F4 mov dword ptr [ebp-C], edx ; 将局部变量3 清0(存放注册码首地址指针)
00401B13 . 8D55 F4 lea edx, dword ptr [ebp-C] ; 将变量3地址给EDX
00401B16 . FF45 EC inc dword ptr [ebp-14] ; 将EBP-14内容加1
00401B19 . 8B83 FC020000 mov eax, dword ptr [ebx+2FC] ; 将EBX+2FC 地址单位内容给EAX
00401B1F . E8 4CA00400 call 0044BB70 ; 调用TControl::GetText(void) 取得注册码
00401B24 . 66:C745 E0 08>mov word ptr [ebp-20], 8 ; 将8 填入 EBP-20地址单元
00401B2A . BE 6C234600 mov esi, 0046236C ; 将0046236C给ESI
00401B2F . 8DBD 20FEFFFF lea edi, dword ptr [ebp-1E0] ; 将EBP-1E0值给EDI
00401B35 . B9 07000000 mov ecx, 7 ; ECX赋值为7
00401B3A . F3:A5 rep movs dword ptr es:[edi], d>; 将ESI为源地址 EDI为目标地址 长度为7的DWORD数据进行复制
00401B3C . 66:A5 movs word ptr es:[edi], word pt>; 在复制最后一个WORD
00401B3E . BE 8A234600 mov esi, 0046238A ; 将0046238A给ESI
00401B43 . 8DBD 00FEFFFF lea edi, dword ptr [ebp-200] ; 将EBP-200值给EDI
00401B49 . B9 07000000 mov ecx, 7 ; ECX赋值为7
00401B4E . F3:A5 rep movs dword ptr es:[edi], d>; 将ESI为源地址 EDI为目标地址 长度为7的DWORD数据进行复制
00401B50 . 66:A5 movs word ptr es:[edi], word pt>; 在复制最后一个WORD
00401B52 . 837D F4 00 cmp dword ptr [ebp-C], 0 ; 比较局部变量3是否为0
00401B56 . 74 05 je short 00401B5D ; 等于 0 则跳转00401b5d
00401B58 . 8B45 F4 mov eax, dword ptr [ebp-C] ; 这里EAX实际上是注册码首地址
00401B5B . EB 05 jmp short 00401B62 ; 无条件跳到00401B62
00401B5D > B8 AC234600 mov eax, 004623AC ; 将004623AC给EAX
00401B62 > 8BF8 mov edi, eax ; 将注册码给EDI
00401B64 . 33C0 xor eax, eax ; EAX清0
00401B66 . 83C9 FF or ecx, FFFFFFFF ; ECX给FFFFFFFF
00401B69 . 8DB5 20FEFFFF lea esi, dword ptr [ebp-1E0] ; 将EBP-1E0值给ESI
00401B6F . F2:AE repne scas byte ptr es:[edi]
00401B71 . F7D1 not ecx ; 实际上取得注册码长度
00401B73 . 2BF9 sub edi, ecx ; 将EDI指针复原到首地址
00401B75 . 8BD1 mov edx, ecx ; 将长度ECX复制给EDX
00401B77 . 87F7 xchg edi, esi ; 交换ESI 和EDI内容
00401B79 . C1E9 02 shr ecx, 2 ; 逻辑右移2位 其实是除以4
00401B7C . 8BC7 mov eax, edi ; EDI给EAX
00401B7E . F3:A5 rep movs dword ptr es:[edi], d>; 实际上将注册码复制到EDI为首地址的内存单元里面
00401B80 . 8BCA mov ecx, edx ; 长度给ECX
00401B82 . 83E1 03 and ecx, 3 ; 与3
00401B85 . F3:A4 rep movs byte ptr es:[edi], by>
00401B87 . 837D F8 00 cmp dword ptr [ebp-8], 0 ; 判断局部变量是否为0
00401B8B . 74 05 je short 00401B92 ; 等于0 则跳转00401B92
00401B8D . 8B45 F8 mov eax, dword ptr [ebp-8] ; 这里实际将注册码首地址给EAX
00401B90 . EB 05 jmp short 00401B97 ; 无条件跳转00401B97
00401B92 > B8 AD234600 mov eax, 004623AD ; 将004623AD给EAX
00401B97 > 8BF8 mov edi, eax ; 将用户名首地址给EDI
00401B99 . 33C0 xor eax, eax ; EAX清0
00401B9B . 83C9 FF or ecx, FFFFFFFF ; ECX复制为FFFFFFFF
00401B9E . 8DB5 00FEFFFF lea esi, dword ptr [ebp-200] ; 将EBP-100值给ESI
00401BA4 . F2:AE repne scas byte ptr es:[edi]
00401BA6 . F7D1 not ecx ; 实际上求用户名的长度
00401BA8 . 2BF9 sub edi, ecx ; 恢复EDI为用户名首地址
00401BAA . 8BD1 mov edx, ecx ; 长度给EDX
00401BAC . 87F7 xchg edi, esi ; 将EDI ESI内容交换
00401BAE . C1E9 02 shr ecx, 2 ; 逻辑右移
00401BB1 . 8BC7 mov eax, edi ; 将EDI给EAX
00401BB3 . F3:A5 rep movs dword ptr es:[edi], d>; 将EDI复制到ESI中
00401BB5 . 8BCA mov ecx, edx
00401BB7 . 8D85 00FEFFFF lea eax, dword ptr [ebp-200] ; 复制原则是按DWORD位单位来高速复制
00401BBD . 83E1 03 and ecx, 3
00401BC0 . F3:A4 rep movs byte ptr es:[edi], by>; 实际上复制剩余的字符
00401BC2 . 50 push eax ; 用户名压栈
00401BC3 . E8 10FDFFFF call 004018D8 ; 调用模块004018D8
00401BC8 . 59 pop ecx ; 将用户名首地址弹出给ECX 这时EAX是1A
00401BC9 . 8BF0 mov esi, eax ; 将用户名字符串首地址给ESI
00401BCB . 8D85 20FEFFFF lea eax, dword ptr [ebp-1E0] ; 将注册码首地址给EAX
00401BD1 . 50 push eax ; 注册码首地址压栈
00401BD2 . E8 F9630500 call 00457FD0 ; 调用模块00457FD2(strlen) 长度存放EAX
00401BD7 . 59 pop ecx ; 将注册码首地址给ECX
00401BD8 . 8BD8 mov ebx, eax ; 长度给EBX
00401BDA . 33C9 xor ecx, ecx ; ECX清0
00401BDC . 8D85 20FEFFFF lea eax, dword ptr [ebp-1E0] ; 实际上将注册码首地址给EAX
00401BE2 > 0FBE10 movsx edx, byte ptr [eax]
00401BE5 . 83FA 30 cmp edx, 30 ; 这里比较是否是数字
00401BE8 . 7C 09 jl short 00401BF3
00401BEA . 83FA 39 cmp edx, 39
00401BED . 7F 04 jg short 00401BF3
00401BEF . 41 inc ecx
00401BF0 . 40 inc eax
00401BF1 .^ EB EF jmp short 00401BE2 ; 这里循环扫描是否数字
00401BF3 > 3BCB cmp ecx, ebx
00401BF5 . 0F85 48010000 jnz 00401D43 ; 如果里面有一位不是数字则 跳转00401D43
00401BFB . 85DB test ebx, ebx
00401BFD . 0F84 40010000 je 00401D43 ; 等于0 跳00401D43
00401C03 . 83FB 07 cmp ebx, 7 ; 比较注册码是否小于7
00401C06 . 0F8C 37010000 jl 00401D43 ; 如果小于则跳转00401D43
00401C0C . 66:C745 E0 08>mov word ptr [ebp-20], 8 ; 将8赋值给EBP-20地址单元
00401C12 . 66:C745 E0 2C>mov word ptr [ebp-20], 2C ; 将2C赋值给EBP-20
00401C18 . 8B45 F4 mov eax, dword ptr [ebp-C] ; 将注册码首地址给EAX
00401C1B . E8 880A0100 call 004126A8 ; 实际上这里调用了StrToInt,将字符转换为整形,结果存入EAX
00401C20 . 50 push eax ; 将用户输入的注册码压栈
00401C21 . E8 EEFCFFFF call 00401914 ; 调用模块00401914(实际上是将0X4F5DA2于注册码转换成整数的结果相与)
00401C26 . 59 pop ecx ; 将注册码弹给ECX
00401C27 . 56 push esi
00401C28 . 50 push eax ; 这里存放与0X4F5DA2后结果
00401C29 . E8 F6FCFFFF call 00401924 ; 这里进行了一堆运算(pow)
00401C2E . 83C4 08 add esp, 8 ; 栈平衡
00401C31 . 8BD8 mov ebx, eax ; 结果送入EBX
00401C33 . 53 push ebx ; EBX压栈
00401C34 . E8 A3FDFFFF call 004019DC
00401C39 . 8BD8 mov ebx, eax
00401C3B . 59 pop ecx ; 结果存入ECX
00401C3C . BE A0214600 mov esi, 004621A0
00401C41 . 8B849D 40FEFF>mov eax, dword ptr [ebp+ebx*4->; 跟到这里飞了 ??? 难道安装了SEH?
//跟到上面进入了系统函数DLL空间,请大牛指点迷津,谢谢
00401C48 . 8BF8 mov edi, eax
00401C4A . 33C0 xor eax, eax
00401C4C . 83C9 FF or ecx, FFFFFFFF
00401C4F . F2:AE repne scas byte ptr es:[edi]
00401C51 . F7D1 not ecx
00401C53 . 2BF9 sub edi, ecx
00401C55 . 8BD1 mov edx, ecx
00401C57 . 87F7 xchg edi, esi
00401C59 . C1E9 02 shr ecx, 2
00401C5C . 8BC7 mov eax, edi
00401C5E . F3:A5 rep movs dword ptr es:[edi], d>
00401C60 . 8BCA mov ecx, edx
00401C62 . 83E1 03 and ecx, 3
00401C65 . F3:A4 rep movs byte ptr es:[edi], by>
00401C67 . 33C0 xor eax, eax
00401C69 . A3 D4214600 mov dword ptr [4621D4], eax
|