首页
社区
课程
招聘
[旧帖] [原创]使用retn指令调用API 0.00雪花
发表于: 2016-2-20 17:54 2364

[旧帖] [原创]使用retn指令调用API 0.00雪花

2016-2-20 17:54
2364
第一次来看雪论坛发帖(在我的博客里也有这篇文章)
使用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,MyExit  
        push edx  
        /* 这一步不是必须的 */  
        xor eax,eax  
        xor ebx,ebx  
        xor ecx,ecx  
        xor edx,edx  
        xor edi,edi  
        xor esi,esi  
        /*//////////////////////////////////*/  
        push MessageBoxA  
        retn//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,MyExit  
        push edx  
        /* 这一步不是必须的 */  
        xor eax,eax  
        xor ebx,ebx  
        xor ecx,ecx  
        xor edx,edx  
        xor edi,edi  
        xor esi,esi  
        /*//////////////////////////////////*/  
        push MessageBoxA  
        retn//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;  
}  

求转正~

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 1380
活跃值: (1626)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
抢个板凳
2016-2-20 17:59
0
游客
登录 | 注册 方可回帖
返回
//