用条件断点寻找E盾的登录、合法、算法和取服务器数据CALL

先科普一下一个API函数HeapAlloc,在指定的堆上分配内存

所以登录、合法、算法或取服务器数据CALL里面都要经过这里
FF25:

FF25的跳转到的地方

因此我们在FF25那里(图中选中的那一行)下条件断点(OD里条件断点是粉色的)
设置条件断点的方法:在要设置条件断点的地址 Shift+F2 或者 右键→断点→条件

下面具体说下怎么来写这个条件断点,进入正题

登录:

先分析登录CALL汇编代码

0041461F push ebp
00414620 mov ebp,esp
00414622 sub esp,0x144
00414628 mov dword ptr ss:[ebp-0x4],0x0
0041462F mov dword ptr ss:[ebp-0x8],0x0
00414636 mov dword ptr ss:[ebp-0xC],0x0
0041463D mov dword ptr ss:[ebp-0x10],0x0
00414644 mov dword ptr ss:[ebp-0x14],0x0
0041464B mov dword ptr ss:[ebp-0x18],0x0
00414652 mov dword ptr ss:[ebp-0x1C],0x0
00414659 mov dword ptr ss:[ebp-0x20],0x0
00414660 mov dword ptr ss:[ebp-0x24],0x0
00414667 push 0x20 这里占用一个地址(4字节)的堆栈空间
0041466C call 0045BD2E 这个CALL就是上面说的内存分配CALL
00414671 add esp,0x4 这里 ESP+4 是还原到原来的144个堆栈空间

我们以前找的特征码主要是这2个,一个是sub esp,0x144;另外一个是push 0x20

所以我们就对这2个特征设置条件断点,下面对条件断点构造进行分析

sub esp,0x144:EBP指向栈底,ESP指向栈顶,而144就是堆栈容量(不包括ESP和EBP占的4字节内存地址),条件断点是:EBP-ESP-4-4==144

不太明白的话举个例子解释下这个条件断点,比如:

值: a、 b、c、d、e、f、 g、h

位置:1(ESP)、2、3、4、5、6、7、8(EBP)

问a和h之间有几个,答案是:8(EBP)-1(ESP)-1=6

现在我们在这之间插入一个值m (也就是汇编代码PUSH 20)

值: a、 b、m、 c、 d、e、 f、g、h
位置:1(ESP)、2、3(PUSH 20)、4、5、6、7、8、9(EBP)

问在没插入m之前a和h之间有几个,答案是:9(EBP)-1(ESP)-1-1=6

所以最后的条件断点是:EBP-ESP-4-4== 144,整理一下:EBP-ESP-8==144(这里都是16进制的计算)

PUSH 20 :这个条件断点就相对很简单了,这个就在ESP+4的地方,所以条件断点是:[ESP+4]==20,方括号代表指针,是[ESP+4]这个地址指向的值,而不是ESP+4这个地址。

OD里面的 等号"=" 要写成 两个等号 “==”,如果对条件断点不熟悉的话可以,自己查找相关资料看看。

多条件的话用两个"&&"进行连接,比如:EBP-ESP-4-4==144&&[ESP+4]==20

这里可以再加一个条件就是判断这个地址:mov dword ptr ss:[ebp-0x24],0x0 三个条件确保唯一,其实前面2个基本上就唯一了

一般设置前2个条件即可,第三个条件可以在堆栈右键-EBP,向上找会看到EBP上面有一排00000000的话肯定就是要找的CALL.

条件断点:EBP-ESP-4-4==144&&[ESP+4]==20&&[EBP-24]==0

修改方法:

在堆栈顶返回地址进行如下修改
mov eax,0x1
mov esp,ebp
pop ebp
ret

合法、算法和取服务器数据设置方法同上

2、合法:EBP-ESP-4-4==84&&[ESP+4]==8&&[EBP-18]==0

修改方法:

在堆栈顶返回地址进行如下修改
mov esp,ebp
pop ebp
leave
ret

3、算法和取服务器数据:EBP-ESP-4-4==98&&[ESP+4]==8&&[EBP-48]==0

修改方法:

这里其实可以不用修改,无法获取数据和计算结果,返回结果是空;

有正版数据的话,可以在这里补正版数据

在堆栈顶返回地址进行如下修改

mov eax,正版数据地址
mov esp,ebp
pop ebpleave
ret

算法和数据这里最好用 ret,而是不是 leave ret,因为断下的是这个CALL的第一层

用leave ret 的话很可能直接就返回按钮事件去了,导致后面的代码执行不了,可能会出错。

以上纯属个人见解,有不正确的地方欢迎指正!!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值