逆向判断素数

该看的资料都看过了,是时候做下练习了,在百度搜了个C语言常用算法.docx。便拿起最简单的一个小算法来练习下反汇编了

 

程序源代码:

#include<stdio.h>
#include<stdlib.h>
 
int sushu(int m);
 
void main()
{
     int m,k;
 
     printf("please input a number:\n");
     scanf("%d",&m);
 
     k=sushu(m);
 
     if(k==m)
     printf("该数是素数\n");
     else
     printf("该数不是素数\n");
     system("pause");
}
 
int sushu(int m)
{
  int i;
  for(i=2;i*i<=m;i++)
     if(m%i==0)
        return 0;
  return m;
}

逆向思路:

OD打开程序 F8单步走,走到一个Call 卡主,因为程序在正式运行了,要求输入了

在那个call下断点重新加载程序 F9运行到断点,然后F7跟进CALL

Call里面是主程序内容,这里主要分析sushu函数,再走几步找到sushu函数进去,汇编代码:

00401000    56              push esi
00401001    8B7424 08       mov esi,dword ptr ss:[esp+8]             ; esi作传进来的参数
00401005    83FE 04         cmp esi,4                                ; m<=i*i
00401008    B9 02000000     mov ecx,2                                ; i=2
0040100D    7C 14           jl short asm.00401023                    ; 小于4的话直接跳过 返回素数本身
0040100F    90              nop
00401010    8BC6            mov eax,esi                              ; 参数暂时给eax
00401012    99              cdq                                      ; 将eax的符号位扩展到edx
00401013    F7F9            idiv ecx                                 ; 合并后除以ecx 商放在eax 余数放在edx
00401015    85D2            test edx,edx
00401017    74 0E           je short asm.00401027                    ; 如果等于0,即没有余数 就判断它不是素数
00401019    41              inc ecx                                  ; i++;
0040101A    8BC1            mov eax,ecx
0040101C    0FAFC1          imul eax,ecx                             ; 综合两句得 i*i
0040101F    3BC6            cmp eax,esi
00401021  ^ 7E ED           jle short asm.00401010                   ; i*i小于等于4则循环继续
00401023    8BC6            mov eax,esi
00401025    5E              pop esi
00401026    C3              retn
00401027    33C0            xor eax,eax
00401029    5E              pop esi
0040102A    C3              retn


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值