我想通过阅读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位的跨处理器吗?
我一直在玩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) 我正在制作一个简单的文本编辑器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)