细节决定一切——由一个函数声明引发的诡异崩溃

今天LibCHD成功登陆游戏,遂使用Release编译并在VB中调用,结果立崩,开始还以为是VB的问题,但是用C++调用居然也崩,而Debug编译没有出现任何问题。VC挂载后发现崩溃出在recv的thread中,但调用堆栈看不出哪里崩掉的。然后用OD挂载,崩溃现场显示堆栈已溢出,但调用框架还能看出,从堆栈最下面往上翻,总算找到一个返回地址在我的DLL里,看出来是在DynCode解密的调用中崩掉的。语句为pFuncDecrypt(Pac.Data, Pac.Length – 4);但是解密为什么会崩掉。我所了解的SDDynDll只有可能在线程不同步,同时进入加解密才会出问题,而这段代码已经是在E[……]

Read more

有关C++类成员函数的指针调用

今天做libchd中,在写thread的时候,突然厌烦了重写run虚函数的那种thread,而怀念起了vb时代的addressof操作符,于是想能不能通过指针调用类的成员函数做一个通用的thread类,遂开始捣腾。。

首先,想到一个办法,看能否将一个函数指针声明为void(__thiscall *pFunc)(void),然后在类的构造函数中传入一个这样的类型,结果试了&a.Func,编译错误,再试&A::Func,提示void(__thiscall A::*pFunc)()不能转换成void(__thiscall *pFunc)(),失败。。

然后,又想到一个办法[……]

Read more

无意中发现一个有趣的下断方法~

今天无聊去做LibCHD,参考ArcEmu中的一些代码,无意中看到一行被注释掉的这玩意:
__asm int 3;
很好玩~~IDE中调试倒是用不太上,但是如果自己做一些assert什么的应该就有用了~

不知此文所云的同学回家复习汇编去~[……]

Read more

C++调用COM组件

COM是复杂的,尤其是对于C/C++这样的和COM无关的语言(VB、Delphi、E语言等快速开发工具都是从内核支持COM/ActiveX的)。

一般情况下,在C++中,一个COM组件的调用要经过以下步骤:

1、包含头文件
2、使用CoCreateInstance创建对象并获取接口指针
3、调用组件方法,夹杂着大堆的类型转换等工作
4、手工管理对象生存周期

代码看起来灰常灰常的复杂。

事实上,VC给我们提供了一种和VB一样直观的方便的调用方法。

如VB中写:
Dim http As New XMLHTTP
http.open “GET”, “http:/[……]

Read more

我里个去。。以后就用MSXML了。。

今天想到要长远考虑,做一套完善的用户验证系统。

突然就想到XML技术,想把信息的POST做成XML格式,PHP对XML想必支持也很好的。

遂用VB对象浏览器打开msxml6.dll,好多好多的组件。。

突然看到一XMLHTTP类。

…………

于是发现,原来费多大力气的HttpPost验证,一步步调用WinINet API的那种,居然可以到手不费吹灰之力。。

太不可思议了。。。。。。
Private Sub Command1_Click()
Dim http As New XMLHTTP
http.open “GET”, “http://[……]

Read more

AngelScript试用记

AS是什么时候发现的呢,很久很久以前,下VcAsm大侠的VProtector(怎么认识VcAsm的大名的呢,问SD的彩虹岛DynCode去。。),想知道他那内嵌的C编译器是怎么搞的,用Depends打开EXE,咦,怎么有几个导出函数,Google一下,得到AS脚本引擎~

这次是突然想卖挂生活技能软件,但想把程序和数据分立,也就是说不管是生活技能还是刷BUG还是强制组队隐身什么的都用同样的软件,而封包的逻辑不再硬编码到程序中,也就是要借助脚本语言。

出名的脚本就那么几个,Python、LUA、Ruby等。因为WOW的缘故,LUA依旧是目前世界上最流行的嵌入脚本(Python太大,可以[……]

Read more

有关new() T()

在看AngelScript文档的时候,讲到值对象构造函数和析构函数的注册,看到这样的内容:
void Constructor(void *memory)
{
// Initialize the pre-allocated memory by calling the
// object constructor with the placement-new operator
new(memory) Object();
}
这里的new运算符有点怪哈,以前没见过,但只要不是傻子应该都能从上下文猜出含义。不过为了科学的严谨性,还是上网查了一下。这里就是不分配内存,而是直接在m[……]

Read more

以后多用SAFE_DELETE

前些天羽毛汇报说那天杀的彩虹岛插件服务端又崩了。研究加壳过的程序崩掉后的dmp文件确实是个体力活。从eip来看程序是跑飞了,看了下esp处是个在dll领空内的地址,说明是call飞的,用这个地址减去dll的起始地址,然后用od加载错的dll,把刚才减出的偏移加到这个hmodule上,算是找到了出错的指令了,谢天谢地这段指令没有混淆过。这还没完,要根据这里的汇编码找出对应的源代码位置。。还算比较幸运,这个函数下面一个函数就有了字符串的引用,于是找到代码是OnDisconnect中delete m_session一句出错,从dump来看内存里已经不是SocketSession的内容了,应该是cal[……]

Read more