【逆向知识】除0异常-编程与逆向

1、简介

重温编程和反调试的知识。

2、编程知识

整体界面长这个样子,然后拖控件,按钮点击事件。

按钮点击事件的函数编写

获取用户名与密码的值,然后取出用户名的最后一位判断是不是0,如果是0就进入判断函数内,否则就输出注册失败的提示。

void CSehDlg::OnReg()
{
    // TODO: Add your control notification handler code here
    CString strName;
    CString strCode;
    GetDlgItemText(IDC_EDT_USERNAME, strName);  //获取用户名
    GetDlgItemText(IDC_EDT_USERCODE, strCode);  //获取密码

    TCHAR chFlag = strName.GetAt(strName.GetLength()-1);
    if (chFlag == ‘0‘)
    {
        FirstLevelSeh(chFlag);   //异常判断函数
    }
    else
    {
        RegFail();  //注册失败的函数
    }
}

异常函数编写

判断最后一位数为0,然后0除以0会触发一个结果未定义的异常,然后进入异常处理的部分。

void FirstLevelSeh(char chFlag)

{

        __try
        {
            INT a = chFlag;  // 现在的值是0
            int b = a/0;     // 0除以0会发生异常,未定义结果触发异常
        }
        //定义异常处理模块
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
            HWND hDlgWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
            HWND hWnd = ::GetDlgItem(hDlgWnd, IDC_STC_TIP);
            ::SetWindowText(hWnd, "Success!!");
        }
}

提示失函数编写

非常简单,获取文本控件的值,然后显示文本提示失败。


void CSehDlg::RegFail()
{
    HWND hDlgWnd = AfxGetApp()->GetMainWnd()->m_hWnd;
    HWND hWnd = ::GetDlgItem(hDlgWnd, IDC_STC_TIP);
    ::SetWindowText(hWnd, "Failed!!");
}

3、逆向实践

IDA中的结构图

最右边是捕获到异常后处理的位置,提示成功的函数被独立。那么只要在那个分支处进行断点即可。

在【0043706F 040 mov esp, [ebp+ms_exc.old_esp]】处下断点,即可进入异常处理部分

4、参考

SEH反调试的实现与调试-文章

http://blog.csdn.net/xiaocaiju/article/details/25995495

SEH反调试的实现与调试 -代码

http://download.csdn.net/download/xiaocaiju/7357721

原文地址:https://www.cnblogs.com/17bdw/p/8280650.html

时间: 2024-08-29 17:01:51

【逆向知识】除0异常-编程与逆向的相关文章

逆向知识之CS辅助/外挂专题.2.实现CS1.6无限夜视仪.无限闪光烟雾高爆弹.

逆向知识之CS辅助/外挂专题.2.实现CS1.6无限夜视仪.无限闪光烟雾高爆弹. 关于人物子弹无限可以观看上一篇博客. 一丶无限夜视仪. 无限夜视仪找法. 1.CE附加游戏. 2.搜索0或者1. 3.修改夜视仪状态为开启或者关闭. 4.CE继续搜索. 5.筛选数据. 关于搜索0或者1我们也不知道哪个是打开或者关闭. PS: 因为我找过了.确定了1是打开夜视仪. 搜索到最后如下图所示: 通过上图所示找到了一个地址.对其修改0或者1可以实现夜视仪的打开关闭. 对其下访问断点 可以得出汇编代码使用了基

逆向知识第六讲,取摸优化的几种方式

逆向知识第六讲,取摸优化的几种方式 除法讲完之后,直接开始讲 % 运算符在汇编中表现形式 首先C的高级代码贴上来. 高级代码: // Tedy.cpp : Defines the entry point for the console application. // #include "stdafx.h" int main(int argc, char* argv[]) { unsigned Number; scanf("%d",&Number); //防止

逆向知识十一讲,识别函数的调用约定,函数参数,函数返回值.

