使用retn指令调用API
来源:互联网 发布:开网络棋牌 编辑:程序博客网 时间:2024/05/21 19:08
PS:我也是菜鸟,有什么不对的地方欢迎大牛拍砖。
使用Retn指令调用API的好处就是:在OD中对你用Retn调用的API下断点时,不会显示API调用地址。
这篇文章我就拿HelloWorld举例。
运行后的结果是这样的:
使用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
- 使用retn指令调用API
- retn 指令理解
- hook api (push xxxx/retn)
- retn
- 执行retn、call、leave指令的时候,esp和eip的变化情况
- 使用JNA 调用WINDOWS API
- php调用face++ API使用
- 使用NDK api调用AssetManager
- 调用指令
- 使用 .NET 框架类替代 API 调用
- 使用MASM-调用API(1)
- 使用MASM-调用API(2)
- 使用MASM-调用API(3)
- 使用API方式调用软键盘
- 使用python调用azure api步骤文档
- 使用 JDBC API 直接调用存储过程
- 使用PHP调用TinyURL API的方法
- 使用 web.rest 调用 REST API
- 事务的概念及事务的四个特征
- 【项目管理】之springMVC+spring+Mybatis环境搭建
- 设置MyEclipse或Eclipse 中 Jsp页面的默认编码
- Android Handler内存泄露分析
- cocos ide 调试lua 程序自动关闭问题的解决
- 使用retn指令调用API
- django 在应用app下面template
- tomcat启动,报问题:To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
- (1) 漂亮的日期控件
- java endsWith()和startsWith方法的解释
- js代码获取IP地址的三种方法,通过js取得客户端的IP地址。
- Ubuntu环境下的iptables的端口转发配置实例
- Android studio报module not specified的处理
- 使用自定义的RelateLayout实现列表布局