随笔分类 - ASM
摘要:以下知识是我从图书馆借的一本书<<揭秘数据解密的关键技术>>刘颖东 编著 上看到的,觉得以后用得着,因此记录下!//VC以裸函数的形式内联汇编__declspec(naked) void Fun(){_asm{....//汇编代码}}在函数名前声明__declspec(naked),表示以裸函数的形式内联汇编,裸函数是指编译器生成汇编代码时不添加任何额外的指令,对于一般的函数调用,编译器都会自动生成函数初始化代码,如压入和弹出ebp指针,分配和清理局部变量等。
阅读全文
摘要:在dll中呼出对话框,前提是你在dll中插入了对话框资源以下代码通过设置键盘钩子来在指定程序(红心大战)中按F11来呼出我们的对话框,呵呵,这相当于是dll注入呀,至于用途,就看个人的发挥了...dll中的主要代码如下:// 唯一的一个 CGameDllApp 对象CGameDllApp theApp;CDlgMain *dlgMain=NULL; //主对话框指针// CGameDllApp 初始化BOOL CGameDllApp::InitInstance(){ CWinApp::InitInstance(); return TRUE;}int CGameDllApp::ExitInsta
阅读全文
摘要:在汇编中引用C语言中的结构体,要先取出结构体的基址,然后利用结构体的 基址+字段偏移量 访问结构体中的成员变量,如:lea eax,test; //取出结构体test在内存中的基址mov ebx,[eax+4]; //取出结构体test中,第4个字节开始处的4字节数据mov ebx,[eax+8]; //取出结构体test中,第8个字节开始处的4字节数据mov ebx,[eax+c]; //取出结构体test中,第c个字节开始处的4字节数据
阅读全文
摘要:在汇编中引用C语言中的数组,要先取出数组的地址,利用基址+索引 访问数组中的元素,如:int arrary[5]={1,2,3,4,5};lea eax,arrary;//取出数组arrary在内存中的地址mov edx,2; //取出数组arrary中某元素的下标mov ebx,[eax+edx*4]; //取出数据arrary[1],注意数组下标从0开始, //edx乘以4,是因为int在内存中占4个字节
阅读全文
摘要:int a=5; //变量a_asm { mov eax,a; //将变量a的值放入寄存器eax add eax,eax; //相当于a=a+a mov a,eax; //将a+a的结果赋给a } //查看结果,注意a的初值为5 CString rst; rst.Format(_T("a=%d"),a); AfxMessageBox(rst);
阅读全文
摘要://32位寄存器参考16位即可数据寄存器:AX、BX、CX、DX指针及变址寄存器:SP、BP、SI、DI段寄存器:CS、DS、SS和ES控制寄存器:IP和Flags
阅读全文
摘要:原文地址:http://www.cnblogs.com/mydomain/archive/2010/10/24/1859798.html8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中要指明,指令进行的是字操作还是字节操作。对于这个问题,汇编语言中用一下方法处理。(1)通过寄存器名指明要处理的数据的尺寸。例如:下面的指令中,寄存器指明了指令进行的是字操作:mov ax,1mov bx,ds:[0]mov ds,axmov ds:[0],axinc axadd ax,1000下面的指令中,寄存器指明了指令进行的是字节操作:mov al,1mov al,blmov
阅读全文