我前面发了一个贴子。可能请得不是太清楚。 比如反汇编程序里面有这样一段代码。 400001 push ecx
400002 call xxxxxxxx
40007 mov [esi+64],eax
call xxxxxxxxxx 这里面是一个记算函数。最后得出eax的值。
我在CE里面,可以用CE的代码注入把mov [esi+64] 改成jmp 0700001 然后再 0700001 call xxxxxx
mov [我分配的地址],eax
jmp 400007 我现在有几个问题想请教下。 首先,如何用高级语言来实现CE的代码注入功能?
我现在的方法是。在CE里面改好。把字节记下来。然后用D写代码。一个字节一个字节的改。我想我这个方法肯定是不行的。 麻烦。而且无法确定分配的地址。 其次,听别人说还可以注入自己的函数。
比如 procedure newfun;
begin
end;用@ 取地址。
那是不是这样来写
begin
pbyte($0700001)^:=$e9;
pint($0700002)^:=integer(@newfun);
希望各位有空能指点一下。或者给些相关资料让我自己去看。谢谢各位。
400002 call xxxxxxxx
40007 mov [esi+64],eax
call xxxxxxxxxx 这里面是一个记算函数。最后得出eax的值。
我在CE里面,可以用CE的代码注入把mov [esi+64] 改成jmp 0700001 然后再 0700001 call xxxxxx
mov [我分配的地址],eax
jmp 400007 我现在有几个问题想请教下。 首先,如何用高级语言来实现CE的代码注入功能?
我现在的方法是。在CE里面改好。把字节记下来。然后用D写代码。一个字节一个字节的改。我想我这个方法肯定是不行的。 麻烦。而且无法确定分配的地址。 其次,听别人说还可以注入自己的函数。
比如 procedure newfun;
begin
end;用@ 取地址。
那是不是这样来写
begin
pbyte($0700001)^:=$e9;
pint($0700002)^:=integer(@newfun);
希望各位有空能指点一下。或者给些相关资料让我自己去看。谢谢各位。
修改目标进程的代码,属于反汇编的范畴,一般只做一些简单的修改,例如修改指令中的立即数或地址,或者是插入跳转指令,使其跳转到自己的代码上。
注入函数是在目标进程内分配内存,把函数的代码复制过去,然后利用CreateRemoteThread或者插入跳转指令等方式使注入函数被执行。函数中最好不要使用任何静态数据或函数,如果需要使用则需要重定位,这种注入的函数用汇编来写相对容易一些。
[email protected]
00518044 - e8 37 5e fc ff - call 0043de80
00518049 - 8b c8 - mov ecx,eax 我现在想替换掉call 0043de80 改成我自己的CALL
我的代码这样写
function myfun(dz:integer):integer;
begin
result:=$30;
end;procedure TForm1.sButton1Click(Sender: TObject);
begin
pint($00518044+1)^:=integer(@myfun);
end; 修改后,我看了下反汇编。进程的内存中的CALL地址的确必变了。但是我跟进这个CALL。
结果变成了。。 05D07620 - 00 00 - add [eax],al 我改这个CALL的目的是想修改这个CALL的返回值。 但是按我的理解。我这个CALL这样写程序肯定会死掉。好像CALL都没有RET。
所以我想请教一下。像这种代码应该如何写。
还有比如我想在我自己写的过程中加一个判断。
00518042 - 8b c8 - mov ecx,eax
判断ecx 的值是否是我指定的值。如果不是,就执行原来的CALL返回,是的,就通过我的CALL返回我给出的值。希望各位指点下。不胜感谢。
pint($518049+1)^:=integer(@isSelfAddr)-$518049;这样的结果也不对。
eb是短跳转指令的机器码,段内调用指令的机器码是e8。
var gPRemoteThread: Pointer; //远程线程地址
NumberOfBytesWritten,PHandle: Cardinal;PHandle:=目标进程句柄procedure RunAsmThreadCY(); stdcall;
begin
asm end;
end;gPRemoteThread := VirtualAllocEx(PHandle, nil, dwSize, MEM_COMMIT + MEM_RESERVE, PAGE_EXECUTE_READWRITE);WriteProcessMemory(PHandle, gPRemoteThread, @RunAsmThreadCY, dwSize, NumberOfBytesWritten) ;
CreateRemoteThread(PHandle , nil, 0, gPRemoteThread, nil, CREATE_SUSPENDED, NumberOfBytesWritten);