1625-5 王子昂 总结《2017年6月8日》 【连续第249天总结】
A.CrackMe(18)和一个简单的论坛CM
B.中间两个难度是?,留到最后解决
18拖入PEiD,无壳,第一次反编译C++程序
拖入OD,运行。还好有GUI,大概是mfc吧。只有一个输入框和确认按钮
随便输入,点确认。弹窗错误
暂停后ALT+K查看调用堆栈,跟delphi简短一目了然的堆栈不同,非常多,并且存在好多个messagebox的调用,只有最下面两个是用户模块的。现在思考一下,这个调用堆栈应该就是call的结构吧,最外面两个应该是有关的。
当时懵逼。直接查找错误的提示字符串,也没有。
查看GetWindowTextA的调用,下断。
再点确认,果然被断到了,跟到ret的时候在堆栈中发现了字符串,跟出了三个call以后回到了用户模块。
此时就很简单了,一目了然,一个len的API,判断是否为空,一个strcmp的API,正确Serial直接保存在内存中直接拖入即可。并且正确和错误提示也是直接保存在内存中的,理应能查找到。再进行一次查找,出现了截然不同的结果。
估计查找是仅查找当前模块。因此在查找的时候要注意是否位于用户模块。
太简单了,再来一个。
去论坛找了一个看起来比较简单的http://www.52pojie.cn/thread-608526-1-1.html
易语言写的,无壳
也没直接搜到字符串,跟之前一样,直接找getwindowstexta的API,下断就找到了用户模块
这个程序的汇编里有许多case,之间没见过
不过一步一步跟下去,直到找到关键跳转,NOP之就能爆破成功
然后看关键跳转的判断变量,再往上循着找,看是在哪里改变的
中间能看到堆栈和寄存器中多次 出现了一个字符串“241123”,估计是正确Serial,可以输看看
跟到一个call里面,下断,F7跟进去,发现是一个依次判断每个字符是否相等的函数
至此就完全明白了
C.明日计划
VB的两种编译方式的细节