hkfans007 发表于 2009-1-12 12:53

基于SEH的反调试Crackme,对学SEH的很有帮助

原CrackMe的破解文章的链接地址:

引言:
我看了半天,也没看明白是怎么回事,他说在0x492290下断,我下了,但是按了好几次shift+f9都没有到那个指令地址,而ollydebug又没有提供相应的功能自动跳到那个指令,所以按了半天放弃(因为有循环),后来认真按了几十次,终于到了那个比较的指令地址,但是我还是不知道注册码的生成算法,所以我觉得写破解文章的那个作者完全是在忽悠的。认真思考了一番,我知道SEH主要就是故意在有实际功能的代码中加入些异常,然后跳到异常,使得跟踪者很容易跟丢,或者放弃,既然这样,我们解除SEH的反跟踪的大体思路就是直接将注册码算法的代码串接起来,将引起一场全部去掉。分析过程如下。

大体过程:

1. 获取上次0xCC(中断指令) 的地址 (如00401914)
2. 读取该中断地址的下个BYTE的数据 (如 = 0x8c)
3. 该字节数据 (0x8c) 经过算法后,产生另外一个数,再该数和上次中断的EIP相加,定位到新的EIP地址.



重定位EIP算法:(0x8c ===>)   (该算法在未处理异常程序中,地址0x4012f0, 未处理异常加入很多jmp,不用管!~~~)

mov edx, 40164b;从该指令开始
inc edx               ;取下个字节的数据

move cl, byte ptr       

mov cl, 0x8c         ; 0x8c是举例
mov al, cl      
shl al, 6
shr cl, 2
add al, cl
xor al, 0D
mov cl, al
shr cl, 5
shl al, 3
add cl, al
add cl, 11   ; HEX数据
mov al, cl
shl al, 5
shr cl, 3
add al, cl
xor al, 51
mov cl, al
shl cl, 7
shr al, 1
add cl, al
sub cl, 6F
and ecx, 0FF
and ecx, 80000007

add edx, ecx          ; edx 保存异常地址的下个字节的地址 ( 如00401915)
inc edx         ; 此时,edx 保存 异常处理后恢复的指令地址 (00401917)=== 00401915(00401914+1) + ecx + 1;


处理方法:

直接跳到有实际作用的EIP(是0xCC的全部跳过), 写个程序自动修改跳转指令 (从第一个INT3开始修改为 jmp)

需要一步判断将要跳转的地址的数据是否为0xCC,如果是继续往下查找,直道找到一个不是0xCC的,然后跳到这里来


相关信息:
1.第一条INT3 指令地址 0x40164b   --- > 从这里开始跳转,跳到下个有实际作用的EIP地址


附:
附加一个修改程序的源代码和修改后的cm


ps:在比较注册码的指令后,如果比较错误,而我们在olldebug又单步调试的话,会当机,因为程序没有写处理单步异常的代码, 不过这已经不重要了

[ 本帖最后由 wgz001 于 2009-1-13 08:42 编辑 ]

hkfans007 发表于 2009-1-12 12:57

原CrackMe的破解文章的链接地址: http://bbs.pediy.com/showthread.php?t=12449

原CM的下在地址:
http://bbs.pediy.com/showthread.php?t=12449

hkfans007 发表于 2009-1-14 09:30

哈哈,终于有人认可了,这个对学习SEH反调试真的很有帮助~~

zzage 发表于 2009-1-14 09:39

SEH...很好,不过在异常处理里面能找到他的回调函数

bensonhb 发表于 2009-1-14 09:44

学习一下,不知道能不能搞惦呢!!!!!

zhujian198 发表于 2009-2-3 19:59

xiong5230 发表于 2009-2-11 11:42

看起来算法好复杂。怎么找得到的?
页: [1]
查看完整版本: 基于SEH的反调试Crackme,对学SEH的很有帮助