180826 逆向-巅峰极客第二场(Reverse)

本文介绍了在逆向工程中遇到的Windows事件Hook技术,讲解了如何通过Hook处理所有消息来实现反调试。分析了GetWindowLongA获取窗口风格和扩展风格的用途,并探讨了通过CreateThread调用者寻找main函数的方法。此外,还提到了通过System("pause")的交叉引用定位main函数,以及如何处理栈指针错误。最后,讨论了动态调试时处理数组和提取flag的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

打开以后只有start函数,找不到main函数
但是看得到一个StartAddress
根据经验可以知道这个命名通常是指CreateThread的入口函数
进去看可以发现它设置了一个事件Hook
SetWinEventHook(1u, 0x7FFFFFFFu, 0, pfnWinEventProc, 0, 0, 2u);
查了一下手册,前两个参数表示Hook的消息ID范围,从1~0x7fffffff也就意味着这个pfnWinEventProc会处理所有消息,基本上也就等同于瞬间的死循环了
通常这种线程会作为反调试,来保证进程全程无被附加


调用了两个GetWindowLongA,不知道是干啥的,去查一下
-16 GWL_STYLE 得到窗口风格
-20 GWL_EXSTYLE 得到扩展的窗口风格

进一步加反调试加入关键字
找到了如下示例代码

LONG mStyle = GetWindowLongA(hwnd,GWL_STYLE);
LONG ExtStyle=GetWindowLongA(hwnd,GWL_EXSTYLE);
if(mStyle==0x57c70000&&ExtStyle==0x140)
{
    printf("find od 1 %08x %s\r\n",dwEventThread,name);
}
if (mStyle==0x56CF0000&&ExtStyle==0x140)
{
    printf("Find od 2 %08x %s\r\n",dwEventThread,name);
}

可以看到,是通过窗口风格来针对OD的反调试

而里面的值设置暂时不知道是做什么的,可以先放着不管,标识一下他们的变量名

然后回头通过交叉引用看一下CreateThread的调用者,就能找到main函数
除了这种方法以外,还可以通过字符串索引
虽然运行一下即可发现没有提示字符

但是下面这个标志性的内容,很明显是由System(“pause”)造成的
那么我们就可以对system和”pause”这两个东西查看交叉引用,最终同样能找到main函数

这个函数初始是不能F5的,报栈指针错误,实际上是可以通过调整Stack pointer来修复的,当然硬怼汇编也没什么问题

可以看到,只是每个输入字符的十位数和个位数分别通过二级指针进行比较

调整Stack pointer的方法则是找到其报错的位置,将其的Stack pointer通过ctrl+k调整至合适的值,通常是0
具体还是要根据它上下代码和栈帧的关系来理解的233
修复以后比较清晰

值得注意的是这里第一个dword数组点过去看一下可以发现

这个数组的几个值会根据反调线程而被修改,所以求解的时候要注意一下

这里静态dump相对麻烦一些,因为v3v4v5v6v7分别是不同的变量,需要自己合并起来
动态调试的时候可以直接通过下标连续取值,一次到位

在这里下断以后通过脚本即可处理出flag:

Python>for i in range(42):print(chr(((Byte(Byte(0x1092178+i)*4+0x1093018)<<4)+ (Dword(4*Byte(0x1afea8+i)+0x1092138)&0xf)))),
f l a g { 0 6 b 1 6 a 7 2 - 5 1 c c - 4 3 1 0 - 8 8 a b - 7 0 a b 6 8 2 9 0 e 2 2 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值