先科普一下一个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 的话很可能直接就返回按钮事件去了,导致后面的代码执行不了,可能会出错。
以上纯属个人见解,有不正确的地方欢迎指正!!