使用retn指令调用API

来源:互联网 发布:开网络棋牌 编辑:程序博客网 时间:2024/05/21 19:08
PS:我也是菜鸟,有什么不对的地方欢迎大牛拍砖。
使用Retn指令调用API的好处就是:在OD中对你用Retn调用的API下断点时,不会显示API调用地址。
这篇文章我就拿HelloWorld举例。

下面是普通调用API的方式

#include <windows.h>  #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")//隐藏控制台窗口  int main(void)  {  MessageBoxA(NULL,/* 窗口句柄 */  "Hello World",/* 弹出的信息 */  "yeeeee",/* 标题 */  MB_OK/* 按钮 */  );/* 弹出信息框 */  return 0;  }  


运行后的结果是这样的:

在OD中打开,对MessageBoxA下断点


显示了调用地址对吧,如果对字符串进行加密,但是显示了来自地址,就会非常容易被破解吧。
注意:程序需要将返回地址找对而且要平衡好堆栈哦。
代码写的不是很好,可能会有多余的指令。。。


运行结果

#include <windows.h>#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")//隐藏控制台窗口  int MyRetn(){return 0;//返回到原来的地址}int main(void){LPCSTR szText="Hello World";LPCSTR szTitle="yeeeee";__asm{/* 这里需要用OD调试,才能知道参数占用了多少个字节 */sub esp,12///////////////////////////////////////lea eax,szText//内容lea ebx,szTitle//标题push 0//按钮push szTitle//标题push szText//内容push 0//窗口句柄lea edx,MyExitpush edx/* 这一步不是必须的 */xor eax,eaxxor ebx,ebxxor ecx,ecxxor edx,edxxor edi,edixor esi,esi/*//////////////////////////////////*/push MessageBoxAretn//MessageBoxA}MyExit:__asm add esp,12//将sub指令减去的esp寄存器的值加回来。MyRetn();return 0;//程序在这里退出}

用OD中打开,对MessageBoxA下断点



PS:这个要用弹出信息框的话,最好写成一个不需要参数的函数,然后逻辑判断之后在调用它。

比如:

#include <stdio.h>#include <string.h>#include <windows.h>LPCSTR szText="HelloWorld";LPCSTR szTitle="    ";void Exit(){return;}int MyRetn(){MessageBoxA(NULL,"这只是一个例子","请无视我",MB_OK);return 0;//返回到原来的地址}int Msg(){__asm{sub esp,12///////////////////////////////////////lea eax,szText//内容lea ebx,szTitle//标题push 0//按钮push szTitle//标题push szText//内容push 0//窗口句柄lea edx,MyExitpush edx/* 这一步不是必须的 */xor eax,eaxxor ebx,ebxxor ecx,ecxxor edx,edxxor edi,edixor esi,esi/*//////////////////////////////////*/push MessageBoxAretn//MessageBoxA}MyExit:__asm add esp,12//将sub指令减去的esp寄存器的值加回来MyRetn();return 0;}int main(void){int a;DWORD Address=&Msg;//获取Msg函数的地址DWORD MExit=&Exit;scanf("%d",&a);if(a==2308){__asm {push [ebp+4]//main函数返回地址jmp Address}}return 0;}


2 0
原创粉丝点击