基础练习
有一个字符串是这样的:”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