首页
社区
课程
招聘
[求助]获取其他进程类指针
发表于: 2016-6-16 18:31 7081

[求助]获取其他进程类指针

2016-6-16 18:31
7081
最近研究一个东西 需要注入一个进程内 并调用一个函数

但是这个函数是类函数 需要获取到类指针才可以调用吧

怎么样才可以获取到这个类的指针呢···求助
  v43 = this;
  result = sub_100061B0(this + 2128);
  v170 = result;
  if ( result )
  {
    switch ( v170 )
    {
      case 1:
        if ( *(v43 + 140) >= 0 && (*(v43 + 140) > 0 || *(v43 + 136)) && *(v43 + 136) <= *(v43 + 120) )
        {
          memset(&v144, 0, 0x38u);
          v145 = *(v43 + 136);
          v146 = *(v43 + 140);
          v144 = *(*(v43 + 116) + 8);
          result = CBankStorage::SendData(v43, 96, 250, &v144, 56);
        }


V43就是类指针 难道只能说他调用第一次的时候保存起来么?不能通过其他方法获取到么

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 83
活跃值: (158)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
进场句柄?
2016-6-16 21:20
0
雪    币: 11
活跃值: (94)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
hook
2016-6-16 21:48
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
跟踪相关寄存器值的来源
2016-6-16 23:45
0
雪    币: 1285
活跃值: (1068)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
特征码搜索?可以参考下我以前取SOCKET句柄的代码

#define SOCKET_INF 			"\x8D\x4D\x08\x8D\x55\xEC\x51\x52\x6A\x00\x8D\x8D\x40\xF0\xFF\xFF\x68\xAA\x0F\x00\x00\x51\x50"
#define SOCKET_INF_BYTES 	sizeof(SOCKET_INF)-1

SOCKET 	m_GameSocket=0;
void	*psocket_filter = NULL;

__declspec(naked)void socket_filter()
{
	__asm
	{
		mov m_GameSocket,eax
		jmp psocket_filter
	}
}

void InitHook()
{
	void	*pModBase = (void*)GetModuleHandleA("xxxx.dll");
	psocket_filter = FIND_MEMORY(n,SOCKET_INF);
	if(psocket_filter)
	{
		DetourTransactionBegin();
		DetourAttach((void**)&psocket_filter,socket_filter);
		DetourTransactionCommit();
	}
}
上传的附件:
2016-6-17 01:02
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
6
比如一个类成员函数或虚函数,原型是:
void CXXX::FuxkWorld(int world)

那你就先确定函数地址,然后以
void (__fastcall *CXXX_FuxkWorld)(void *pthis, int dummy, int world)
的形式去inline hook该函数。
hook到之后去
void __fastcall NewCXXX_FuxkWorld(void *pthis, int dummy, int world)
{

}

里面取void *pthis就得到this指针了。
2016-6-17 09:46
0
雪    币: 1392
活跃值: (5202)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
7
.................
你这种直接使用void*pthis一般是COM口兼容的形式,
COM口写代码的时候是 pcomobject->func(x,y)实际上还是把this做为第一个参数传入。典型 的就是D3D9接口  
pcomobject->func(x,y)
==>
func(this,x,y)

而真正的class 调用 是将this放在ecx寄存器内
pclass->func(x,y)
==>
mov ecx,this
call func(x,y)
2016-6-17 15:02
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
8
具体情况具体分析,D3D那样的COM接口直接__stdcall *fn(void *pthis, 其他参数);
就行了

真正的__thiscall要用__fastcall模拟
2016-6-17 15:31
0
雪    币: 1392
活跃值: (5202)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
9
fastcall 是ecx edx传递前两个参数。
C++成员函数X86下就是 ECX=this。其他的参数还是按照原来的压栈方式。fastcall没法模拟
2016-6-17 17:31
0
雪    币: 147
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你研究的东西是网狐棋牌游戏客户端吗?
如果是的话可以从CGameFrameEngine::m_pGameFrameEngine 入手。
2016-6-17 20:59
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
11
你看我说的了吗,我说的是第一个参数void *pthis,第二个参数填int dummy,用来占据edx的位置,我用这种参数格式hook很多次了,从来没有boom过一次
2016-6-17 23:19
0
雪    币: 8
活跃值: (33)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
正解看了半天 ecx就是this
2016-6-20 21:12
0
雪    币: 397
活跃值: (397)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
13
已经注入进去了,1 直接调用但参数填写要构造好,或者这个函数有依赖,直接调用会有问题。需要仔细看看。
2 间接调用,要么获得这个类实例,你来调用。
3 要么获得对这个类里面这个函数的上层调用(如果有的话),看具体的环境了。
2016-6-21 11:50
0
游客
登录 | 注册 方可回帖
返回
//