能力值:
( LV4,RANK:50 )
|
-
-
2 楼
干掉那个TIMER触发的对话框?
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
对话框很容易干的,就是找出注册码比较困难。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
什么程序 来看下
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
干掉 警示框, 不就是 破解了嗎?
刪去了輸入序號對話框 还是 和 輸入 正確序號 回到同一地址??
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
我找到的关键代码
00401037 . 55 PUSH EBP
00401038 . 8BEC MOV EBP,ESP
0040103A . 6A FF PUSH -1
0040103C . 68 70204000 PUSH crack4.00402070
00401041 . 68 90124000 PUSH <JMP.&MSVCRT._except_handler3> ; SE 处理程序安装
00401046 . 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
0040104C . 50 PUSH EAX
0040104D . 64:8925 00000>MOV DWORD PTR FS:[0],ESP
00401054 . 83EC 28 SUB ESP,28
00401057 . 53 PUSH EBX
00401058 . 56 PUSH ESI
00401059 . 57 PUSH EDI
0040105A . 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
0040105D . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; /s
00401060 . E8 1D020000 CALL <JMP.&MSVCRT.strlen> ; \strlen
00401065 . 59 POP ECX
00401066 . 8BC8 MOV ECX,EAX
00401068 . 894D D0 MOV DWORD PTR SS:[EBP-30],ECX
0040106B . 33DB XOR EBX,EBX
0040106D . BE 10304000 MOV ESI,crack4.00403010 ; ASCII ">RPQ]A"
00401072 . 8D7D D8 LEA EDI,DWORD PTR SS:[EBP-28]
00401075 . A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI>
00401076 . 66:A5 MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]
00401078 . A4 MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
00401079 . 33C0 XOR EAX,EAX
0040107B . 8D7D DF LEA EDI,DWORD PTR SS:[EBP-21]
0040107E . 66:AB STOS WORD PTR ES:[EDI]
00401080 . AA STOS BYTE PTR ES:[EDI]
00401081 . 894D E4 MOV DWORD PTR SS:[EBP-1C],ECX
00401084 . 83F9 06 CMP ECX,6
00401087 . 74 04 JE SHORT crack4.0040108D
00401089 . 33C0 XOR EAX,EAX
0040108B . EB 4A JMP SHORT crack4.004010D7 ; 长度不为6错误返回
0040108D > 895D FC MOV DWORD PTR SS:[EBP-4],EBX
00401090 . 8D85 08000000 LEA EAX,DWORD PTR SS:[EBP+8]
00401096 . FFD0 CALL EAX ; 调用ebp+8指向的函数地址(我执行到这里就出错)
00401098 . EB 32 JMP SHORT crack4.004010CC ; 跳转
0040109A . 6A 01 PUSH 1 ; 貌似永远都不能执行这两句语句?
0040109C . 58 POP EAX
0040109D . C3 RETN
0040109E . 8B65 E8 MOV ESP,DWORD PTR SS:[EBP-18]
004010A1 . 8B5D D0 MOV EBX,DWORD PTR SS:[EBP-30]
004010A4 . 33D2 XOR EDX,EDX
004010A6 . 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
004010A9 . 8D45 D8 LEA EAX,DWORD PTR SS:[EBP-28]
004010AC . 2BF0 SUB ESI,EAX
004010AE > FF4D E4 DEC DWORD PTR SS:[EBP-1C]
004010B1 . 8D4C15 D8 LEA ECX,DWORD PTR SS:[EBP+EDX-28]
004010B5 . 0FBE040E MOVSX EAX,BYTE PTR DS:[ESI+ECX]
004010B9 . 83F0 36 XOR EAX,36
004010BC . 2B45 E4 SUB EAX,DWORD PTR SS:[EBP-1C]
004010BF . 0FBE09 MOVSX ECX,BYTE PTR DS:[ECX]
004010C2 . 2BC8 SUB ECX,EAX
004010C4 . 03D9 ADD EBX,ECX
004010C6 . 42 INC EDX
004010C7 . 83FA 06 CMP EDX,6
004010CA .^ 7C E2 JL SHORT crack4.004010AE
004010CC > 834D FC FF OR DWORD PTR SS:[EBP-4],FFFFFFFF
004010D0 . 33C0 XOR EAX,EAX
004010D2 . 85DB TEST EBX,EBX
004010D4 . 0F94C0 SETE AL
004010D7 > 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
004010DA . 64:890D 00000>MOV DWORD PTR FS:[0],ECX
004010E1 . 5F POP EDI
004010E2 . 5E POP ESI
004010E3 . 5B POP EBX
004010E4 . C9 LEAVE
004010E5 . C3 RETN
我感觉好像这个程序没有真正大注册码。。。
这个判断的函数好像永远都不能返回1
不知哪位解决了的。给讲解一下?
|
能力值:
( LV9,RANK:180 )
|
-
-
7 楼
rabbit
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
楼上真NX!
|
能力值:
( LV9,RANK:140 )
|
-
-
9 楼
个人感觉他的算法有问题
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
点击确定程序就crash了..?
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
什么程序???
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
下载下来看看 我估计是不行的
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
7楼能讲解下吗,太谢谢了。
|
能力值:
( LV9,RANK:180 )
|
-
-
14 楼
玩的是 _except_handler3
详情我就不讲了. 有兴趣的上 Google.
安装
0040103C . 68 70204000 push 00402070
00401041 . 68 90124000 push <jmp.&MSVCRT._except_handler3>
00402070 FF FF FF FF 9A 10 40 00 9E 10 40 00 00 00 00 00
确认user输入为6个字节后, 引发例外
00401096 . FFD0 CALL EAX
先来这里(可先下个软断即知)
0040109A . 6A 01 push 1
0040109C . 58 pop eax
0040109D . C3 ret
再来这里(可先下个软断即知), 同时检查注册码
0040109E . 8B65 E8 mov esp, [ebp-18] ;待會要直接回到 00401236
004010A1 . 8B5D D0 mov ebx, [ebp-30]
004010A4 . 33D2 xor edx, edx
004010A6 . 8B75 08 mov esi, [ebp+8]
004010A9 . 8D45 D8 lea eax, [ebp-28]
004010AC . 2BF0 sub esi, eax
004010AE > FF4D E4 dec dword ptr [ebp-1C]
004010B1 . 8D4C15 D8 lea ecx, [ebp+edx-28]
004010B5 . 0FBE040E movsx eax, byte ptr [esi+ecx]
004010B9 . 83F0 36 xor eax, 36
004010BC . 2B45 E4 sub eax, [ebp-1C]
004010BF . 0FBE09 movsx ecx, byte ptr [ecx]
004010C2 . 2BC8 sub ecx, eax
004010C4 . 03D9 add ebx, ecx
004010C6 . 42 inc edx
004010C7 . 83FA 06 cmp edx, 6
004010CA .^ 7C E2 jl short 004010AE
004010CC > 834D FC FF or dword ptr [ebp-4], FFFFFFFF
004010D0 . 33C0 xor eax, eax
004010D2 . 85DB test ebx, ebx
004010D4 . 0F94C0 sete al
004010D7 > 8B4D F0 mov ecx, [ebp-10]
004010DA . 64:890D 00000>mov fs:[0], ecx
004010E1 . 5F pop edi
004010E2 . 5E pop esi
004010E3 . 5B pop ebx
004010E4 . C9 leave
004010E5 . C3 ret
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
经sessiondiy提醒,发现自己搞错了,嘿嘿,谢谢sessiondiy
|
能力值:
( LV9,RANK:180 )
|
-
-
16 楼
typedef struct _SCOPETABLE
{
DWORD previousTryLevel;
DWORD lpfnFilter ----+
DWORD lpfnHandler -+ |
} SCOPETABLE, *PSCOPETABLE; | |
| |
| |
/*Compiler-level SEH*/ | |
| |
| |
try { | |
// guarded body of code | |
} | |
except (filter-expression) { |<-+
// exception-handler block <-|
} 奇怪的是控制流从未从 _except 块返回,尽管 __except_handler3 调用了它。
__except_handler3 如何调用的 _except,而控制流又为何从不返回呢?因为一个 CALL 指令将返回地址压入堆栈,可以认为这就打乱了堆栈。如果察看一下为 _except 块生成的代码,就会发现它所作的第一件事就是将 EXCEPTION_REGISTRATION 结构体之后的8字节处的 DWORD 加载到 ESP 寄存器中。作为其 prologue 代码的一部分,函数将 ESP 的值保存起来,这样 _except 之后还可以将其取回
0040109E . 8B65 E8 mov esp, [ebp-18] ;待会要直接回到 00401236
以上取自下列(最终皆以VC的为主):
深入研究 Win32 结构化异常处理
对于结构化异常处理(SEH)的进一步探索
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
太谢谢sessiondiy 了。。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
来膜拜牛人de
|