首页
社区
课程
招聘
如何让函数内的一个标号变成全局有效?
发表于: 2010-1-22 15:29 4171

如何让函数内的一个标号变成全局有效?

2010-1-22 15:29
4171
VOID MyKeyboardClassServiceCallbackMom()
{
MyKeyboardClassServiceCallback:
_asm pushad
_asm mov esi,[esp+28h]
_asm mov ecx,[esp+2ch]
_asm sub ecx,eax
_asm lea edi,KeyBoardBuff
_asm rep movsb
_asm popad               
_asm jmp gkbdCallBack.serviceCallBack
};
我想让红色部分的标号变成全局的,有何良策...

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 131
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不用函数,把代码直接写到进程的入口函数中。
2010-1-22 17:41
0
雪    币: 101
活跃值: (154)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
_IN_MostID dd 0 ;全局变量

_R_code_ChooseMonster proc
        call @F
@@:
        pop ebx
        sub ebx , offset @B
        mov ecx , [ebx+_IN_MostID] ;类病毒自定位技术,这样就做到全局了。ecx = IN_MostID(全局变量)
        ret

_R_code_ChooseMonster endp
2010-1-22 17:51
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
MyKeyboardClassServiceCallbackMom本身就可以当全局标签用呀
2010-1-22 21:42
0
雪    币: 101
活跃值: (154)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
回楼上,看楼主的代码,很显然是想将代码注入,要不然不会用asm。
楼主既然会用asm ,当然最基本的知识(全局变量)是明白的。
注入后的地址不确定,所民全局函数无法直接使用,需进行自定位。
2010-1-23 10:44
0
雪    币: 75
活跃值: (803)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
自定位来不及,在未运行到自定位就要用这个标号,只有在入口函数末尾把代码放上去,不用函数形式了.
2010-1-23 13:15
0
雪    币: 101
活跃值: (154)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
楼上错误理解了,我不会用C++,但是用ASM却能很好的处理。
例如:
R_CODE_GETADDSUB_START equ this byte ;注入代码的起点

_IN_MostID dd 0 ;全局变量

_R_code_ChooseMonster proc ;用户函数
  call @F
@@:
  pop ebx
  sub ebx , offset @B
  mov ecx , [ebx+_IN_MostID] ;类病毒自定位技术,这样就做到全局了。ecx = IN_MostID(全局变量)
  ret
_R_code_ChooseMonster endp

R_CODE_GETADDSUB_END equ this byte ;注入的结束点
R_CODE_GETADDSUB_LEN equ offset R_CODE_GETADDSUB_END-R_CODE_GETADDSUB_START
;R_CODE_GETADDSUB_LEN注入的长度

然后用下面的代码注入:
;入口参数 进程句柄,注入代码的起始地址,代码的大小
;出口参数 目标进程中注入代码的超始地址
X_codeInj proc hProcess , lpStartCode , nSize
        local @dwTemp : DWORD ;临时变量
        local @lpCode : DWORD ;分配内存的起点
       
        .if !hProcess
                xor eax , eax
                ret
        .endif
        ;1.分配内存
        invoke VirtualAllocEx , hProcess , NULL , nSize , MEM_COMMIT , PAGE_READWRITE
        .if !eax
                xor eax , eax
                ret
        .endif
        mov @lpCode , eax
        ;2.写入代码
        invoke WriteProcessMemory , hProcess , @lpCode , lpStartCode , nSize , addr @dwTemp
        .if !eax
                xor eax , eax
                ret
        .endif
        mov eax , @lpCode
        ret
X_codeInj endp
正确的填写参数后,你就将R_CODE_GETADDSUB_START 与 R_CODE_GETADDSUB_END
之间的代码全部注入了目标进程。
这里再创建一个远线程,代码的执行点为函数的起点,这样就OK了。
我已按这种方法实现了外挂。
具体你可参考我写的帖子:http://bbs.pediy.com/showthread.php?t=104336
2010-1-23 13:32
0
雪    币: 75
活跃值: (803)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
感谢楼上錒,学了下远程注入的东东.
不过我的应用环境跟你有点不一样.为什么我说 自定位来不及呢?

我的目的是劫持kbdclass的回调例程,在它之前做一些自己的处理
NTSTATUS DriverEntry (
        PDRIVER_OBJECT DriverObject,
        PUNICODE_STRING registerPath
        )
{
      xxxx
...................................
      代码A处
               /*这里是把i8042prtdeviceextension结构里指向KeyboardClassServiceCallback的指针改成指向MyKeyboardClassServiceCallback*/
        _asm push eax
        _asm push ebx
        _asm mov eax,gkbdCallBack.AddressStoreCallBack
        _asm mov ebx,MyKeyboardClassServiceCallback
        _asm mov dword ptr[eax],ebx
        _asm pop ebx
        _asm pop eax
........................................
                xxxxx
        return STATUS_SUCCESS;
       
        MyKeyboardClassServiceCallback:
        _asm pushad
        _asm xor ecx,ecx
        _asm mov esi,[esp+28h]
        _asm mov ecx,[esp+2ch]
        _asm sub ecx,esi
        _asm push ecx
        _asm push esi
        _asm call MyWriteCircleBuff
        _asm popad               
        _asm jmp gkbdCallBack.serviceCallBack


}
我只需要在我的驱动里面有空间容纳我的处理代码(红色部分)就行了,刚开始是想弄个函数把处理代码放在函数里面,但里面的标号是局部的,没办法弄成全局,所以出帖向大家请教.用自定位的确是可以把这个标号的地址保存到一个全局变量里,
VOID MyKeyboardClassServiceCallbackMom()
{
MyKeyboardClassServiceCallback:
_asm call Next
Next:
_asm pop ebx
......
_asm mov GdbTab,ebx

_asm pushad
_asm mov esi,[esp+28h]
_asm mov ecx,[esp+2ch]
_asm sub ecx,eax
_asm lea edi,KeyBoardBuff
_asm rep movsb
_asm popad   
_asm jmp gkbdCallBack.serviceCallBack
};
但我要得到这个全局标号的前提是这段代码要先于代码A处运行(代码A那里就要用到这个标号).那这个函数就要先跑一遍,但我现在这样的情况...这函数不管怎么弄,一跑肯定蓝屏..所以我说自定位来不及.
2010-1-23 16:18
0
游客
登录 | 注册 方可回帖
返回
//