远程注入代码,一些过时的ring3技术(ASM、VC++、Delphi) (非Dll注入)

ASM:                                                                                             


include b.inc

.code


;/
;///
;/// 说明: 显示一个消息
;/// 参数:
;/// 返回:
;///
;/

ShowTip proc

    invoke GetModuleHandle, $CTA0("user32.dll")
     invoke GetProcAddress, eax, offset $CTA0("MessageBoxA")

    push 64d
    push 0
    push $CTA0("显示一个消息")
    push 0
    call eax
  
    ret

ShowTip endp


;/
;///
;/// 说明: 插入EXE
;/// 参数: Pid = 进程PID
;/// 返回: 成功True,否则False
;///
;/

InjectExe proc uses ebx esi edi Pid

    LOCAL status
    LOCAL hMod: HMODULE
    LOCAL hNHOffset: DWORD
    LOCAL cbImage: DWORD
    LOCAL hProcess: HANDLE, hThread: HANDLE
    LOCAL pBaseAddr: DWORD

    mov status, 0

    invoke GetModuleHandle, NULL
    mov hMod, eax

    mov esi, eax
    assume esi: ptr IMAGE_DOS_HEADER
    push [esi].e_lfanew
    pop hNHOffset
    assume esi: Nothing

    mov eax, hMod
    add eax, hNHOffset
    mov esi, eax
    assume esi: ptr IMAGE_NT_HEADERS
    push [esi].OptionalHeader.SizeOfImage
    pop cbImage
    assume esi: Nothing

    invoke OpenProcess, PROCESS_ALL_ACCESS, FALSE, Pid
    .if eax == NULL
         jmp Err
    .endif
    mov hProcess, eax

    ;//给我释放
    invoke VirtualFreeEx, hProcess, hMod, 0, MEM_RELEASE

    ;//是我的终究是我的
    invoke VirtualAllocEx, hProcess, hMod, cbImage, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE
    .if eax == NULL
         jmp Err
    .endif
    mov pBaseAddr, eax

    ;//可以写进去了
    invoke WriteProcessMemory, hProcess, pBaseAddr, hMod, cbImage, NULL
    .if eax == NULL
        jmp Err
    .endif

    ;//OK,插进去..
    invoke CreateRemoteThread, hProcess, NULL, NULL, offset ShowTip, NULL, NULL, NULL
    .if eax == NULL
        jmp Err
    .endif
    mov hThread, eax
    invoke WaitForSingleObject, hThread, INFINITE
    invoke CloseHandle, hThread

    mov status, 1

Err:

    .if pBaseAddr != NULL
        invoke VirtualFreeEx, hProcess, pBaseAddr, 0, MEM_RELEASE
    .endif

    .if hProcess != NULL
        invoke CloseHandle, hProcess
    .endif

    mov eax, status
    ret

InjectExe endp

;/
;///
;///
;/// PE 入口
;///
;///
;/

start:

    invoke InjectExe,   (you pid?)
    .if eax
        invoke MessageBox, NULL, $CTA0("OK"), NULL, MB_OK
    .endif

    invoke ExitProcess, NULL
end start

 

VC++:                                                                                             

 


#include <windows.h>
#include <tchar.h>

#pragma comment(linker, "/BASE:0x14000000")

typedef int (__stdcall *fnMessageBoxA)(HWND, LPCSTR, LPCSTR, UINT);

//
///
///说明: 显示一个消息
///参数:
///返回:
///
//

void __stdcall ShowTip()
{
     HMODULE hMod;
     fnMessageBoxA myMessageBoxA;

     hMod = GetModuleHandle(L"user32.dll");
     myMessageBoxA = (fnMessageBoxA)GetProcAddress(hMod, (LPCSTR)"MessageBoxA");

     myMessageBoxA(NULL, "显示一个消息", NULL, 64);
}

//
///
///说明: 插入代码
///参数: Pid = 进程PID
///返回: 成功True,否则False
///
//

bool InjectExe(DWORD Pid)
{
     bool status = false;
     LPVOID pBaseAddr = NULL;
     HMODULE hMod = GetModuleHandle(NULL);
     LONG hNHOffset = PIMAGE_DOS_HEADER(hMod)->e_lfanew;
     DWORD cbImage = PIMAGE_NT_HEADERS((DWORD)hMod + (DWORD)hNHOffset)->OptionalHeader.SizeOfImage;

     HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, Pid);
     if (hProcess == NULL)
     {
          goto Err;
     }

     //给我释放哈..
     VirtualFreeEx(hProcess, LPVOID(hMod), 0, MEM_RELEASE);

     //给我哈
     pBaseAddr = VirtualAllocEx(hProcess, LPVOID(hMod), cbImage, MEM_COMMIT | MEM_RESERVE,
          PAGE_EXECUTE_READWRITE);
     if (pBaseAddr == NULL)
     {
          goto Err;
     }

     //写进去
     if (!WriteProcessMemory(hProcess, pBaseAddr, LPCVOID(hMod), cbImage, NULL))
     {
          goto Err;
     }

     //可以插进去了..
     HANDLE hThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)&ShowTip, NULL, NULL, NULL);
     if (hThread == NULL)
     {
          goto Err;
     }

     WaitForSingleObject(hThread, INFINITE);
     CloseHandle(hThread);

     status = true;

