void CDynamicCodeDlg::OnBnClickedCreate()
{
// TODO: 在此添加控件通知处理程序代码
m_num = 0;
m_Code =(BYTE *) VirtualAlloc(NULL,4096,MEM_COMMIT,PAGE_EXECUTE_READWRITE); //prepare
AddCode(0x8b);
AddCode(0xF4);
//push MB_OK  
AddCode(0x6A);
AddCode(0x01);
    //push the lpCaption, push lpCaption
char * temp = new char[10];
    strcpy(temp,"caption");
AddCode(0x68);
AddCode((long)temp & 0xff);
AddCode(((long)temp & 0xff00) >> 8);
AddCode(((long)temp & 0xFF0000) >> 16);
AddCode(((long)temp & 0xFF000000) >> 24);
//push  lpText;
AddCode(0x68);
if (m_str != NULL) delete[] m_str;
m_str = new char[20];
strcpy(m_str,"Hello world");
AddCode((long)m_str & 0xff);
AddCode(((long)m_str & 0xff00) >> 8);
AddCode(((long)m_str & 0xFF0000) >> 16);
AddCode(((long)m_str & 0xFF000000) >> 24);
////push the handle
AddCode(0x6a);
    AddCode(0x00);
//Call
AddCode(0xE8);
HMODULE  handle  = LoadLibrary("User32.dll");
m_Data = (LONG)GetProcAddress(handle,"MessageBoxaA");
AddCode(m_Data & 0xff);
AddCode((m_Data & 0xff00) >>8);
AddCode((m_Data & 0xff0000) >>16);
AddCode((m_Data & 0xff000000) >>24); //cmp esp
AddCode(0x3B);
AddCode(0xF4);
AddCode(0xE8);
AddCode(0x67);
AddCode(0xE0);
AddCode(0xFF);
AddCode(0xFF);
m_Code -= m_num;
}void CDynamicCodeDlg::AddCode(BYTE CodeByte)
{
*m_Code = CodeByte;
m_Code++;
m_num++;
}void CDynamicCodeDlg::OnBnClickedAdd()
{
// TODO: 在此添加控件通知处理程序代码
LONG a = (LONG)m_Code;
_asm
{
Call a
}}我调到汇编状态下 看了一下 自己生成的code是正确的 但是 一执行到call messageboxa的时候就会异常 不知道为什么

解决方案 »

  1.   

    AddCode(0xE8);
    HMODULE  handle  = LoadLibrary("User32.dll");
    m_Data = (LONG)GetProcAddress(handle,"MessageBoxaA");
    AddCode(m_Data & 0xff);
    AddCode((m_Data & 0xff00) >>8);
    AddCode((m_Data & 0xff0000) >>16);
    AddCode((m_Data & 0xff000000) >>24);
    这段是产生
    call 地址
    的程序吧,能这么直接写么?出来的代码,call的地址都不对呀;
      

  2.   

    经过调试发现以下问题:1、你是把数据放在堆上,这样我调试时出现错误(可能指令访问不到这个地址)
    我把所有数据改为成员数据就好了。
        int m_num;
    BYTE* m_Code;
        BYTE  code[4096];
    char m_str[20];
    LONG m_Data;
    char temp[10];
    2、call m_Data // 找MessageBoxA根据汇编代码,有错误
    改为:
    mov eax,m_Data
    call eax
         //Call
    //AddCode(0xE8);
    HMODULE  handle  = LoadLibrary("User32.dll");
    m_Data = (LONG)GetProcAddress(handle,"MessageBoxW");
    // mov eax,m_Data
    AddCode(0xB8);  
    AddCode(m_Data & 0xff);
    AddCode((m_Data & 0xff00) >>8);
    AddCode((m_Data & 0xff0000) >>16);
    AddCode((m_Data & 0xff000000) >>24); //call eax
    AddCode(0xff);
    AddCode(0xd0);
    即可
      

  3.   

    m_Data = (LONG)GetProcAddress(handle,"MessageBoxW");
    写错了,应为:
    m_Data = (LONG)GetProcAddress(handle,"MessageBoxA");
      

  4.   

    //cmp esp
    AddCode(0x3B);
    AddCode(0xF4);
    AddCode(0xE8);
    AddCode(0x67);
    AddCode(0xE0);
    AddCode(0xFF);
    AddCode(0xFF);
    以上几句我不知是什么意思,改为: // mov esp,esi  清空堆栈
    AddCode(0x8B);
    AddCode(0xE6); // ret
    AddCode(0xC3);就可以正确运行了。
      

  5.   

    call 地址
    实际上翻译成机器码为:
    实际上是把地址放入堆栈上,然后调用其地址。
    call dword ptr [bsp - 4}
    其实没有call 0x00112245这样的指令
      

  6.   

    1、
    m_Data = (LONG)GetProcAddress(handle,"MessageBoxaA");
    ---m_Data = (LONG)GetProcAddress(handle,"MessageBoxA");
    2、
             AddCode(0x3B);
    AddCode(0xF4);
    AddCode(0xE8);
    AddCode(0x67);
    AddCode(0xE0);
    AddCode(0xFF);
    AddCode(0xFF);
    ________ m_Code -= m_num;
     3BF4                 cmp     si,sp
     E867E0ffff           call    ffffe067
                 
      ffffe067:你要跳到的函数地址 - 当前指令下一条指令的地址(就是我用横线标的这条语句的地址)
     这里肯定有问题,把这几句删掉就可以了,楼上已经有人证明了
      

  7.   

    sorry,
    3BF4                 cmp     si,sp
     E867E0ffff           call    ffffe067
    改为:
    3BF4                 cmp     si,sp
    E867E0ffff           call    xxxxxxxx
    ffffe067:xxxxxxxx - 当前指令下一条指令的地址(就是我用横线标的这条语句的地址)
      

  8.   

    _asm
    {
    Call a 
    }
    call a    ---这里,没有用段间调用的形式,如果还有错,不妨改成:call fword ptr [a]
      

  9.   

    sorry,还有错,只好马甲了
    1、
    m_Data = (LONG)GetProcAddress(handle,"MessageBoxaA");
    ---m_Data = (LONG*)GetProcAddress(handle,"MessageBoxA");
    楼主,能运行后,在这个贴上通知我一下,因为我也觉得这样调,地址有问题,我用softice跟了一下,地址不对,应该不能成功的呀,难道是符号地址的问题?记着告诉大家一下,现在我要回家了,没有时间试了
    大家新年快乐
      

  10.   

    今天早上试了一下,楼上的broadoceans(broadoceans)这点是正确的。。
    mov eax,m_Data
    call eax类似于vc程序的符号跳转,直接调不知道有无问题,但是这样做比较安全,符合逻辑
      

  11.   

    broadoceans(broadoceans 的完全正确 谢谢