惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
腾讯CDC
G
Google Developers Blog
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
有赞技术团队
有赞技术团队
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
美团技术团队
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志

博客园 - jasonM

真是郁闷,团队中居然出了这样的骗子!! C++反汇编揭秘1 – 一个简单C++程序反汇编解析 函数调用堆栈变化分析 - jasonM - 博客园 做挂第一步:如何找基址(以热血传奇为例) 一步步学外挂(二).CALL的原理。 - jasonM - 博客园 开发企业直销软件需求分析 开发旺旺群发软件,难点及重要技术点分析(一) 正则表达式系列文章整理 群发软件开发原理分析 通俗解释socket(并附上注释Socket源代码) CMainFrame::PreCreateWindow这个函数执行了两次 .net调用vc++写的dll 一步步学破解-sdk用实例讲解GDI映射机制 一步步学破解-sdk用实例讲解GDI(含各个消息的调用时机) 一步步学破解-sdk进程间传递信息 一步步学破解-在已有的主窗口上创建按钮(三) 一步步学破解-windows消息循环原理实例总结(二) 一步步学破解-函数调用堆栈变化分析 (一) 老王最新壳试脱时遇到的问题,详细表述如下
为什么要下断bpSend,原理分析。
jasonM · 2010-10-08 · via 博客园 - jasonM

     看过这里有的大大是断下send后,去找调用send的CALL,找到这个CALL再找上一次的CALL,这样去找关键CALL,但是,有的游戏这样是找不来的,所以,如果有的游戏不能这样找回去,那怎么办呢,这就要先说说原理了。
  要说找CALL的原理,我们应该想想游戏的运行机制。也就是说游戏的控制方式是怎么样的。
  不说费话,其实大多数的游戏都是这样的,来个买药的例子吧:
  点击买药后:
  1、客户端产生一个买药行为 并调用买物品的过程,如:BuyGoods(s:string,n:integer); //参数s为物品种类 n为数量
        2、这个行为会产生一个发送给服务器的数据信息 MakeInfoString;
   比如:36 00 01 .........
  3、数据出来要进行一次或N次的加密。
  4、加密后通过send或WSASend函数将这个信息发给服务器处理。
  5、等待服务器处理返回。
  6、服务器返回购买成功的信息。
  7、客户端响应这个信息,并调用本地动作行为。
  这样,基本上就构成了游戏的一般的控制方式。
  写出程序大概可能为:
主程序
....
....
BuyGoods(LifeMedicine,10);  //行为产生后调用买物品过程
....
....
主程序

procedure BuyGoods(s:string,n:integer);  //买物品的过程
begin
  send(Encrypt(MakeInfoString(s,n)));
end;
当然写法也可以是:
MakeInfoString;
Encrypt;
send;

不管怎么样方法都是差不多的。
  了解了程序的大至写法,那么我们逆向起来就有个思路了:
    bp send
        返回向回找,先找到Encrypt,再向回找,能找到MakeInfoString(也就是找到明码部分),再向上找,就是调用这些东西的BuyGoods(s:string,n:integer)了。

  我来找一个游戏说明一下吧,比如说有个什么名状的游戏。
  这个游戏有个出征和休息待卫的功能,也就是放出和休息宝宝了。就拿这个CALL来讲吧。
  这个游戏我用一般的思路往回找无法找出来这个出征的CALL,别的CALL没试,主要用是讲个例子。那么我就用另一个方法:
  1,我先下bp send,返回看到这里,不用说就是send函数了。
     0069FFBF  |.  E8 82A11000  call    <jmp.&WS2_32.#19>
  ,2,给send的BUF区下硬键访问断点,来到这里,看出是这里向Send函数的BUF区放数据的。
     0069FB43  |.  F3:A5        rep    movs dword ptr es:[edi], dword ptr [e>; |
  3,给esi下断分析,发现加密函数。
     0069FB64  |.  E8 67060000  call    006A01D0                ; \封包加密函数
  4,好,我们在这个加密函数下个断。然后点击“出征”,断下来后执行到返回。可以看到调用它的CALL。
     0069DD14  .  E8 471D0000  call    0069FA60
  5,下断,再往回找,看到上一级的调用CALL。
     0069DEFC  |.  E8 BFFDFFFF  call    0069DCC0
  6,下断,再往回找。
     006DBDFB  |.  FF50 0C      call    [eax+C]              
  7,下断,再找。
     0065CB89  |.  8B4D 08      mov    ecx, [ebp+8]
     0065CB8C  |.  33C0          xor    eax, eax
     0065CB8E  |.  66:8B46 21    mov    ax, [esi+21]
     0065CB92  |.  6A 32        push    32                            ; /Arg3 = 00000032
     0065CB94  |.  50            push    eax                            ; |Arg2
     0065CB95  |.  51            push    ecx                            ; |Arg1
     0065CB96  |.  8D8D E4FBFFFF lea    ecx, [ebp-41C]                ; |
     0065CB9C  |.  C745 FC 00000>mov    dword ptr [ebp-4], 0          ; |
     0065CBA3  |.  E8 88F10700  call    006DBD30                      ; \TheWarlo.006DBD30    
   8,再放上,是这里,看到红色这个CALL了吗,它就是“出征”的CALL了。

    004101B2 |. 83F8 14 cmp eax, 14
004101B5 |. 8B45 08 mov eax, [ebp+8]
004101B8 |. 73 06 jnb short 004101C0
004101BA |. 83F8 01 cmp eax, 1
004101BD |. 7E 01 jle short 004101C0
004101BF |. 48 dec eax
004101C0 |> 8B4486 04 mov eax, [esi+eax*4+4]
004101C4 |. B9 58E88000 mov ecx, 0080E858
004101C9 |. 50 push eax ; /Arg1
004101CA |. E8 81C82400 call 0065CA50 ; \TheWarlo.0065CA50
004101CF |. 5E pop esi
004101D0 |. 5D pop ebp
004101D1 \. C2 0400 retn 4
   9,再上就是GuiDll的领空了。
   这两个都可以,
  给大家这个例子,是想告诉大家,什么是BPSEND的原理,我的意思是如果你都分析不清楚一个游戏或程序的运行方法,那你无论如何是不可能找到这些的。当然,如果有别人给的一些实际操作的例子除外。
  好了,也差不了多少。也不知道我说的这些对大家有没有用,欢迎大家批评指正。