基础程序逆向

  1. 基础练习
  2. 基础程序逆向分析

基础练习

有一个字符串是这样的:”china中国verygood天朝nice”,里面既含有中文又含义英文,请编写一个函数,能截取任意长度的字符串n(n<=总长度):

fn(5) = china

fn(6) = china中

fn(8) = china中国v

#include <stdio.h>

char a[] = "china中国verygood天朝nice";
void fun(int x){
    int count=0;//传的参数代表打印的字符数量,一个汉字也只算一个字符
    for(int i=0; count<x; i++){
        if(a[i]>=0 && a[i]<=127){//汉字不在这个范围内
            printf("%c",a[i]);
            count++;
        }
        else{
            printf("%c",a[i]);
            printf("%c",a[i+1]);//连续打印两个字节以便打印出汉字
            i+=1;
            count++;
        }
    }
    printf("\n");
}

int main(){
    fun(17);
    return 0;
} 

基础程序逆向分析

调用处代码:													
push        5							
push        4							
call        0040100f							
add         esp,8	

函数内部:
00401030   push        ebp							
00401031   mov         ebp,esp						
00401033   sub         esp,44h							
00401036   push        ebx							
00401037   push        esi							
00401038   push        edi						
00401039   lea         edi,[ebp-44h]		
0040103C   mov         ecx,11h							
00401041   mov         eax,0CCCCCCCCh					
00401046   rep stos    dword ptr [edi]	
00401048   mov         eax,[004225c4]			
0040104D   mov         dword ptr [ebp-4],eax				
00401050   mov         ecx,dword ptr [ebp+8]				
00401053   cmp         ecx,dword ptr [ebp+0Ch]		
00401056   jg          00401064							
00401058   mov         edx,dword ptr [ebp+0Ch]				
0040105B   add         edx,dword ptr [ebp-4]				
0040105E   mov         dword ptr [004225c4],edx				
00401064   pop         edi							
00401065   pop         esi						
00401066   pop         ebx							
00401067   mov         esp,ebp							
00401069   pop         ebp							
0040106A   ret						

函数内部功能分析:

1、分析参数

[ebp+8]–X,[ebp+0Ch]–Y

2、分析局部变量

[ebp-4] = eax = [004225c4]

3、分析全局变量

[004225c4]–G

4、功能分析

00401048   mov         eax,[004225c4]
0040104D   mov         dword ptr [ebp-4],eax				
00401050   mov         ecx,dword ptr [ebp+8]				
00401053   cmp         ecx,dword ptr [ebp+0Ch]		
00401056   jg          00401064							
00401058   mov         edx,dword ptr [ebp+0Ch]				
0040105B   add         edx,dword ptr [ebp-4]				
0040105E   mov         dword ptr [004225c4],edx

比较X和Y,将大的那一个传给全局变量G

5、返回值分析

6、还原成C

就是个if,else


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1666739907@qq.com
github