程序中有多处反调试,还有两处check判断,第一个check函数中有三段解密,最终还原出一个dll文件,然后通过第二个check函数,向dll文件中传入密文,并进行AES解密,解密的结果即为flag。
主函数:
1.查壳:
64位,C++,无壳。
IDA64打开,发现程序有基址随机化,去除:
详细请参考:去除程序的基址随机化_皮皮蟹!的博客-CSDN博客
2.在main函数处下断点,出现弹框并结束调试:
应该是TLS反调试,搜索TLS,找到TlsCallback_0函数,发现有IsDebuggerPresent反调试和四个加密的数组:
手动patch掉反调试:
(1)可以手动异或出TLS函数下面的结果:
(2)也可以在x64dbg中F8运行查看结果:
NtQueryInformationProcess: 取进程信息函数,可以用于反调试(有调试端口,可以检测进程是否被调试)。
ZwQueryInformationThread: 获取线程信息,可以用于反调试。
NtQueryApcThread:apc队列
APC注入可以让一个线程在它正常的执行路径运行之前执行一些其他的代码,每一个线程都有一个附加的APC队列,他们在线程处于可警告的时候才被处理(WaitForSingObjectEx,SleepEx)。
异步过程调用,apc可以看成就是内核里的定时器,为了给自己一个在本函数返回后还能执行的一次机会,有很多操作是需要在函数返回后才能执行.类似于析构函数但不完全是。
反反调试:跟进IsDebuggerPresent
API中,进行如下修改即可。
3.主函数下的线程反调试:
位置:beginthreadex中StartAddress
其中的sub_140008B20为反调试函数。
sub_140008B20函数:
使用快照遍历进程获取进程的md5值与原有的md5值进行判断,当存在指定进程时则退出程序,这里可以判断为反调试。 详细请参考:用快照对进程、模块、线程进行遍历(代码段) - Wings_翅膀 - 博客园