俗话说隔行如隔山,感觉上是一回事,自己动手又是另一回事.这两天回家就帮亲戚家孩子做外挂,本以为很简单,结果泡广海逛看雪的,研究了三个半晚上才在今天接近凌晨时大体弄好.万幸自己一直在混软件这碗饭,并没真正的隔行,最多是"一座山上两座峰,搭个吊桥就能通"罢了.
前两天博文中提过一次,这次帮亲戚做外挂为了省事没做封包的(事实上没写过外挂,也不敢写封包的),只是利用程序自身CALL指令在模拟事件, 写的"内挂"罢了.个人以为,写这类东西主要难在脱壳和过防护,过去便一马平川,真正开发时的问题反而很少.
大前天写过一个Java的汇编混合类库,刚才写外挂时顺便给它添了点东西,又根据广海的找CALL入门示例延伸出一个Java版的实现,现发布于此博客,欢迎有兴趣者帮忙继续完善类库.
——————————————————————————————————————————————————————
愚以为,Java做外挂开发有优点如下:
1、隐蔽性高:由于标准Java程序在运行时仅会显示主线程,也就是Java或者Javaw,开发商将很难据此判断外挂进程的使用状态(想查标题和窗体类名识别?1秒能随机换N个);而对于特征码识别,Java的解释型特点令class完全能够做到动态随机构建,完全可以自动变更特征码,让屏蔽软件防不胜防。也就是说,大多数针对exe文件的监测方法,并不能很好的对Java通用,Java外挂将有较高的隐蔽性。当然,也许你会说厂商可以干脆停止所有Java进程。是的,可与此同时,这也意味着厂商的开发人员承认了自己的无能——由于识别不出犯人,只好见人就杀。如果偏巧赶上个用永中office之类Java软件工作的主,结果没保存就被游戏强断了(或者开着Java进不去游戏,一样会有人抗议),便有热闹可看^^另外相关人等大可以在背后写信鼓动Sun或者IBM对厂商提出交涉(有炒作的价值,他们不一定不管哦~),再不然借机把相关资料和截图发往各大Java社区,不用咱们动手,他们的游戏就会被疯狂修改,甚至连源码都被发上网来……
2、先天适合注入操作:我们都知道JNI不光能调用本地接口,也能让本地程序动态调用指定Java类及相关函数,而对于其他语言来说,这是较难实现的;只要善于利用这点,我们便可以令实现了JNI接口的DLL文件充当发报器,而让Java平台充当中间件,最大限度的扩展功能,并以此为基础提供便利的进程间通信。
3、跨平台:我们心理都很清楚,Java并没有真正意义上的跨平台,Java本身即是一个平台,只不过针对不同的操作系统有不同的版本罢了。但是,只要对于用户体验而言,Java是在跨平台,便已经足够了。如果那天你开发的网游在其他系统出了新版,你同样可以在不改变原有外挂UI及外部接口的情况下追过去,而且是游戏敢做到什么系统,你就敢追到什么系统。还有一点,对于完全脱机版的封包外挂而言,Java能让你的用户在绝大多数时候,绝大多数系统中,坚持挂机不动摇……
4、开发封包类外挂便利:Java提供的网络通讯功能是非常强大的,并且有大量第三方组件支持,对于脱机的封包外挂而言,Java实现远比C/C++实现简单,另外跨平台在第三点已经强调了。
5、开发周期短,适合团队协作:Java先天具有适合商业开发的基因,团队协作开发对于熟悉Java者也只是小菜一碟罢了。Java代码的可读性相较C/C++或者Delphi而言要更好些,调试也更简单,有助于你的外挂早日上市。
缺憾:
不知道。(对于Java所有缺点,鄙人认为都有方案解决,所以暂时没想到缺点:))
关于找Call部分,直接转载自广海社区,发帖人为[gao6621],原文地址: http://ghoffice.com/bbs/read-htm-tid-50497-keyword-%B3%AC%BC%B6.html
************************************转载开始************************************
首先说明,这个教程以一个找CALL的练习程序为例子。之所以不拿游戏,因为游戏找CALL时间长了,不适合做教程,而且本练习涵盖参数。我将说明为什么这么调用,为什么这么写!
好的。偶们好的,偶们这节课需要用到的程序为【wygailf】制作的一个找CALL测试程序。首先感谢他!
![](https://i-blog.csdnimg.cn/blog_migrate/1425d9015a9164ffacaace713461ca20.jpeg)
这个就是我们用到的程序,OK,打开他并且用OD附加进程!
![](https://i-blog.csdnimg.cn/blog_migrate/1755c841280d5d2fef6291924a7a3061.jpeg)
并使其进入“运行”状态
好的,下面我没开始找CALL,首先说明一下,CTRL+F9这个是“运行到返回”。为什么要按这个按钮?----就我的理解,假设把程序比做很多层的一个盒子,而CALL就是我们要从盒子里拿出来的东西。
那么,如果我们想拿出来CALL,怎么办?当然是打开盒子,取出盒子,再打开盒子,取出盒子.....而这个CTRL+F9就是这个打开盒子到取出盒子的过程。运行到返回,顾名思义,就是运行到RET(返回)截止。
而这个RET也正是跳出本层的一个关键点。每一个RET都有可能是一层。所以这样也就解释了为什么有的时候按三下CTRL+F9和四下CTRL+F9的原因了。
好,说的就这些。下面LET'S GO!
我们首先下断点bp send。
![](https://i-blog.csdnimg.cn/blog_migrate/999cee8261452ea1b994e3fb603e38dc.jpeg)
然后回车。如果不确定自己是否成功的下了断点。可以在OD中按ALT+B来查看
![](https://i-blog.csdnimg.cn/blog_migrate/777bdfe9ebfe706f46605f74c58bf5ce.jpeg)
好的,这个就是我们下的断点了。始终就是断点有效,也可以暂停断点。选择一个断点,敲空格。这个断点就变成了“禁用”。这样就算暂停了断点。OK这里不再赘述,我们开始。
==============================================================================================================
首先,我们来个HP药水试试!
![](https://i-blog.csdnimg.cn/blog_migrate/7189906999793d3b769c4406cc66b1bf.jpeg)
在这里选择吃药。然后OD会断下!
![](https://i-blog.csdnimg.cn/blog_migrate/425a8f680acf03b0adb049c9f179dcc3.jpeg)
这里是程序断下的地方,我们可以看到下方有如下注释:
![](https://i-blog.csdnimg.cn/blog_migrate/ff5873f2e440df1bc9aa42de79c236cc.jpeg)
SEND来自.....说明这里是send函数被断开的地方。
继续,CTRL+F9我每一步都会记录下来,一点一点给新手解释为什么!
![](https://i-blog.csdnimg.cn/blog_migrate/b988ac1775d4098ec51af49eb83ab3b2.jpeg)
上图是我按下第一次CTRL+F9之后转到的RET。这里再顺便说一句。看到这里的RET 10了没有。这里是RET 10就是有4个参数的RET,一个参数占4个字节。那么按照这么说来应该是 RET 16才对啊。其实这里的10是16进制的10,那么16=10(16进制)=4x4所以这里是RET 10。好,下面说正题:看到上面的CALL了没有。CALLWS2_32....当你看到这个的时候,你就可以毫不犹豫的再次按下CTRL+F9了,说明你现在还在系统的范围内。还没有进入到程序。为什么系统跟程序不一样?因为程序是依托在WINDOWS平台运行的。那么如果程序要干什么事情,就要跟WINDOWS打声招呼。也就是SEND函数!程序跟系统说,我要做动作了,系统说批准,程序说我要喝药,系统说批准,程序说我去哪里喝药,系统说CALL!好的,这里的CALL就是我们需要的CALL了。:-)
![](https://i-blog.csdnimg.cn/blog_migrate/5a4f71041319d2f0515306992795c1c2.jpeg)
第二次CTRL+F9,这里的CALL还是差不多,还在系统层内。我们继续!
![](https://i-blog.csdnimg.cn/blog_migrate/0a7f6ea966a89025ea0d95239bf9187f.jpeg)
OK,以上是第三次按CTRL+F9所看到的信息。
看到这里了吗,已经是程序层了。也就说这里很有可能就是我们需要的CALL了。OK。我们来测试一下,我们来看这一段
![](https://i-blog.csdnimg.cn/blog_migrate/f15cc6d569da82b144f5f672f022f45f.jpeg)
lewei2000提醒:以下几点解释有误,初学者略过,楼主还需深化汇编知识
看第一行:mov dword ptr fs:[eax],edx-------这里的意思是:将指针赋值到dword,后面