小编use*_*738的帖子

如何在C中找到函数的返回地址?

我想通过阅读CodeProject上的文章使用C和GCC AT&T风格的内联汇编少量这里.我希望这样做的主要原因是找到EIP寄存器的旧值,以便能够在我的代码中拥有可靠的指令地址.我写了一个简单的示例程序来证明我对此概念的理解:

#include <stdio.h>
#include <stdlib.h>

int mainReturnAddress = 0;

int main()
{
    asm volatile (
         "popl %%eax;"
         "pushl %%eax;"
         "movl %%eax, %0;"
         : "=r" ( mainReturnAddress )
       );

    printf( "Address : %d\n",  mainReturnAddress );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此特定示例的目的是从堆栈顶部弹出4个字节,表示从EIP寄存器保存的32位返回地址,然后将其推回堆栈.然后,我将它存储在全局mainReturnAddress变量中.最后,我打印存储在mainReturnAddress中的值.

我的输出来自此代码4200560.

这段代码是否达到了上述目的,这是Windows平台上32位的跨处理器吗?

c windows assembly gcc inline-assembly

3
推荐指数
1
解决办法
1003
查看次数

Memcpy()在越界内存上运行?

我一直在玩memcpy()可以用于恶意目的的想法.我做了几个测试应用程序,看看我是否可以从不同地区"窃取"内存中的数据.到目前为止,我已经测试了三个区域,堆,堆栈和常量(只读)内存.常量内存是我测试中唯一崩溃的内存,引起了MinGW的错误.

这是一个例子来说明我的最新测试:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void removeTerminatingCharacters( char ** string, const int length )
{
    int i = 0;

    for ( ; i < length; ++i )
        if ( !( *string )[i] )
            ( *string )[i] = '0';

    return;
}

int main()
{
    int * naive = malloc( sizeof( int ) );
    *naive = 0;

    char * stolenData = malloc( 2000 );

    memset( stolenData, 0, 2000 );
    memcpy( stolenData, naive, 1999 );
    removeTerminatingCharacters( &stolenData, 2000 );

    printf( …
Run Code Online (Sandbox Code Playgroud)

c memcpy segmentation-fault

2
推荐指数
1
解决办法
2506
查看次数

如何正确处理win32 GUI消息循环?

我正在制作一个简单的文本编辑器win32应用程序,以获得乐趣.我的程序有一个特殊的问题.似乎我的程序在退出时没有返回零.相反,它返回1385929.当我的主GUI窗口被销毁时,我使用PostQuitMessage( 0 ),但似乎不是我的主函数中返回的内容message.wParam.这是我到目前为止的代码,

#define WIDTH 500
#define HEIGHT 400

#define EDIT_ID 10

LRESULT CALLBACK windowProc( HWND window, UINT message, WPARAM wParam, LPARAM lParam )
{
    static HDC deviceContext = INVALID_HANDLE_VALUE;
    static HWND editControl = INVALID_HANDLE_VALUE;

    switch ( message )
    {
        case WM_CREATE :
            deviceContext = GetDC( window );

            if ( !deviceContext )
            {
                showWindowsError( "Creating Device Context", FALSE );
                DestroyWindow( window );
            }

            editControl = CreateWindow(
                                       "EDIT",
                                       NULL,
                                       WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | …
Run Code Online (Sandbox Code Playgroud)

c++ winapi

1
推荐指数
1
解决办法
2207
查看次数

标签 统计

c ×2

assembly ×1

c++ ×1

gcc ×1

inline-assembly ×1

memcpy ×1

segmentation-fault ×1

winapi ×1

windows ×1