首页
社区
课程
招聘
[旧帖] [求助]内联汇编解决线程安全 0.00雪花
发表于: 2013-12-13 22:55 1956

[旧帖] [求助]内联汇编解决线程安全 0.00雪花

2013-12-13 22:55
1956
在下闲时研究游戏数据分析。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消息又效率低下,代码编写时重复冗长,也不理想,所以想请教除了这些之外还有什么办法相对完美的。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
插入APC是不错的选择,汇编缺点就是缺乏灵活
2013-12-13 23:10
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
愿闻其详,本人菜鸟一只
2013-12-13 23:22
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
高手们,来点实际的答案吧

HOOK窗口过程,SetWindowsLong让主线程执行CALL不打算用,传递CALL参数是个麻烦。。。写起来也觉得不自然
2013-12-16 00:51
0
雪    币: 985
活跃值: (189)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
在线程里call 崩溃的话 试试用时钟吧
2013-12-16 02:25
0
游客
登录 | 注册 方可回帖
返回
//