-
-
[旧帖]
[求助]内联汇编解决线程安全
0.00雪花
-
发表于:
2013-12-13 22:55
1957
-
[旧帖] [求助]内联汇编解决线程安全
0.00雪花
在下闲时研究游戏数据分析。DLL注入游戏进程,调用某个CALL几次或多次后就会导致游戏崩溃出错。
经过多方查找原因,基本确定是游戏主线程的同步问题,因为如果是别的原因,应该一次也不能正常调用。于是网上找到一篇贴子,似乎是针对这种非线程安全的CALL调用方法的,原文如下:
在游戏地址空间找到一处空位置 写入如下机器码
004014D9 58 pop eax ; 弹出返回地址
004014DA A3 E8144000 mov dword ptr ds:[4014E8],eax ; 保存返回地址
004014DF 58 pop eax ; 弹出选怪call地址
004014E0 FFD0 call eax ; 在游戏空间内调用了选怪call
004014E2 - FF25 E8144000 jmp dword ptr ds:[4014E8] ; 返回调用处
004014E8 90 nop ; 004014E8下面4个字节用来保存返回地址
004014E9 90 nop
004014EA 90 nop
004014EB 90 nop
004014EC 90 nop
004014ED 90 nop
004014EE 90 nop
===========================
下来我们看看 怎么调用他 (004014D9)
004014D4 90 nop
004014D5 C2 0400 ret 4 ; 比如这里是有一个参数的选怪call 所以是 ret 4
004014D8 90 nop
===========================
push 1 ;压入选怪参数
push Spy4Win.004014D5 ; 压入选怪call地址 比如这个地址是选怪call
mov eax,Spy4Win.004014D9 ; 这里是我们在exe地址空间内找到的可用地址
call eax
这样 到选怪call以后 调用选怪call的就是游戏自己了
===============================
以上红色字部分是原文。不太确定这样是否正是针对非线程安全CALL的调用方法,如果是的话,那么具体用C++代码该如何实现?
比如“游戏中申请一块空白内存”,我这样理解,因为DLL已经注入到游戏中,所以只需要
byte Addr[256] = {0}; 即可申请一块空白的内存区域
那么后面接着该如何编写内联汇编来实现上述过程呢?望高手不吝赐教
假设选怪CALL原型为
_asm
{
push 1
mov ecx,0xE6F889 //游戏内部的选怪函数地址
call ecx
}
虽然可以settimer、窗口子类化等方法来假手游戏主线程执行CALL避免线程同步问题,但实际辅助中会包含很多逻辑判断、while循环之类的代码,利用时钟显然不太完美,而窗口子类化,HOOK消息又效率低下,代码编写时重复冗长,也不理想,所以想请教除了这些之外还有什么办法相对完美的。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课