首页
社区
课程
招聘
关于jmp,jla等跳转指令修改
发表于: 2010-3-6 17:55 6770

关于jmp,jla等跳转指令修改

2010-3-6 17:55
6770
我想修改如下跳转指令;(某exe)
指令长度7
0040F4A9    FF248D 15654200    jmp     dword ptr [ecx*4+426515]

指令长度 6
0040F462   0F8E 5A700100      jle     004264C2

改成:(自己创建的dll,remote注入)
jmp dword ptr[函数地址]

call dword ptr[函数地址]

怎么写呢?请教啦
主要是这个jmp dword ptr[函数地址] 怎么变成 一个想对应的汇编指令呢?
还有就是call  函数里面 ret返回的是什么呢?

在线等。谢谢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
输入表里先添加 函数
2010-3-6 18:13
0
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
3
LordPE,PEditor等工具都可以添加的,添加上就可以调用了。
2010-3-6 18:26
0
雪    币: 141
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
对不起,不大理解哦。
我是想把目标的进程的某个JMP改成,自己写的DLL里面的函数,然后在JMP回去。
当然目标进程已经在运行了。。。可以动态添加输入表?
我看到网上很多这么说的。
把 jmp xxxx 改成 call myfun或jmp myfun
我可以读取目标京城的jmp代码(memcpy就行了)。
怎么写回去呢?
2010-3-6 18:31
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
google ->    输入表 site:bbs.pediy.com
2010-3-6 19:24
0
雪    币: 141
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
大哥别这样,好不好。
我这里打开论坛很不容易,慢的比乌龟还慢。
问个问题不容易。
2010-3-6 21:01
0
雪    币: 45
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
动态修改略微麻烦一些。
首先,你要call的函数代码在哪儿?如果是你自己写的函数的话,先OpenProcess打开目标进程,然后VirtualAllocEx在目标进程中分配一段空间,VirtualProtectEx修改页属性,然后把自己的代码拷贝进去,最后call绝对地址就可以。当然你自己写的函数代码里面不能调用API,否则就要附加一段GetProcAddress之类的一大串代码。如果就是个系统函数的话,那就在目标进程中调用GetProcAddress然后call就可以了。
至于你说的机器指令是什么的问题比较简单,查指令集就好了。Intel手册里面就有,可以下载到。
总之在进程内存中写东西是个很麻烦的事情,我也没法给你一两句话就说清楚,还是自己查一下相关资料吧。
2010-3-6 21:45
0
雪    币: 141
活跃值: (10)
能力值: ( 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
2010-3-7 00:58
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
我发了两个程序源码,其中一个是插件,里面有这种注入,自已慢慢看吧
2010-3-7 09:49
0
雪    币: 45
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
理解错了,原来你要注入一个dll进去啊,那个比直接写入代码要简单一些……你的那个过程应该没什么问题。
2010-3-7 10:17
0
雪    币: 141
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
请问 你发的程序在哪里呢??
2010-3-7 12:05
0
雪    币: 141
活跃值: (10)
能力值: ( 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,然后才能继续操作呢?
2010-3-7 12:12
0
雪    币: 141
活跃值: (10)
能力值: ( 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);
        }
}
2010-3-7 18:58
0
雪    币: 141
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
此帖就此了结。以后有问题继续发问,谢谢大家。
2010-3-7 19:02
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
楼主很客气,RP不错,大家互相学习!
2010-3-7 19:41
0
游客
登录 | 注册 方可回帖
返回
//