jmp,jla,call修改问题,请绑米昂

sd01101230 2010-03-06 06:07:42
我想修改如下跳转指令;(某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[函数地址]

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

在线等。谢谢
...全文
121 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sd01101230 2010-03-07
  • 打赏
  • 举报
回复
谢谢各位回答。
现在的想法是:
假设目标进程如下代码:
...
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
sd01101230 2010-03-07
  • 打赏
  • 举报
回复
已经解决。不过还的继续操作一些细节。费了一天工夫。主要是跳转地址计算错了。
一下是计算方法。。。不知道有没有更好的方法。总觉得这样看起来不好看。呵呵;
以下是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);
}
}

这里似乎很冷清,还不如看雪论坛上的。虽然也冷清。
哈利路亚1874 2010-03-06
  • 打赏
  • 举报
回复
Ret指令执行两个操作:
1.弹栈,弹出,EBP和返回地址
2.跳转到返回地址(函数调用处)处继续执行
cy330206 2010-03-06
  • 打赏
  • 举报
回复
ajmp 函数地址 这个就是调用函数的。。
关于调用函数的过程是这样的:先是把函数下一条指令的地址压入堆栈中,再是跳到函数的地址执行程序,当遇到ret时,就把压入堆栈的地址弹出来了,从而执行函数结束后下一条指令

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