三四年没在这里发过贴了,凑个热闹,贴一小东西:CodeZap。

给 EXE 添加节显示启动信息的代码多的要死,CodeZap 这个最大的特色就是 C++ 写成的,且提供了比较独立美观的Z函数。只要了解 C/C++ 语言,就能写添加大量的代码,完全可以工程化操作。

引用:

CodeZap 简要说明

CodeZap 是用来给 PE 文件添加额外代码的 C++ SDK。您可以通过使用熟悉而且容易工程化的 C/C++ 语言来添加大量的可执行代码。

Codez 使用非常简单,你只要模仿 ZCode 函数,写出自己的 ZCode 即可。其中 ZCode 的要求如下:

1. ZCode 必须是 CDECL 调用规范。
2. ZCode 函数最后的 __asm 块,除 #ifdef _DEBUG 包围的之外,必须保留。
3. ZCode 中不能使用字符串常量。
4. ZCode 中不能调用外部函数。
5. ZCode 中可以调用 __forceinline 声明的函数。
6. ZCode 中可以使用 CodeZap 中所有 Z 开头的函数。
7. ZCode 中的 C++ 代码可以任意添加,只要符合前面的所有条件。
8. 可以修改  #ifdef _DEBUG 中的汇编代码为你所所要情形。
9. 可以修改函数的参数(基于上一条为前提)。

CodeZap 调用示例:
CodeZap(TEXT("C:\\ABC.CZ.exe"), TEXT("C:\\ABC.exe"), (PBYTE) ZCode);

Powered By Yonsm
WWW.Yonsm.NET
2007.4.31
支持 Visual C++ 6.0/2005 编译

代码:

接口函数:
BOOL CodeZap(PCTSTR ptzDst, PCTSTR ptzSrc, PBYTE pbCode);
ZAPI HMODULE ZGetKernelHandle();
ZAPI HMODULE ZGetModuleHandle(PCTSTR ptzModule = NULL);
ZAPI HMODULE ZSearchModuleHandle(PCTSTR ptzModule, PBYTE pbBase = (PBYTE) 0x70000000, PBYTE pbMax = (PBYTE) 0x80000000);
ZAPI FARPROC ZGetProcAddress(HMODULE hModule, PCTSTR ptzProc);

代码:

你如果要添加功能,则需要改写的函数: ZCode
VOID CDECL ZCode()
{
  // KERNEL32
  HMODULE hKernel32 = ZGetKernelHandle();

  // GetProcAddress
  TCHAR szGetProcAddress[] = {'G', 'e', 't', 'P',  'r', 'o', 'c', 'A',  'd', 'd', 'r', 'e',  's', 's', 0};
  PGetProcAddress  pGetProcAddress  = (PGetProcAddress)  ZGetProcAddress(hKernel32, szGetProcAddress);
  if (!pGetProcAddress) return;

  // LoadLibrary
  CHAR szLoadLibrary[] = {'L', 'o', 'a', 'd',  'L', 'i', 'b', 'r',  'a', 'r', 'y', ZEND};
  PLoadLibrary pLoadLibrary =  (PLoadLibrary) pGetProcAddress(hKernel32, szLoadLibrary);
  if (!pLoadLibrary) return;

  // USER32
  TCHAR tzUser32[] = {'U', 'S', 'E', 'R',  '3', '2', 0};
  HMODULE  hUser32  = pLoadLibrary(tzUser32);

  // MessageBox
  CHAR szMessageBox[]  = {'M',  'e', 's', 's', 'a',  'g', 'e', 'B', 'o',  'x', ZEND};
  PMessageBox  pMessageBox  = (PMessageBox)  pGetProcAddress(hUser32, szMessageBox);

  TCHAR tzText[] = {'H', 'a',  'h', 'a', ',', ' ',  'I', ' ', 'a', 'm',  ' ', 'C', 'o', 'd',  'e', 'Z', 'a', 'p',  '!', 0};
  TCHAR tzCaption[] =  {'C', 'o', 'd',  'e', 'Z', 'a', 'p',  0};
  pMessageBox(NULL, tzText, tzCaption, MB_ICONINFORMATION);

  __asm
  {
    JMP    _ZCodeEnd;

_ZJumpOEP:
    // Jump to OEP: Jump delta will be fixed by CodeZap
    JMP    $ + 5;

#ifndef _DEBUG
    // Put your own ASM code here
    PUSHAD;
    CALL  ZCode;
    POPAD;
#endif

    JMP    _ZJumpOEP;
_ZCodeEnd:
  }
}