Err:

     if (pBaseAddr != NULL)
     {
          VirtualFreeEx(hProcess, pBaseAddr, 0, MEM_RELEASE);
     }

     if (hProcess != NULL)
     {
          CloseHandle(hProcess);
     }

     return status;
}

//
///
///
///PE入口
///
///
//

int APIENTRY _tWinMain(HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPTSTR lpCommandLine,
        int nCmdShow)
{

     if (InjectExe(you exe pid))
     {
          MessageBox(NULL, L"OK", NULL, 64);
     }
     return 0;
}

Delphi:                                                                                             

 

program Project1;

{$IMAGEBASE $14000000}

uses
Windows, SysUtils;

///
///
///说明: 显示消息
///参数:
///返回值:
///
///

procedure ShowTip; stdcall;
type
    TMessageBoxA = function (hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
var
    hMod: HMODULE;
    pFuncAddr: Pointer;
begin
    hMod := GetModuleHandle(PChar('user32.dll'));
    pFuncAddr := GetProcAddress(hMod, PChar('MessageBoxA'));
    if pFuncAddr <> nil then
    begin
        TMessageBoxA(pFuncAddr)(0, PChar('显示一个消息而已'), PChar('当然成功啦'), 64);
    end;
end;

///
///
///说明: 插入代码
///参数: Pid=进程PID
///返回: 成功True,否则False
///
///

function InjectExe(Pid: DWORD): Boolean;
label
    Err;
var
    hMod: HMODULE;
    hNHOffset: Integer;
    cbImage: DWORD;
    hProcess, hThread: THandle;
    pBaseAddr: Pointer;
    dwReserved: DWORD;//纯粹是保留的
begin
    Result := False;

    hMod := GetModuleHandle(nil);
    hNHOffset := PImageDosHeader(Pointer(hMod))^._lfanew;
    cbImage := PImageNtHeaders(Pointer(Integer(hMod) + hNHOffset))^.OptionalHeader.SizeOfImage;

    hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, Pid);
    if hProcess = 0 then
        goto Err;

    //给我释放
    VirtualFreeEx(hProcess, Pointer(hMod), 0, MEM_RELEASE);
    //分配一下内存咯
    pBaseAddr := VirtualAllocEx(hProcess, Pointer(hMod), cbImage, MEM_COMMIT or MEM_RESERVE,
                              PAGE_EXECUTE_READWRITE);
    if pBaseAddr = nil then
        goto Err;

    //写进去
    if not WriteProcessMemory(hProcess, pBaseAddr, Pointer(hMod), cbImage, dwReserved) then
        goto Err;

    //最后一步,插入线程
    hThread := CreateRemoteThread(hProcess, nil, 0, Pointer(@ShowTip), nil, 0, dwReserved);
    if hThread = 0 then
        goto Err;

    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);

    Result := True;

Err:

    if pBaseAddr <> nil then VirtualFreeEx(hProcess, pBaseAddr, 0, MEM_RELEASE);
    if hProcess <> 0 then CloseHandle(hProcess);
end;

///
///
///PE入口
///
///

begin
    if InjectExe(you exe pid) then
        MessageBox(0, PChar('Success'), PChar('插入成功'), 64);
end.

 

    至于VB的已经发过了,上一篇帖子中就有。。。另外ASM生成时需要Link下 /BASE,嗯嗯。。想信这个地球人都会的。

    较早前的代码了,所以发出来看看有没有谁需要用哈??


转载于:http://hi.baidu.com/cxwr/blog/item/8f1cc494f3199b1dd31b7066.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 动态注入代码可以使用反射或者动态生成字节码的方式实现。 1. 反射方式 反射是 Java 中的一种机制,可以在运行时动态地获取类的信息,并对类的属性、方法等进行操作。通过反射可以动态地加载、创建、调用类和对象,从而实现动态注入代码的功能。 以注入一个方法为例: ```java // 获取 Class 对象 Class<?> clazz = Class.forName("com.example.TestClass"); // 获取方法对象 Method method = clazz.getDeclaredMethod("testMethod", String.class); // 设置方法为可访问 method.setAccessible(true); // 执行方法 method.invoke(clazz.newInstance(), "hello"); ``` 2. 字节码生成方式 字节码生成是指在运行时通过程序生成 Java 字节码,然后将其加载到 JVM 中执行。通过字节码生成可以实现动态生成类、方法等功能,从而实现动态注入代码的功能。 以使用 ASM 生成一个类为例: ```java // 生成 ClassWriter 对象 ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); // 定义类 cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "com/example/TestClass", null, "java/lang/Object", null); // 定义方法 MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "testMethod", "(Ljava/lang/String;)V", null, null); mv.visitCode(); mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); // 生成字节数组 byte[] code = cw.toByteArray(); // 加载类 ClassLoader cl = new ClassLoader() { @Override protected Class<?> findClass(String name) throws ClassNotFoundException { if ("com.example.TestClass".equals(name)) { return defineClass(name, code, 0, code.length); } return super.findClass(name); } }; Class<?> clazz = cl.loadClass("com.example.TestClass"); // 创建对象并调用方法 Object obj = clazz.newInstance(); Method method = clazz.getDeclaredMethod("testMethod", String.class); method.invoke(obj, "hello"); ``` 以上是两种实现动态注入代码的方式,具体选择哪种方式取决于应用场景和需求。需要注意的是,动态注入代码有可能会影响系统的安全和稳定性,因此应该谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值