能力值:
( LV2,RANK:10 )
|
-
-
2 楼
不用函数,把代码直接写到进程的入口函数中。
|
能力值:
( 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
|
能力值:
( LV3,RANK:20 )
|
-
-
4 楼
MyKeyboardClassServiceCallbackMom本身就可以当全局标签用呀
|
能力值:
( LV3,RANK:20 )
|
-
-
5 楼
回楼上,看楼主的代码,很显然是想将代码注入,要不然不会用asm。
楼主既然会用asm ,当然最基本的知识(全局变量)是明白的。
注入后的地址不确定,所民全局函数无法直接使用,需进行自定位。
|
能力值:
( LV6,RANK:90 )
|
-
-
6 楼
自定位来不及,在未运行到自定位就要用这个标号,只有在入口函数末尾把代码放上去,不用函数形式了.
|
能力值:
( 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
|
能力值:
( 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那里就要用到这个标号).那这个函数就要先跑一遍,但我现在这样的情况...这函数不管怎么弄,一跑肯定蓝屏..所以我说自定位来不及.
|
|
|