能力值:
( LV2,RANK:10 )
|
-
-
2 楼
输入表里先添加 函数
|
能力值:
( LV9,RANK:160 )
|
-
-
3 楼
LordPE,PEditor等工具都可以添加的,添加上就可以调用了。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
对不起,不大理解哦。
我是想把目标的进程的某个JMP改成,自己写的DLL里面的函数,然后在JMP回去。
当然目标进程已经在运行了。。。可以动态添加输入表?
我看到网上很多这么说的。
把 jmp xxxx 改成 call myfun或jmp myfun
我可以读取目标京城的jmp代码(memcpy就行了)。
怎么写回去呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
google -> 输入表 site:bbs.pediy.com
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
大哥别这样,好不好。
我这里打开论坛很不容易,慢的比乌龟还慢。
问个问题不容易。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
动态修改略微麻烦一些。
首先,你要call的函数代码在哪儿?如果是你自己写的函数的话,先OpenProcess打开目标进程,然后VirtualAllocEx在目标进程中分配一段空间,VirtualProtectEx修改页属性,然后把自己的代码拷贝进去,最后call绝对地址就可以。当然你自己写的函数代码里面不能调用API,否则就要附加一段GetProcAddress之类的一大串代码。如果就是个系统函数的话,那就在目标进程中调用GetProcAddress然后call就可以了。
至于你说的机器指令是什么的问题比较简单,查指令集就好了。Intel手册里面就有,可以下载到。
总之在进程内存中写东西是个很麻烦的事情,我也没法给你一两句话就说清楚,还是自己查一下相关资料吧。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
谢谢回答。。。
对于这个有些不明白:《自己的代码拷贝进去》,把自己编译好汇编代码copy进去???
现在想这么做,不知道行不行。
假设目标进程如下代码:
...
404000 jmp dword ptr[ecx * 4 + 400000] // 这是动态生成的地址,假设405000
....
405000 mov ecx,100;
1.首先是一个目标进程,一个自己写的DLL,DLL里面包含一个处理函数myfun.
2.在DLL被远程注入时,在DLL_PROCESS_ATTACH时,用VirtualAlloc函数分配一段可用内存。(此时DLL已经映射到目标进程,所以不需要用VirtualAllocEx函数了)。
3.用VirtualAlloc得到内存里面写入:
501000 push ecx
call dword ptr[myfun]
jmp 405000;//返回处理
4.用WirteProcessMemery函数把404000地址内容替换成:
jmp 501000;
5.在DLL_PROCESS_DETTACH时,把原先的替换回去。
不知道这样可行吗?
另外这几个指令在OD里面得到了指令编码,jmp/call 后面的地址计算也找到了。
IP1,IP2是地址
假如:IP1=4ED879H
IP2=2
那么最终jmp代码:E9 0FFB12784H
IP1 JMP IP2
IP2-(IP1+本句指令字节数)=2-(4ED879H+5)=0FFB12784H
|
能力值:
( LV3,RANK:20 )
|
-
-
9 楼
我发了两个程序源码,其中一个是插件,里面有这种注入,自已慢慢看吧
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
理解错了,原来你要注入一个dll进去啊,那个比直接写入代码要简单一些……你的那个过程应该没什么问题。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
请问 你发的程序在哪里呢??
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
有问题了。。
弄了半天也没出来,一开始是那块Jmp地址不可写,后来用了virtualprotect函数修改就可以了。
但是呢。最后还是不成功。就是因为自己写的函数是在dll里面的。可能要getprocaddress一下吧。
比如:
进程exe:
404000 jmp dword ptr[ecx * 4 + 400000] // 这是动态生成的地址,假设405000
....
405000 mov ecx,100;
自己的DLL:
78001123 myfun
virtualAlloc返回的地址和自己创建一个CALL指令(OD下看到了这个指令):
540000 call 78001123
已经成功的修改了404000处的值,成功跳到了540000,但是call是失败的,程序爆了。可能找不到这个地址或没有权利去访问吧。。。
是不是应该先getprocaddress自己的DLL,然后才能继续操作呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
已经解决。不过还的继续操作一些细节。费了一天工夫。主要是跳转地址计算错了。
一下是计算方法。。。不知道有没有更好的方法。总觉得这样看起来不好看。呵呵;
以下是DLL_PROCESS_ATTACH时进行的初始化,替换进程内存地址0x00401095处,跳入自己的DLL函数。
细节再慢慢的来就行了。呵呵。
char *old_add = (char *)0x00401095;
char old_buf[5] = {0};// = {0x68,0x50,0x50,0x40,0x00};
typedef void (__stdcall *PTESTER)(void);
DLLEXPORT void __stdcall ex_test(void){
MessageBoxA(NULL,"aa","bb",MB_OK);
}
char *ppf;
extern void init(BOOL bInit,HMODULE hModule){
if(bInit){
int cb = 100;
pszLibFileRemote = (char *) VirtualAlloc(NULL, cb, MEM_COMMIT, PAGE_READWRITE);
if(!pszLibFileRemote){MessageBoxA(NULL,"VirtualAlloc",NULL,MB_OK);}
ppf = (char *)GetProcAddress(g_hModule,"ex_test");
memcpy(&pszLibFileRemote[80],ppf,4);
int jmp_add = (int)(PTESTER)pszLibFileRemote;
memcpy(old_buf,old_add,5);
///////////////////////////// call addr
char jmp_call_tab[5] = {0};
jmp_call_tab[0] = 0xe8;
DWORD fun_add = (DWORD)(ppf);
DWORD go = fun_add - (DWORD)jmp_add - 5;
memcpy(&jmp_call_tab[1],(char *)(&go),4);
memcpy(pszLibFileRemote,jmp_call_tab,5);
int cur_add = (int)old_add;
int jra = jmp_add - cur_add - 5;
char jmp_tab[5];
jmp_tab[0] = 0xE9;
memcpy(&jmp_tab[1],(char *)&jra,4);
//////////////-----
DWORD old=0;
BOOL v = VirtualProtect(old_add,5,PAGE_READWRITE,&old);
if(!v){MessageBoxA(NULL,"VirtualProtect",NULL,MB_OK);}
memcpy(old_add,jmp_tab,5);
}else{
memcpy(old_add,old_buf,5);
if (pszLibFileRemote != NULL)
VirtualFree(pszLibFileRemote, 0, MEM_RELEASE);
}
}
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
此帖就此了结。以后有问题继续发问,谢谢大家。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
楼主很客气,RP不错,大家互相学习!
|