首页
社区
课程
招聘
[旧帖] [原创]添加内存修改器到任务管理器 0.00雪花
发表于: 2008-12-19 01:27 3047

[旧帖] [原创]添加内存修改器到任务管理器 0.00雪花

2008-12-19 01:27
3047
第一步:添加相应资源

用ResHacker打开taskmgr.exe添加内存修改器的菜单,文件位于:X:\WINDOWS\system32目录下

原来的:

POPUP "Banana"
{
    MENUITEM "结束进程(&E)",  40028

    MENUITEM "结束进程树(&T)",  40105

    MENUITEM "调试(&D)",  40027

    MENUITEM SEPARATOR

    POPUP "设置优先级(&P)"
    {
       MENUITEM "实时(&R)",  40029

       MENUITEM "高(&H)",  40031

       MENUITEM "高于标准(&A)",  40030

       MENUITEM "标准(&N)",  40032

       MENUITEM "低于标准(&B)",  40033

       MENUITEM "低(&L)",  40034
    }

    MENUITEM "关系设置(&A)...",  40055
}


添加后:

POPUP "Banana"
{
    MENUITEM "结束进程(&E)",  40028

    MENUITEM "结束进程树(&T)",  40105

    MENUITEM "调试(&D)",  40027

    MENUITEM "内存修改器(&H)",  40035

    MENUITEM SEPARATOR

    POPUP "设置优先级(&P)"
    {
       MENUITEM "实时(&R)",  40029

       MENUITEM "高(&H)",  40031

       MENUITEM "高于标准(&A)",  40030

       MENUITEM "标准(&N)",  40032

       MENUITEM "低于标准(&B)",  40033

       MENUITEM "低(&L)",  40034
    }
    MENUITEM "关系设置(&A)...",  40055
}


菜单ID : 40035(0x9C63)记起来先,后面要用到。

第二步:添加响应代码

用OD加载taskmgr.exe,查找常量:0x9C5C,这个是“结束进程”菜单ID 40028

找到一处:
0100CF29      BA 5C9C0000       mov     edx, 9C5C


测试查找是否正确,在100CF29处下断,运行taskmgr.exe,在进程项随便选一个进程,按下“结束进程”菜单,这时OD会断下:
0100CF29      BA 5C9C0000       mov     edx, 9C5C         ;  "结束进程"的菜单ID
0100CF2E      3BCA              cmp     ecx, edx          ;  ecx为所选的菜单ID,这里判断是否为9C5C
0100CF30      74 AD             je      short 0100CEDF    ;  是的话就跳
0100CF32      7E BB             jle     short 0100CEEF


0100CEDF      85C0              test    eax, eax
0100CEE1      74 0C             je      short 0100CEEF
0100CEE3      6A 00             push    0
0100CEE5      FF70 08           push    dword ptr [eax+8] ;  所选的进程ID
0100CEE8      8BCE              mov     ecx, esi
0100CEEA      E8 8EF2FFFF       call    0100C17D
0100CEEF      5E                pop     esi
0100CEF0      5D                pop     ebp
0100CEF1      C2 0800           retn    8


跟到这里基本结束,[eax+8]是我们所要的,记起来先!

找到空白的地方写上API调用时所用到的字符串:
01000332  4D 65 6D 45 64 69 74 2E 64 6C 6C 00              MemEdit.dll.
0100033E  4C 6F 61 64 44 4C 4C 00                          LoadDLL.


找个空白地址来写我们的代码:
0100CF29      BA 5C9C0000   mov     edx, 9C5C
修改为:
0100CF29      E9 BF7F0000   jmp     01014EED              ;插入新加的菜单ID判断


01014EED    BA 639C0000     mov     edx, 9C63                               ; 内存修改器的菜单ID
01014EF2    3BCA            cmp     ecx, edx                                ; 是否修改器菜单?
01014EF4    74 0A           je      short 01014F00                          ; 是的话就跳
01014EF6    BA 5C9C0000     mov     edx, 9C5C                               ; 补回原来被破坏的
01014EFB    E9 2E80FFFF     jmp     0100CF2E                                ; 继续判断其他ID
01014F00    85C0            test    eax, eax
01014F02    74 0D           je      short 01014F11
01014F04    60              pushad                                          ; 保存环境
01014F05    FF70 08         push    dword ptr [eax+8]                       ; 所选的进程ID
01014F08    E8 0B000000     call    01014F18                                ; 调用内存修改器
01014F0D    83C4 04         add     esp, 4
01014F10    61              popad                                           ; 恢复环境
01014F11    5E              pop     esi
01014F12    5D              pop     ebp
01014F13    C2 0800         retn    8

01014F16    90              nop
01014F17    90              nop

01014F18    68 32030001     push    01000332                                ; ASCII "MemEdit.dll"
01014F1D    FF15 E4100001   call    dword ptr [<&KERNEL32.LoadLibraryA>]
01014F23    68 3E030001     push    0100033E                                ; ASCII "LoadDLL"
01014F28    50              push    eax
01014F29    FF15 04110001   call    dword ptr [<&KERNEL32.GetProcAddress>]
01014F2F    FF7424 04       push    dword ptr [esp+4]
01014F33    FFD0            call    eax                                     ; 执行
01014F35    83C4 04         add     esp, 4
01014F38    C3              retn


第三步:写一个简单的内存修改器

打开VC6,新建“MFC AppWizard(dll)”工程

定义一个全局变量来保存所选的进程ID

stdafx.h
extern DWORD ProcessID;


MemEdit.cpp
DWORD ProcessID = NULL;


添加输出函数:
extern "C" __declspec(dllexport) void LoadDLL(DWORD dwProcessID)
{
  ProcessID = dwProcessID;

  AFX_MANAGE_STATE(AfxGetStaticModuleState());

  CEditForm* EditForm = new CEditForm;
  EditForm->Create(IDD_DIALOG1,NULL);
  EditForm->ShowWindow(SW_SHOW);
  EditForm->UpdateWindow();
}


按键响应事件:
EditForm.cpp
void CEditForm::OnButton1() 
{
  // TODO: Add your control notification handler code here

  DWORD dwWritten;
  CString Text1, Text2;
  LPVOID x1;
  DWORD x2;

  GetDlgItemText(IDC_EDIT1,Text1);
  GetDlgItemText(IDC_EDIT2,Text2);

  sscanf(Text1,"%08X",&x1);
  sscanf(Text2,"%08X",&x2);

  if ( Text1 == "" | Text2 == "")
  {
    AfxMessageBox("请输入地址和数据!!");
    return;
  }

  HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, ProcessID );
  if ( hProcess == NULL )
  {
    AfxMessageBox("打开进程出错!!");
    return;
  }

  WriteProcessMemory( hProcess, x1, &x2, 1, &dwWritten );
  if ( dwWritten != 1 )
  {
    AfxMessageBox("写入失败!!");
    return;
  }

  CloseHandle( hProcess );
}


编译。。。,将其投入X:\WINDOWS\system32目录下

运行修改后的任务管理器,测试!

完成。。。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//