下面是国外这篇文章在线翻译的,虽说在线翻译效果不好,但也能看得懂~
OllyDbg的运行程序和调试,那么SendMessage API断点挂在输入密码
当调试是可能的。
0x00409190消息SendMessage WM_GETTEXT的目标程序输入一个字符串在编辑
来。下,直接的,0x004091D8调用一个函数,该函数的返回值,操作时继续0x693126CB
所得款项。
0x004091D8看看上面的函数的内部。
字符串旋转移位的原始数据会丢失,因为解码几乎是不可能的。
以下退出功能再次跳忽略语法。
跳转忽略[EDI +402 A3E增加1,[EDI 402927]的EndDialog函数被调用的语法。
如果输入的密码相匹配的一部分[EDI +402 A3E] 1增加拆包操作已经开始告知假设
可以。
因此,调试,硬件断点将继续挂起。
0x004090A8部分比较目标程序。
[EBP +402 A3E]([EDI +402 A3E])是零,除非执行下面的语句。
在函数内部分析0x00409200
再次呼吁0x004091DA功能摆在首位从里面去寻找相同的行为,看到0x004091D8。
在这种方式来创建哈希码的0x0040921F〜0x00409231内存解密操作的部分所得款项,。
但是解密操作,使用XOR操作,XOR是生成一个值,XOR,ROL,ROR的过程中,经过复杂
制成。
如上所述,这是不可能解密。
然而,我们可以使用的快捷方式,异或XOR运算到一定值时,得到的值为0,则与原来一样的
使用它。
源代码是加密存储的程序部分。
大部分的购买程序代码段中的填充与NULL。
因此,加密存储的最后一部分可能[NULL XOR的hashCode]假设创建进程
是。
但是,由于不同的hash code之前,先继续解码过程没有学会如何发生
有必要。
在加密过程可以表示简述如下。
Memory = Memory ^ EAX
CL = AL
EBX = ROL(EBX, CL)
EAX = EAX ^ EBX
CL = BH
EAX = ROR(EAX, CL)
EBX = EBX + EAX
如果您反转加密过程的运作可以识别解码过程。
EBX = EBX - EAX
EAX = ROL(EAX, BH)
EAX = EAX ^ EBX
EBX = ROR(EBX, AL)
阅读后面的目标程序可以知道什么EAX。
但是,因为你可以不知道EBX的小蛮力应该看看。
在目标程序中区0x00401000〜0x00405000是加密部分。
这读取4个字节从后面带来两倍。
0x00404FFC:0x75DE81C0
0x00404FF8:0xCD5E6523
EBX,当应用到的解码处理的数量可以得到。
除部分和EBX不需要改变自己的方式。
EBX = 0xCD5E6523 ^ ROL(0x75DE81C0,BH)
BH为0x00〜0xFF到一个字节,所以把它全部看起来符合BH如果EBX要求。
BH = 0X10,EBX = 0xA993C21F
BH = 0x62,EBX = 0x43448C44
BH = 0xB2而EBX = 0x394BF64B
你可以找到一个共有三个EBX。
所有三种情况下解密的最后阶段haebomyeon可以找到合适的EBX。
0xA993C21F - > EAX:0xE0E0BAAE
0x43448C44 - > EAX:0xDAD4B6C7
0x394BF64B - > EAX:0xA1AA0B94
上面的第三部分的末尾和EBX比较0x00404FF4存储器可以看到,0x43448C44一直。
EAX和EBX的最后一部分,现在,你有现在的九个解密加密存储,只需拆开包装的两端。
PE密码恢复IAT后自动解码,而不必写一个单独的答复,因为调试器
OllyDump插件可以很容易地解压