// msgboxc.cpp: 实现c_code.
//
#include <windows.h>
#include <iostream.h>
#include <stdio.h>
#define PROC_BEGIN __asm _emit 0x90 __asm _emit 0x90\\
__asm _emit 0x90 __asm _emit 0x90\\
__asm _emit 0x90 __asm _emit 0x90\\
__asm _emit 0x90 __asm _emit 0x90
#define PROC_END PROC_BEGIN
#define BEGIN_STRLEN 0x08 // 开始字符串长度.
#define END_STRLEN 0x08 // 结束标记字符的长度.
#define MAX_Sc_Len 0x400 // 最大代码长度(1024).
// 信息显示对话框函数.
void MsgBox()
{
// 获取MessageBoxA在内存中的地址.
HINSTANCE hLibMsg=LoadLibrary(\"user32.dll\");
DWORD dwMessageBoxAddress=(DWORD)GetProcAddress(hLibMsg,\"MessageBoxA\");
__asm
{
PROC_BEGIN
push MB_ICONINFORMATION or MB_OK
call Func1
_emit \'T\'
_emit \'e\'
_emit \'s\'
_emit \'t\'
_emit 0
Func1:
call Func2
_emit \'H\'
_emit \'e\'
_emit \'l\'
_emit \'l\'
_emit \'o\'
_emit 0
Func2:
push NULL
call DWORD PTR [dwMessageBoxAddress];
PROC_END
}
}
// 打印信息显示对话框函数的机器代码.
void PrintMsgboxCode()
{
char buffer[MAX_Sc_Len];
char *pSc_addr;
int i,k;
int Sc_len; // 实际代码长度.
char *fnbgn_str=\"\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\"; // 标记开始的字符串.
char *fnend_str=\"\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\"; // 标记结束的字符串.
pSc_addr=(char *)MsgBox;
// 找到MsgBox的开始位置.
for (k=0;k<MAX_Sc_Len ;++k ){
if(memcmp(pSc_addr+k,fnbgn_str,BEGIN_STRLEN)==0){
pSc_addr+=(k+8); // 找到定位实际代码的开始.
break;
}
}
// 找到MsgBox的结尾及长度.
for(k=0;k<MAX_Sc_Len;++k) {
if(memcmp(pSc_addr+k,fnend_str,END_STRLEN)==0){
if (k<MAX_Sc_Len) Sc_len=k;
else return;
break;
}
}
// 复制代码到buffer.
memcpy(buffer,pSc_addr,Sc_len);
// 显示代码.
for(i=0;i<Sc_len;i++){
if(!(i%10)) printf(\"\\n\");
printf(\" %02x\", buffer[i]&0xff);
}
}
// 主函数或入口函数.
void main()
{
PrintMsgboxCode();
MsgBox();
}