CrackMe01
打开字符串的话很难找到我们想要的函数的位置,所以不采取这个方法。
我们可以通过找api函数的办法来找到我们加密的位置。
这个时候需要打开输入函数,找到defwindowproc,这个api的功能是:
调用重定向的窗口过程来为应用程序没有处理的任何窗口消息提供转换的处理。该函数确保每一个消息得到处理。
这样我们双击来到这里
右键查看外部引用
一个一个查看,发现我们所需要的加密函数是在第一个交叉引用里面
进入函数
可以看到加密的函数有两个do
{
*(&chText + v12) ^ = v6;
v12 += 2;
}(v12 < 44)
if ( (v6 & 0xF00) == 1024 && (v6 & 0xF0) == 176 && (v6 & 6) == 6 )
{
showWindow((HWND)a1,5);
UpdateWindow((HWND)a1);
}
根据这个加密函数,可写出解密函数:for i in range(1,10000):
if(i & 0xf00 == 1024):
if(i & 0xf0 == 176):
if(i & 6 == 6):
print(hex(i))
chText = [0x4F0, 0x4DA, 0x4D7, 0x4D1, 0x48C, 0x4FF, 0x4F5, 0x4FE, 0x4E3, 0x4F8, 0x4E7, 0x4FF, 0x4E3, 0x4E9, 0x4F0,0x4F3, 0x485, 0x480, 0x484, 0x4F2, 0x4F4, 0x4F3]
flag = ''
for i in range(22):
chText[i] ^= 0x4b6
flag += chr(chText[i])
print(flag)
总结:加密函数真的很简单了,但是这道题最让我困扰的是如何找到加密函数,今天学到了用api函数找到加密的位置,不给main函数是真的难受啊。网上的wp还有更麻烦的,有动态调试的,等等。看来要好好看一下win32编程了。顺便如果学会了动态调试的话,可以尝试用动态调试来解决问题,毕竟用动态调试跟踪系统函数的想法还是蛮不错的。