reverse之第八更

reverse之第八更

本题出自看雪CrackMe大赛第十题,解题思路相对简单,主要是程序加了反调试,如果不考虑绕过反调试的话,可以直接在IDA里分析,首先肯定是查找关键字符串,功夫不负有心人,找到了error。

里面一堆东西不知道想要干什么,先不管了,找找哪个函数和401E90有关系吧,最终找到关键的判断函数4020A0,在之前还有个函数用来判断字符长度

很明显首先判断的是前面的7个字节是不是TrustMe

下面还有一个判断401FE0,成功就会到“pause”这里。

这里是判断字符串7位之后的内容和20161018的大小,因此最终的字符串应该是TrustMe20161018。

当然本题最主要是为了考察对反调试知识的运用,接下来就针对本题的反调试进行分析。

将CrackMe拖入OD里运行会发现OD直接退出了,应该是反调试的问题。顺带查找一下字符串也就是error,找到之后在调用它的函数头部下断点。

跟踪进入关闭窗口的call分析

只要跳过上图的两个函数就可以,可以看到上面的是一个SendMessageW,函数,在该函数上下断点,回溯发现就是此处调用该函数。

上网查找该API函数的Msg参数第二个就是WM_DESTROY,将其第三个参数修改为0就可以跳过,下面的EnableWindow函数将参数就该为1,条件就变为TURE,这样两个函数就都过了。

接着单步调试

检测输入信息的部分就是判断输入的前7位是不是TrustMe。接下来就是ZwSetInformationThread 这个函数,这个函数可以调用设置优先级的线程调用者处理。

NTSTATUS   ZwSetInformationThread(
    IN HANDLE  ThreadHandle,
    IN THREADINFOCLASS  ThreadInformationClass,
    IN PVOID  ThreadInformation,
    IN ULONG  ThreadInformationLength
    );

THREADINFOCLASS 是个枚举类型

typedef enum _THREADINFOCLASS {
ThreadBasicInformation, // 0 
ThreadTimes, // 1 
ThreadPriority, // 2 
ThreadBasePriority, // 3 
ThreadAffinityMask, // 4 
ThreadImpersonationToken, // 5 
ThreadDescriptorTableEntry, // 6 
ThreadEnableAlignmentFaultFixup, // 7 
ThreadEventPair, // 8 
ThreadQuerySetWin32StartAddress, // 9 
ThreadZeroTlsCell, // 10 
ThreadPerformanceCount, // 11 
ThreadAmILastThread, // 12 
ThreadIdealProcessor, // 13 
ThreadPriorityBoost, // 14 
ThreadSetTlsArrayAddress, // 15 
ThreadIsIoPending, // 16 
ThreadHideFromDebugger // 17 
} THREAD_INFO_CLASS;

反调试部分还原部分源码

把上图中的参数0x11修改成0就可以过了这个反调试。下面还有一个相同的反调试,修改方法相同。

单步向下,找到如下部分是剩下的检测部分

最终结果和上述的IDA分析结果相同。

文章目录
  1. 1. reverse之第八更
|