精华内容
下载资源
问答
  • 白帽子(5)- 命令注入与代码注入区别
    2020-12-20 15:44:26
    1. 命令注入
      当应用程序需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数,如php中的system, exec, shell_exec, passthru()等,当用户可以控制名利执行函数中的参数是,将可注入系统名利到正常名利中,造成命令注入攻击,如system(args), args= ‘cat /etc/passwd’;
    2. 代码注入
      应用程序在刁永杰一些能够将字符串转为代码的函数(如php中的eval, create_function(), call_user_func(),call_user_func_array())时, 没有考虑用户是否可以控制这个字符串,将造成代码执行漏洞,如(eval(“args”)); args=‘system(‘cat /etc/passwd’)’, 获取http://ip/?func=phpinfo();

    总结: 代码注入一般包含带有执行系统命令的函数或者引发漏洞的函数不同。

    更多相关内容
  • 汇编代码注入工具,窗口内写入汇编代码,选择目标进行,打开进程,注入代码测试。主要用于远程调用目标进程内的函数。
  • x64代码注入器1.0.rar

    2021-05-22 14:36:15
    本工具由独立团官方开发,用于测试x64程序执行汇编call功能测试,写x64内存辅助必备工具 可以端游,手游模拟器 ...工具作用类似于之前的32位的代码注入器,用于写call之前的分析call测试call参数调用
  • 目的 在目标程序远程注入代码,并执行注入的调用代码

    目的

    在目标程序远程注入代码,并执行注入的调用代码。


    这是原来正常调用时弹出的消息

    下图是经过了远程注入代码调用的消息

    原理:将调用目标函数的代码,sellcode的形式写入到目标进程中,再远程调用写入的代码。

    核心代码:

    //构造的调用目标函数
    void MsgCall(LPVOID lParam)
    {
    	DWORD moduleBase = 0;
    	MessageParam* msgPara = (MessageParam*)(lParam);
    	_GetModuleHandle m = (_GetModuleHandle)(*(DWORD*)(lParam));
    	moduleBase = (DWORD)m(NULL);
    	DWORD nameBase = msgPara->maistrBase;
    	if (moduleBase)
    	{
    		DWORD _CALL = moduleBase + CALL_MSG_BASE;
    		_asm
    		{
    			push nameBase
    			mov eax, _CALL
    			call eax
    			add esp,4
    		}
    	}
    }
    //************************************************************************************** 
    //函数名:InSendFunc
    //功能  :封装远程注入的函数 
    //参数 1:进程句柄  
    //参数 2:进程ID  
    //参数 3:被注入函数指针<函数名>  
    //参数 4:参数  
    //参数 5:参数长度  
    //参数 6:注入函数地址
    //参数 7:注入的参数地址
    //************************************************************************************** 
    void InSendFunc(HANDLE hProcess, DWORD dwProcId, LPVOID mFunc, LPVOID Param, DWORD ParamSize, LPVOID mFuncAddr, LPVOID ParamAddr)
    {
    
    	HANDLE hThread = NULL;    //线程句柄 
    	DWORD NumberOfByte = NULL; //辅助返回值 
    	//打开被注入的进程句柄     
    	__try {
    
    		//写内存  
    		if (!WriteProcessMemory(hProcess, mFuncAddr, mFunc, 128, &NumberOfByte)) {
    			__leave;
    		}
    		WriteProcessMemory(hProcess, ParamAddr, Param, ParamSize, &NumberOfByte);
    
    		//创建远程线程 
    		hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)mFuncAddr,
    			ParamAddr, 0, &NumberOfByte);
    		if (hThread == NULL) {
    			__leave;
    		}
    		WaitForSingleObject(hThread, INFINITE); //等待线程结束 
    		//释放申请有内存 
    	}
    	__finally {
    		//释放远程句柄 
    		if (hThread)
    		{
    			CloseHandle(hThread);
    		}
    	}
    }
    
    void CRemoteCallDemoDlg::OnBnClickedOk()
    {
    	UpdateData(TRUE);
    	HWND hGameWnd = ::FindWindow(NULL, _T("演示DEMO"));
    	if (NULL == hGameWnd)
    	{
    		MessageBox(_T("未找到窗口"));
    		return;
    	}
    	DWORD dwProcessId = 0;
    	DWORD dwThreadId = ::GetWindowThreadProcessId(hGameWnd, &dwProcessId);
    	//获得目标进程中 LoadLibrary函数的地址
    #if _UNICODE
    	void(*addrRemoteLoadLibrary)(wchar_t*) = (void(*)(wchar_t*))GetProcAddress(GetModuleHandle(_T("Kernel32.dll")), "GetModuleHandleW");
    #else
    	void(*addrRemoteLoadLibrary)(char*) = (void(*)(char*))GetProcAddress(GetModuleHandle(_T("Kernel32.dll")), "GetModuleHandle");
    #endif
    	//提权
    	ImproveProcPriv();
    	HANDLE hProcess = INVALID_HANDLE_VALUE;
    	hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessId);
    	if (NULL == hProcess) {
    		MessageBox(_T("无法打开进程"));
    		return;
    	}
    	//先申请内存
    	LPVOID mFuncAddr = NULL;//申请函数内存地址         
    	LPVOID ParamAddr = NULL;//申请参数内存地址 
    	LPVOID MsgConAddr = NULL;
    	//申请内存  这里函数128个字节足够用了,如果以后写的调用函数更多,则这里需要加大字节数
    	mFuncAddr = ::VirtualAllocEx(hProcess, NULL, 128, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    	ParamAddr = ::VirtualAllocEx(hProcess, NULL, sizeof(MessageParam), MEM_COMMIT, PAGE_READWRITE);
    
    	std::wstring strName = CString(_T("Romte CALL Test Success!"));
    	//&str.c_str();
    	int len = strName.length()*2 +2 ;
    	//开始申请写入内容
    	MsgConAddr = ::VirtualAllocEx(hProcess, NULL, len, MEM_COMMIT, PAGE_READWRITE);
    	DDwrite(hProcess, MsgConAddr, strName.c_str(), strName.length()*2);
    	MessageParam mailP;
    	mailP.getModulBase = (DWORD)addrRemoteLoadLibrary;
    	mailP.maistrBase = (DWORD)MsgConAddr;
    	InSendFunc(hProcess, dwProcessId, MsgCall, &mailP, sizeof(MessageParam), mFuncAddr, ParamAddr);
    	if (MsgConAddr)
    	{
    		::VirtualFreeEx(hProcess, MsgConAddr, len, MEM_RELEASE);
    	}
    	if (mFuncAddr)
    	{
    		::VirtualFreeEx(hProcess, mFuncAddr, 128, MEM_RELEASE);
    	}
    	if (ParamAddr)
    	{
    		::VirtualFreeEx(hProcess, ParamAddr, sizeof(MessageParam), MEM_RELEASE);
    	}
    	UpdateData(FALSE);
    }
    

    代码实现都是相对简单的,难点在与,如何找到目标call,并分析出目标call的调用逻辑,堆栈平衡等问题,崩溃的原因往往是堆栈不平衡造成的。

    展开全文
  • 汇编代码注入call测试工具 dll注入器
  • 代码注入器别名(ASM汇编CALL测试器)可测试游戏函数CALL,这个工具非常的好用,但是使用的时候请注入汇编书写和堆栈平衡否则游戏会崩溃。还有这个工具必须配合OD调试器使用,因为汇编代码是从OD里面分析出来 ,哈哈。
  • 代码注入CALL测试 代码测试 CALL注入 无病毒
  • 代码注入CALL

    2011-07-09 00:35:36
    代码注入CALL 代码注入CALL
  • CALL调用示例分析-远程代码注入器 CodeInEX_dong代码注入 CodeInEX_dong代码注入
  • 代码注入器_带异常保护
  • 代码注入

    2018-05-11 15:38:01
    带Try保护的CALL测试防崩溃. call代码注入器,方便进行注入代码进行调试。
  • 代码 注入call测试

    2011-01-29 22:33:17
    代码注入代码注入代码注入代码注入代码注入代码注入
  • 学习汇编的朋友有福了,此软件直接注入EXE调试CALL程序
  • VC代码注入CALL

    2010-09-16 10:44:04
    VC代码注入CALL,相关搜索: 代码, 注入, CALL 获得目标进程句柄就从略了。直接从注射开始:.....
  • 代码注入器(外挂Call测试的)

    热门讨论 2010-07-02 08:01:35
    外挂Call测试必备,方便,简结!哈哈哈!!!!!
  • char szDllName[]="E:\\1905\\代码\\my022-24\\Debug\\my022MFC.dll"; PVOID p1=跨进程分配内存(1000); printf("分配的内存地址=%p\n",p1); WN((DWORD)p1,szDllName,sizeof(szDllName));//WriteProcessMemory /...
  • 代码注入器 调试CALL工具 郁金香 分析游戏 调试call
  • 郁金香代码注入器.rar

    2019-09-26 17:40:25
    郁金香代码注入器,也被人称为“郁金香call测试工具”,可以测试找出来的游戏call,有利于制作游戏辅助 一个不错的汇编线程注入工具,在调试程序CALL或者游戏CALL的时候这个工具非常的强大,可以直接带参数测试CALL...
  • 郁金香代码注入

    2014-03-21 12:10:19
    好用方便的一个快速测试call的工具,你们懂得。
  • call代码注入

    2011-09-18 21:01:28
    制作外挂常用的【call测试器】代码注入
  • 汇编代码注入器(无毒),游戏找call,有利工具.
  • PHP 代码注入漏洞

    千次阅读 2020-12-15 11:17:40
    文章目录PHP 代码注入原理及成因漏洞危害相关函数和语句eval()语言结构assert()函数preg_replace()函数call_user_func()函数动态函数`$a($b)`漏洞利用 PHP 代码注入 PHP 代码注入 属于代码注入漏洞中的一种。 原理及...

    PHP 代码注入

    PHP 代码注入 属于代码注入漏洞中的一种。

    原理及成因

    PHP 代码执行(注入)是指(Web 方面)应用程序过滤不严,用户可以通过请求将代码注入到应用中执行。代码执行(注入)类似于SQL注入漏洞,SQLi是将SQL语句注入到数据库中执行,而代码执行则是可以把代码注入到应用中最终由服务器运行它。这样的漏洞如果没有特殊的过滤,相当于直接有一个web后门的存在。

    1. 程序中含有可以执行php 代码的函数或者语言结构
    2. 传入第一点中的参数,客户端可控,直接修改或者影响

    漏洞危害

    Web 应用如果存在代码执行漏洞是一件非常可怕的事情,就像一个人没有穿衣服,赤裸裸的暴露在光天化日之下。可以通过代码执行漏洞继承Web 用户权限,执行任意代码。如果具有服务器没有正确配置,Web 用户权限比较高的话,我们可以读写目标服务器任意文件内容,甚至控制整个网站以及服务器。

    PHP 中有很多函数和语句都会造成PHP代码执行漏洞。

    相关函数和语句

    eval()语言结构

    将传进来的字符串当作php代码执行,里面的参数必须加分号才能执行!
    例如:一句话木马

    <?php
    if(isset($_REQUEST['code'])){
    	eval($_REQUEST['code']);
    }
    ?>

    在这里插入图片描述
    在这里插入图片描述

    assert()函数

    将传进来的字符串当作php代码执行,可以不用加分号就能执行!

    <?php
    if(@isset($_REQUEST['code'])){
     @assert($_REQUEST['code']);
    }
    ?>

    在这里插入图片描述

    preg_replace()函数

    对字符串进行正则处理
    参数和返回值如下:
    mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject [,int limit = -1[,int &$count)1)

    原理:在subject中搜索匹配pattern正则表达式的部分用replacment来替换,当pattern参数存在/e 修饰符时,会将replacment的值当作php 代码执行。

    <?php
    if(isset($_GET['code'])) {
    $code=$_GET['code'];
    preg_replace( "/\[(.*)\]/e",'\\1',$code);
    // 匹配[]里面的内容,\\1代表正则第一次匹配的内容
    }
    ?>

    在这里插入图片描述

    call_user_func()函数

    call_user_func( )等函数都有调用其他函数的功能,其中的第一个参数作为要调用的函数名(回调函数),第二个参数为回调函数的参数,那如果这个传入的函数名可控,那就可以调用意外的函数来执行我们想要的代码,也就是存在任意代码执行漏洞。
    以call_user_func()为例子,该函数的第一个参数作为回调函数,后面的参数为回调函数的参数,测试代码如下:

    <?php
    if(isset($_GET['fun'])) {
     $fun=$_GET['fun'];//assert
     $para=$_GET['para'];//phpinfo();
     call_user_func($fun,$para);//eval(phpinfo();)
    }
    ?>

    在这里插入图片描述

    动态函数$a($b)

    由于PHP的特性原因,PHP的函数支持直接由拼接的方式调用,这直接导致了PHP在安全上的控制有加大了难度。不少知名程序中也用到了动态函数的写法,这种写法跟使用call_user_func()的初衷一样,用来更加方便地调用函数,但是一旦过滤不严格就会造成代码执行漏洞。测试代码如下:

    <?php
    if(isset($_GET['a'])) {
     $a=$_GET['a'];
     $b=$_GET['b'];
     $a($b);
    }
    ?>

    在这里插入图片描述

    漏洞利用

    1. 直接获取shell
      一句话木马使用菜刀或者蚁剑连接即可。

    2. 获取当前文件的绝对路径
      __FILE__是PHP预定义常量,其含义当前文件的路径。提交代码?code=print(__FILE__);
      在这里插入图片描述

    3. 读文件
      我们可以利用file_get_contents()函数读取服务器任意文件,前提是知道目标文件路径具有读取权限。提交代码?code=var_dump(file_get_contents( 'c:\windows\system32\drivers\etc\hosts'));
      读取服务器hosts文件。
      在这里插入图片描述

    4. 写文件
      我们可以利用file_put_contents()函数,写入文件。前提是知道可写目录。
      提交代码?code=var_dump(file_put_contents($_POST[1],$_POST[2]));第一个参数是文件名,第二个参数是文件内容,此时需要借助于hackbar通过post 方式提交参数1=shell.php&2=<?php phpinfo()?>即可在当前目录下创建一个shell.php文件。
      在这里插入图片描述
      在这里插入图片描述

    防御方法

    1. 尽量不要使用eval等函数
    2. 如果使用的话一定要进行严格的过滤
    3. preg_replace放弃使用/e修饰符
    4. 禁用函数,修改配置文件php.ini里的 disable functions = 要禁用的函数
    展开全文
  • 同时还可以将注入的功能生成出自己的程序可调用的代码 双击第三个输入框即可生成shellcode,这里默认的shellcode是远程线程注入 注入的是当前程序选择注入的进程 这里选择最左下角的选项,然后再双击输入框 即可生成...
  • 代码注入

    2020-08-25 14:11:01
    代码注入是一种向目标进程插入独立运行代码并使之运行的技术,它一般调用CreateRomoteThread() API以远程线程形式运行...DLL注入与代码注入 下面这段代码用来弹出Windows消息框: DWORD WINAPI ThreadProc(LPVOID lP.
    1. 代码注入是一种向目标进程插入独立运行代码并使之运行的技术,它一般调用CreateRomoteThread() API以远程线程形式运行插入的代码,所以也被称为线程注入。
      在这里插入图片描述
    2. 首先向目标进程target.exe插入代码与数据,在此过程中,代码以线程过程(Thread Procedure)形式插入,而代码中使用的数据则以线程参数的形式传入,也就是说,代码与数据是分别注入的。

    DLL注入与代码注入

    1. 下面这段代码用来弹出Windows消息框:
    DWORD WINAPI ThreadProc(LPVOID lParam)
    {
        MessageBoxA(NULL, "www.reversecore.com", "ReverseCore", MB_OK);
    
        return 0;
    }
    
    1. 若想使用DLL注入技术,则需要把上述代码放入某个DLL文件,然后再将整个DLL文件注入目标进程,采用该技术完成注入后,运行OllyDbg调试器,查看上述ThreadProc()代码区域。
      在这里插入图片描述
    • 10009290与1000929C分别指向DLL数据节区中的字符串(“ReverseCore"、“www.reversecore.com”),上面2条PUSH指令将MessageBoxA() API中要使用的字符串地址存储到栈,1000100E地址处由一条CALL DWORD PTR DS:[100080F0]指令,该指令即使调用user32!MessageBoxA() API的命令,转到100080F0地址处查看。
      在这里插入图片描述
    • 100080F0地址就是DLL的IAT区域,在其上方可用看到其他API的地址,向这样,DLL代码中使用的所有数据均位于DLL的数据区域,采用DLL注入技术,整个DLL会被插入目标进程,代码与数据共存于内存,所以代码能够正常运行,以此不同,代码注入仅向目标进程注入必要的代码,要想使注入的代码正常运行,还必须将代码中使用的数据一同注入。
    1. 使用代码注入的原因
    • 占用内存少:如果要注入的代码与数据较少,那么就不需要将它们做成DLL的形式再注入,此时直接采用代码注入的方式同样能够获得与DLL注入相同的效果,且占用内存会更少。
    • 难以查找痕迹:采用DLL注入方式会在目标进程的内存中留下相关痕迹,很容易让人判断出目标进程是否被执行注入操作,但采用代码注入方式几乎不会留下任何痕迹。

    例子

    1. 运行notepad.exe,然后使用Process Explorer查看notepad.exe进程的PID。
      在这里插入图片描述
    2. 运行如下命令
    C:\Users\12586\Downloads\example\03\27\bin>CodeInjection.exe 1196
    
    • notepad.exe进程中弹出一个消息框。
      在这里插入图片描述
    1. CodeInjection.cpp
    • 看一下main()函数
    int main(int argc, char *argv[])
    {
        DWORD dwPID     = 0;
    
    	if( argc != 2 )
    	{
    	    printf("\n USAGE  : %s <pid>\n", argv[0]);
    		return 1;
    	}
    
    	// change privilege
    	if( !SetPrivilege(SE_DEBUG_NAME, TRUE) )
            return 1;
    
        // code injection
        dwPID = (DWORD)atol(argv[1]);
        InjectCode(dwPID);
    
    	return 0;
    }
    
    • main()函数用来调用InjectCode()函数,传入的函数参数为目标进程的PID。
    • ThreadProc()函数即为要注入目标进程的代码。
    typedef struct _THREAD_PARAM 
    {
        FARPROC pFunc[2];               // LoadLibraryA(), GetProcAddress()
        char    szBuf[4][128];          // "user32.dll", "MessageBoxA", "www.reversecore.com", "ReverseCore"
    } THREAD_PARAM, *PTHREAD_PARAM;
    
    typedef HMODULE (WINAPI *PFLOADLIBRARYA)
    (
        LPCSTR lpLibFileName
    );
    
    typedef FARPROC (WINAPI *PFGETPROCADDRESS)
    (
        HMODULE hModule,
        LPCSTR lpProcName
    );
    
    typedef int (WINAPI *PFMESSAGEBOXA)
    (
        HWND hWnd,
        LPCSTR lpText,
        LPCSTR lpCaption,
        UINT uType
    );
    
    DWORD WINAPI ThreadProc(LPVOID lParam)
    {
        PTHREAD_PARAM   pParam      = (PTHREAD_PARAM)lParam;
        HMODULE         hMod        = NULL;
        FARPROC         pFunc       = NULL;
    
        // LoadLibrary()
        hMod = ((PFLOADLIBRARYA)pParam->pFunc[0])(pParam->szBuf[0]);    // "user32.dll"
        if( !hMod )
            return 1;
    
        // GetProcAddress()
        pFunc = (FARPROC)((PFGETPROCADDRESS)pParam->pFunc[1])(hMod, pParam->szBuf[1]);  // "MessageBoxA"
        if( !pFunc )
            return 1;
    
        // MessageBoxA()
        ((PFMESSAGEBOXA)pFunc)(NULL, pParam->szBuf[2], pParam->szBuf[3], MB_OK);
    
        return 0;
    }
    
    • 稍微整理下:
    hMod = LoadLibraryA("user32.dll");
    pFunc = GetProcAddress(hMod, "MessageBoxA");
    pFunc = (NULL,"www.revercore.com","ReverseCore",MB_OK);
    
    • 代码注入技术的核心内容是注入可独立运行的代码,为此,需要同时注入代码与数据,并且要保证代码能够准确引用注入的数据。
    • 上述代码中的ThreadProc()函数可以看到,函数中并未直接调用相关API,也未直接定义使用字符串,它们都是通过THREAD_PARAM结构体以线程参数的形式传递使用。
    • ThreadProc()函数中使用THREAD_PARAM结构体接收2个API地址与4个字符串数据,其中2个API分别为LoadLibraryA()与GetProcAddress(),只要有了这2个API,就能调用所有库函数。
    00401000  /. 55             PUSH EBP
    00401001  |. 8BEC           MOV EBP,ESP
    00401003  |. 56             PUSH ESI
    00401004  |. 8B75 08        MOV ESI,DWORD PTR SS:[EBP+8]; [EBP+8] = IParam = address of THREAD_PARAM
    00401007  |. 8B0E           MOV ECX,DWORD PTR DS:[ESI]
    00401009  |. 8D46 08        LEA EAX,DWORD PTR DS:[ESI+8] ; EAX = "user32.dll"
    0040100C  |. 50             PUSH EAX
    0040100D  |. FFD1           CALL ECX     ; kernel32.LoadLibraryA()
    0040100F  |. 85C0           TEST EAX,EAX
    00401011  |. 75 0A          JNZ SHORT 0040101D                       ;  0040101D
    00401013  |> B8 01000000    MOV EAX,1
    00401018  |. 5E             POP ESI
    00401019  |. 5D             POP EBP
    0040101A  |. C2 0400        RETN 4
    0040101D  |> 8D96 88000000  LEA EDX,DWORD PTR DS:[ESI+88]
    00401023  |. 52             PUSH EDX  ; EDX = "MessageBoxA"
    00401024  |. 50             PUSH EAX  ; EAX = hMod
    00401025  |. 8B46 04        MOV EAX,DWORD PTR DS:[ESI+4]
    00401028  |. FFD0           CALL EAX ;kernel32.GetProcAddress
    0040102A  |. 85C0           TEST EAX,EAX
    0040102C  |.^74 E5          JE SHORT 00401013                        ;  00401013
    0040102E  |. 6A 00          PUSH 0
    00401030  |. 8D8E 88010000  LEA ECX,DWORD PTR DS:[ESI+188]
    00401036  |. 51             PUSH ECX ; ECX = "ReverseCore"
    00401037  |. 81C6 08010000  ADD ESI,108
    0040103D  |. 56             PUSH ESI ; ESI = "www.reversecore.com"
    0040103E  |. 6A 00          PUSH 0
    00401040  |. FFD0           CALL EAX ;user32.MessageBoxA()
    00401042  |. 33C0           XOR EAX,EAX
    00401044  |. 5E             POP ESI
    00401045  |. 5D             POP EBP
    00401046  \. C2 0400        RETN 4
    
    • 所有重要数据都是从线程参数IParam[EBP+8]接收使用的,也就说,ThreadProc()函数是可以独立运行的代码。
    1. InjectCode()函数
    BOOL InjectCode(DWORD dwPID)
    {
        HMODULE         hMod            = NULL;
        THREAD_PARAM    param           = {0,};
        HANDLE          hProcess        = NULL;
        HANDLE          hThread         = NULL;
        LPVOID          pRemoteBuf[2]   = {0,};
        DWORD           dwSize          = 0;
    
        hMod = GetModuleHandleA("kernel32.dll");
    
        // set THREAD_PARAM
        param.pFunc[0] = GetProcAddress(hMod, "LoadLibraryA");
        param.pFunc[1] = GetProcAddress(hMod, "GetProcAddress");
        strcpy_s(param.szBuf[0], "user32.dll");
        strcpy_s(param.szBuf[1], "MessageBoxA");
        strcpy_s(param.szBuf[2], "www.reversecore.com");
        strcpy_s(param.szBuf[3], "ReverseCore");
    
        // Open Process
        if ( !(hProcess = OpenProcess(PROCESS_ALL_ACCESS,   // dwDesiredAccess
                                      FALSE,                // bInheritHandle
                                      dwPID)) )             // dwProcessId
        {
            printf("OpenProcess() fail : err_code = %d\n", GetLastError());
            return FALSE;
        }
    
        // Allocation for THREAD_PARAM
        dwSize = sizeof(THREAD_PARAM);
        if( !(pRemoteBuf[0] = VirtualAllocEx(hProcess,          // hProcess
                                          NULL,                 // lpAddress
                                          dwSize,               // dwSize
                                          MEM_COMMIT,           // flAllocationType
                                          PAGE_READWRITE)) )    // flProtect
        {
            printf("VirtualAllocEx() fail : err_code = %d\n", GetLastError());
            return FALSE;
        }
    
        if( !WriteProcessMemory(hProcess,                       // hProcess
                                pRemoteBuf[0],                  // lpBaseAddress
                                (LPVOID)&param,                 // lpBuffer
                                dwSize,                         // nSize
                                NULL) )                         // [out] lpNumberOfBytesWritten
        {
            printf("WriteProcessMemory() fail : err_code = %d\n", GetLastError());
            return FALSE;
        }
    
        // Allocation for ThreadProc()
        dwSize = (DWORD)InjectCode - (DWORD)ThreadProc;
        if( !(pRemoteBuf[1] = VirtualAllocEx(hProcess,          // hProcess
                                          NULL,                 // lpAddress
                                          dwSize,               // dwSize
                                          MEM_COMMIT,           // flAllocationType
                                          PAGE_EXECUTE_READWRITE)) )    // flProtect
        {
            printf("VirtualAllocEx() fail : err_code = %d\n", GetLastError());
            return FALSE;
        }
    
        if( !WriteProcessMemory(hProcess,                       // hProcess
                                pRemoteBuf[1],                  // lpBaseAddress
                                (LPVOID)ThreadProc,             // lpBuffer
                                dwSize,                         // nSize
                                NULL) )                         // [out] lpNumberOfBytesWritten
        {
            printf("WriteProcessMemory() fail : err_code = %d\n", GetLastError());
            return FALSE;
        }
    
        if( !(hThread = CreateRemoteThread(hProcess,            // hProcess
                                           NULL,                // lpThreadAttributes
                                           0,                   // dwStackSize
                                           (LPTHREAD_START_ROUTINE)pRemoteBuf[1],     // dwStackSize
                                           pRemoteBuf[0],       // lpParameter
                                           0,                   // dwCreationFlags
                                           NULL)) )             // lpThreadId
        {
            printf("CreateRemoteThread() fail : err_code = %d\n", GetLastError());
            return FALSE;
        }
    
        WaitForSingleObject(hThread, INFINITE);	
    
        CloseHandle(hThread);
        CloseHandle(hProcess);
    
        return TRUE;
    }
    
    • injectCode()函数的set THREAD_PARAM部分用来设置THREAD_PARAM结构体变量,它们会注入目标进程,并且以参数形式传递给ThreadProc()线程。
    • 接下来调用了一系列API函数,API函数归纳如下:
    OpenProcess();
    //data:THREAD_PARAM
    VirtualAllocEx();
    WriteProcessMemory();
    //code:ThreadProc()
    VirtualAllocEx();
    WriteProcessMemory();
    
    CreateRemoteThread();
    
    • 上述代码主要用在目标进程中分别为data与code分配内存,并将它们注入目标进程,最后调用CreateRemoteThread() API,执行远程线程。

    代码注入调试练习

    1. 用Ollydbg开始调试notepad.exe文件,按F9运行键,是notepad.exe处于Runing状态。
      在这里插入图片描述
    2. 设置OllyDbg的选项后,即可从注入的线程代码开始调试。
      在这里插入图片描述
    • 每当notepad.exe进程中生成新线程,调试器就暂停在线程函数开始的代码位置。
    1. 使用Process Explorer查看notepad.exe的进程PID。
      在这里插入图片描述
    • 在命令窗口输入PID作参数,运行CodeInjection.exe。
    C:\Users\12586\Downloads\example\03\27\bin>CodeInjection.exe 13716
    
    1. 按F9继续运行调试器,代码注入成功后,调试器就会暂停在被注入的线程代码的开始位置,由此开始调试。
      在这里插入图片描述
    • 004E0004地址处的MOV ESI,DWORD PTR SS:[EBP+8],[EBP+8]地址就是ThreadProc()函数的IParam参数,而参数IParam则指向被一同注入的THREAD_PARAM结构体。
      在这里插入图片描述
    展开全文
  • 注入助手X64版本.exe

    2018-05-16 09:31:59
    64位注入器,支持多种静态和动态方式注入模式,方便易用!
  • 发现关于远程Call的例子很少,所以发一期常见函数的远程Call例子。MessageBoxA。SetWindowDisplayAffinity。GetWindowRect。GetCurrentProcessId。NtUserGetDC。FindWindowA。所有函数的调用其实都是大同小异,分析...
  • 远程CALL注入工具

    2013-05-29 14:02:29
    CALL注入,反汇编注入,VIP工具,线程注入,二次修改,优化部分代码
  • CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)调用写好的函数或者CALL, 这个可以是自定义的参数, 0, NULL); 封装调用call函数。就可以直接使用这个SendTextMessage函数 //****************************...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,774
精华内容 17,509
关键字:

代码注入与call