逆向知识十一讲,识别函数的调用约定,函数参数,函数返回值. 在反汇编中,我们常常的会看到各种的函数调用,或者通过逆向的手段,单独的使用这个函数,那么此时,我们就需要认识一下怎么识别函数了. 一丶识别__cdecl 函数(俗称C Call),函数参数,函数返回值 首先写一个C Call的函数 1.返回值 int类型, 参数int 类型 高级代码: int __cdecl MyAdd(int a,int b) { return a + b; } int main(int argc, char* ar

逆向知识十三讲,汇编中数组的表现形式,以及还原数组

逆向知识十三讲,汇编中数组的表现形式,以及还原数组 讲解数组之前,要了解数组的特性 1.数据具有连续性 2.数据类型相同 比如: int Ary[3] = {0,1,2}; 我们可以看出,上面定义的数组,数据是连续的,其中每个数据类型大小都是int类型(类型也是一样的) 汇编中识别数组: 1.地址连续 2.带有比例因子寻址   (lea  reg32,[xxx  + 4 *xxxx]) 一丶一维数组在汇编中的表现形式 首先说下数组寻址公式,便于下面讲解 公式: 数组首地址 + sizeof(ty

学习逆向知识之用于游戏外挂的实现.第三讲,通过游戏外挂.分析红色警戒金钱基址.以及确定基址小技巧.

分析红色警戒金钱基址.以及确定基址小技巧. 一丶基址简介 通过第二讲.我们寻找植物大战僵尸无限阳光.学习到了相关的逆向知识.以及认识了基址.动态地址. 静态地址的区别.现在我们拿红色警戒这款单击游戏进行练手. PS: 主要目的是分析数据.学习逆向知识.并为之所用.并不是教大家如何制作外挂. 1.怎么确定我们寻找到的是基址? 有三种方法. CE中绿色表示基址,黑色表示内存地址.一般绿色的很有可能是基址(当然不一定是.不过大部分是) 退出游戏重新进入游戏.地址不会改变.其值的内容也不会改变. 搜索指

逆向知识之CS1.6辅助/外挂专题.1.实现CS1.6主武器副武器无限子弹

逆向知识之CS辅助/外挂专题.1.实现CS主武器副武器无限子弹 PS: 相信大家CS1.6这类的FPS应该玩过.现在我们通过外挂手法.讲解逆向的本质.以及应用. 关于CS1.6的下载.网络百度下载即可. 一丶主武器无限子弹寻找方法. 首先我们知道.在CS中主武器有子弹个数.那么我们可以通过CE寻找子弹的个数增加或者减少来进行寻找我们的数据. 关于CE的使用.可以参考网络教程.很简单.主需要来回扫描即可. 寻找思路: 1.首次扫描子弹个数 2.变化子弹继续扫描. 3.重复2步骤.直到地址很少. 4

AOP基础知识及AOP切面编程之注释方法、xml配置方法

<span style="font-family: 微软雅黑; font-size: 10.5pt; letter-spacing: 0pt; ">AOP概念</span> Aspect(切面):它跟类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是对横切性关注点的抽象 joinpoint(连接点):所谓连接点就是被拦截到的点,在spring中,这些点是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器

C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)

译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 and .NET Core 1.0>.水平有限,各位阅读时仔细分辨,唯望莫误人子弟. 附英文版原文:Professional C# 6 and .NET Core 1.0 - Chapter 39 Windows Services --------------------------------

NET4.0多线程编程---Tasks

写在前面的话 不得不说4.0里面新增的task实在是让人耳目一新,曾经在thread里面查找当线程abort等等操作的时候有没有相应的事件,就像gridview在分页.绑定的时候会产生事件一样,但是在thread里面是没有找到.然而task里面这些都实现了,虽然不是以事件的方式实现,但是它真的实现了.很让人兴奋. 一.概述 在上一篇文章.NET4.0多线程编程---Cooperative Cancellation提到线程池没有提供任何内在的方法告诉我们操作什么时候完成,在线程完成了以后,我们也没