能力值:
( LV13,RANK:1250 )
2 楼
斑竹暂时不要加精,没有这么简单。
提示你一下:这个CrackMe包含SEH异常处理,正确的序列号必须在与用户名异或后成为引发特定异常的机器指令序列,而且第二个双字必须等于异常代码。
再仔细想想,建议你熟悉一下SEH异常处理的机制。 PS:汇编写的程序你没有让它进IDA屠宰场那真是太遗憾了
能力值:
( LV9,RANK:250 )
3 楼
最初由 冲天剑 发布 建议你熟悉一下SEH异常处理的机制。 ........
多谢指点,这个seh异常,确实我不太熟悉!!
另外一点:你的意思是说对汇编语言的程序用ida更简单
吗?
只不过我现在一直用od调试,我想先玩熟悉od再说
对ida一直没试过,我想等我熟悉od之后会试试ida
的.想问一下,难道注册成功了会弹出正确提示的对话框吗?
感觉好像代码里不曾有这样的代码?请高手指点?
能力值:
( LV12,RANK:370 )
4 楼
在IDA里面差不多可以当源码读了...
能力值:
( LV9,RANK:250 )
5 楼
感觉最后注册成功应该也是这样的吧!~
连作者也说了no anti-debug 100% asm
我想应该没有什么问题的吧!!
我觉得利用异或计算当成代码处理,这本来就很
难想到的啊!!!!
当然我是菜鸟,所以见识可能少些!
希望高手指点说明!!!
能力值:
( LV13,RANK:1250 )
6 楼
你有分析那个异常处理的回调函数吗?如果没有,先去分析401000处开始的那个过程。
另外,假设40126B处的call edi没有发生异常,那么它返回的下一句就会是一个“try again”的消息框,这显然是失败了。因此正确的注册码必定使得40126B处的call发生异常。那么应该是发生什么样的异常呢?再想想。
顺便说一下,你贴的代码只是一个局部,如果只从这一部分入手,就如同管中窥豹。看问题应该从全局来看。
能力值:
( LV2,RANK:10 )
7 楼
to 冲天剑:
我认为你的观点有点片面,好像只有发生异常才是正解,其实楼主用了Crackme作者本人都没有想到的方法进行了Crack.虽然楼主的确不太了解SEH,但是正是因为不了解让他闯出了一个新思路。我认为应该加精!
我认为crackme作者如果要充分利用SEH,就不能用这样代码:
004012C4 > FF75 EC PUSH DWORD PTR SS:[EBP-14]
004012C7 . 64:8F05 00000>POP DWORD PTR FS:[0]
004012CE . EB 0D JMP SHORT SV_Keyge.004012DD
来还原fs:[0],因为[ebp-14]是固定的。如果通过平衡堆栈来pop fs:[0],那么不异常就不能正确恢复fs:[0].也就是说直接jmp出来以后就会出错。
能力值:
( LV12,RANK:740 )
8 楼
@coldpine:
正如冲天剑所言,还要深入的研究一下SEH, 因为作者的要求是"...to have the good messagebox", 所以必须有一个msgbox才算成功, disable "GO"按钮不是注册成功与否的标志.
友情提示一下:
在用OD跟踪时注意堆栈中的"SEH Handler",并适时跟进SEH处理程序.我也不懂IDA.也是用OD跟的.
能力值:
( LV6,RANK:90 )
9 楼
Yeah,that's right !!
能力值:
( LV9,RANK:250 )
10 楼
感谢大家提供的一些信息,
尤其是冲天剑兄弟,我想我
如果解决的话,水平应该又
提高了一点的啊!!!!!
再次感谢!!!!!!!!
能力值:
( LV13,RANK:1250 )
11 楼
首先说明一下:call edi是否发生异常,是这个问题的关键所在。如果不发生异常,除非你预先知道对“引用正确信息的指令序列”的解码循环在什么地方,然后设计一个jmp直接跳到那个地方。但是这样势必要修正call的返回地址,同时要修改eax的值等于密钥,不然执行结果还是错误的。这三个指令(一个jmp,一个修正返回地址和一个修改eax)加起来肯定超过8字节长,已经超过能够通过注册算法所生成的指令序列长度。
好吧,先提示一下:解码循环在地址401316处,你试验一下把地址403046起始的7个双字逐一与0C0000094h异或,然后反汇编,看看是什么结果。PS:0C0000094h是除零错误的异常代码。
在用OD跟踪时注意堆栈中的"SEH Handler",并适时跟进SEH处理程序.我也不懂IDA.也是用OD跟的.
遇到SEH的最好处理方法是绕过而不是跟进去,也就是自己在脑子里模拟SEH,因为调试器单步本身也是一种异常,碰到反单步(故意产生单步)的程序段就麻烦了。
能力值:
( LV9,RANK:250 )
12 楼
最初由 ikki 发布 在IDA里面差不多可以当源码读了...
妈的,看来真的要把 IDA 搞懂才行
能力值:
( LV12,RANK:740 )
13 楼
To 冲天剑: 多谢冲天剑兄的指点,不过我还是不太明白,"遇到SEH的最好处理方法是绕过而不是跟进去", 如果不跟进SEH的处理程序,你怎么知道它偷偷摸摸的干了些什么呢? "绕过"是怎么绕过, 绕到哪里去? 关于使用IDA日后还需要向冲天剑兄请教学习.
能力值:
( LV13,RANK:1250 )
14 楼
简单的例子譬如:
_SEHandler proc arg1, arg2, arg3, arg4
mov eax, arg3
mov [eax+CONTEXT.regEip], offset next1
xor eax, eax
ret
_SEHandler endp
start:
assume fs:nothing
xor eax, eax
push offset _SEHandler
push fs:[eax]
mov fs:[eax], esp
inc dword ptr [eax] ;产生异常
....
next1:
pop fs:[eax]
add esp, 4
ret
end start
通过分析_SEHandler过程我们知道它只是把线程的eip定向到地址next1,那么在调试器中跟踪到inc dword ptr [eax]这一句时就不要按F7,而是直接重置eip到地址next1处继续进行,这就是所谓绕过。当然更复杂的SEH回调函数可能还会干许多其他的工作,但是只要记住一点:如果函数的返回值是0(即ExceptionContinueExecution)的话,那么这个函数中进行的大部分操作都可以忽略,只需要知道它是如何修改全局变量以及arg3所指向的CONTEXT结构体(原线程运行环境)就足够了。
能力值:
( LV6,RANK:90 )
15 楼
不简单啊!!!
能力值:
( LV12,RANK:740 )
16 楼
=>冲天剑:明白了,谢谢
能力值:
( LV2,RANK:10 )
17 楼
都是经验之谈呀,好好学习!
能力值:
( LV2,RANK:10 )
18 楼
06年的帖子,今天再看 依然很经典啊,多谢 @冲天剑 大牛!我要继续努力了!回去看异常处理!
能力值:
( LV2,RANK:10 )
19 楼
今天仔细分析一下,,学习一下
能力值:
( LV2,RANK:10 )
20 楼
mark 支持
能力值:
( LV2,RANK:10 )
21 楼
这个程序不简单奥。。。。。
能力值:
( LV7,RANK:110 )
22 楼
感觉很牛。。。。
能力值:
( LV6,RANK:90 )
23 楼
这个挺有意思
能力值:
( LV2,RANK:10 )
24 楼
嗯,只知其一不知其二呀。学习了。
能力值:
( LV4,RANK:50 )
25 楼
贴个可用的注册码 lhg2lhg2 5FA890C2F86867F2