首页
社区
课程
招聘
[求助]替换代码的问题
发表于: 2008-2-24 19:55 6065

[求助]替换代码的问题

2008-2-24 19:55
6065
注入DLL到目标进程后,替换$006cbfb7的代码,JMP到新的地址执行后再跳转回去,可是下面的代码为啥不行呀?可以改了$006cbfb7的代码为JMP XXXXXX 可是在XXXX那不是我的代码呀

procedure jmpmyfunc;
var
NewOrder:array   [0..5]   of   Byte;
JmpCode:array [0..10] of Byte;
Tmp   :   array   [0..3]   of   Byte;
nSize:Cardinal;
Dat:   DWORD;

const oldadr=$006cbfb7;
const retadr=$006cbfbd;

begin
JmpCode[0]:=$64;                {mov eax,fs[00000000] jmp  006cbfbd}
JmpCode[1]:=$a1;
JmpCode[2]:=$00;
JmpCode[3]:=$00;
JmpCode[4]:=$00;
JmpCode[5]:=$00;
JmpCode[6]:=$e9;
JmpCode[7]:=$ac;
JmpCode[8]:=$bf;
JmpCode[9]:=$38;
JmpCode[10]:=$f4;

MyAdr := VirtualAllocEx(ProcessHandle, nil, 512, MEM_COMMIT, PAGE_EXECUTE_READWRITE); //建立内存
Dat   :=   DWORD(@MyAdr);
Move(Dat,   Tmp,   4);
NewOrder[0]   := $e9 ;            {jmp MyAdr}
NewOrder[1]   := Tmp[0];
NewOrder[2]   := Tmp[1];
NewOrder[3]   := Tmp[2];
NewOrder[4]   := Tmp[3];
NewOrder[5]   := $90;

WriteProcessMemory(ProcessHandle, Pointer(oldadr),   @NewOrder, 6,   nSize);
WriteProcessMemory(ProcessHandle, MyAdr,@JmpCode, 11, nSize);
end;

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
看不懂你的代码。
E9 后面应该是偏移,不是绝对地址,是不是这里错了
2008-2-24 20:08
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我根据网上的代码改的呀,怎么取偏移地址呀
2008-2-24 20:22
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
4
我只是猜的,你的E9后面是直接写的你要跳的地址吗?

好像是目的地址-e9所在地址-5
2008-2-24 20:44
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
改成这样的也不行,是根据API HOOK的代码改的,为啥它的就能直接跳到指定的函数呀
procedure myfunc;
const retadr:integer=$006cbfbd;
begin
asm
mov eax,fs:[00000000]
jmp retadr
end;
end;

procedure jmpmyfunc;
var
NewOrder:array  [0..5]   of   Byte;
JmpCode:array [0..10] of Byte;
Tmp   :   array  [0..3]   of   Byte;
nSize:Cardinal;
Dat:   DWORD;

const oldadr=$006cbfb7;

begin
Dat := DWORD(@myfunc);
Move(Dat, Tmp, 4);
NewOrder[0]   := $e9 ;            {jmp MyAdr}
NewOrder[1]   := Tmp[0];
NewOrder[2]   := Tmp[1];
NewOrder[3]   := Tmp[2];
NewOrder[4]   := Tmp[3];
NewOrder[5]   := $90;

WriteProcessMemory(ProcessHandle, Pointer(oldadr),   @NewOrder, 6,   nSize);
end;
2008-2-24 21:07
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
6
我好像也写过一个类似的,不过是汇编写的,当时好像是用的 push + ret ,这样就可以直接写你的地址了。
我先在论坛里找找看看
2008-2-24 21:12
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
是不是MYADR的地址-E9地址-指令长度,可是我用OD看的时候把JMP后面的地址-E9地址-指令长度那也不是我的代码呀
2008-2-25 10:27
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
8
因为我实在是看不懂你的代码,所以我不好确定你的到底是哪地方出错了,我找到了我以前写的文章,汇编写的,希望能对你有帮助。有可能是代码重定位或你的数组写入顺序等问题
http://bbs.pediy.com/showthread.php?t=54960
第四部分中有关于写代码的
2008-2-25 10:48
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
WriteProcessMemory(ProcessHandle, MyAdr,@JmpCode, 11, nSize);是不是这句出错了呀
2008-2-25 12:53
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
10
可以自己用OD调一个看看哪错了,不行就把你的两个程序传上来我看看
2008-2-25 14:00
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
11
jmp跳转使用的是相对偏移地址,你取得的是绝对地址,肯定会出错。你应该将绝对地址转换成相对地址才行。计算公式如下:
jmp 相对地址 = jmp 目的地址 - jmp当前地址 - jmp代码长度(jmp长跳这里是5,短跳这里是2,你使用的是E9长跳,所以jmp代码长度就是5)。
2008-2-25 14:06
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢,再问一下能不能像五楼的那样跳转到一个函数呀?然后在函数中写JMP跳转回去??
2008-2-25 21:40
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
13
注意堆栈平衡就行。
2008-2-25 21:46
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
可以从EXE中直接跳到DLL中的函数吗?

堆栈平衡怎么做呀?能否写个例子呀, 中间有JMP的??
2008-2-25 21:58
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
15
我好像也写过一个,我找找看,一会给你链过来

http://bbs.pediy.com/showthread.php?t=58993
里面写代码的部分就是跳过来又跳回去的,你看看吧
2008-2-25 22:07
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
是不是就是加个PUSHAD,然后做完想做的,然后再POPAD,然后再JMP???
函数的入口是不是有PUSH EBP...的代码,如果在函数中跳转回去了,是不是原先的代码就不能正常执行了?
2008-2-25 23:08
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
17
pushad和popad是保护现场。
堆栈平衡一是注意自己写的代码里的push 和 pop成对出现,中间调用函数时也要注意。
二是要注意如果你跳出时和跳进的地方不是同一地方,省掉的代码中如果含有出入栈动作你也要手动给他平衡了。
2008-2-25 23:16
0
游客
登录 | 注册 方可回帖
返回
//