-
-
[原创]Source Insight 3.5逆向分析
-
发表于: 2010-10-9 17:05 8016
-
【文章标题】: Source Insight 3.5的逆向分析
【下载地址】: 自己搜索下载
【使用工具】: vc2008
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教,但写c的程序员用这个的还是很多
-------------------------
离windows开发越来越远了。。。 不过标准c的开发也还好。只是看起来没那么华丽
入口容易断:
004432D9 /$ 55 push ebp
004432DA |. 8BEC mov ebp, esp
004432DC |. 83EC 20 sub esp, 20
004432DF |. 57 push edi
004432E0 |. 6A 2D push 2D
004432E2 |. FF75 08 push dword ptr [ebp+8]
004432E5 |. E8 26870D00 call 0051BA10 ; spilte -
004432EA |. 59 pop ecx
004432EB |. 59 pop ecx
004432EC |. 8945 F8 mov dword ptr [ebp-8], eax
004432EF |. 837D F8 00 cmp dword ptr [ebp-8], 0
004432F3 |. 75 07 jnz short 004432FC
004432F5 |. 33C0 xor eax, eax
004432F7 |. E9 3C010000 jmp 00443438
004432FC |> 8B55 F8 mov edx, dword ptr [ebp-8]
004432FF |. 2B55 08 sub edx, dword ptr [ebp+8]
00443302 |. BF A8495A00 mov edi, 005A49A8 ; ASCII "SI3US"
00443307 |. 83C9 FF or ecx, FFFFFFFF
。。。。。。。。。。。。。。。
00443420 |. E8 CD850D00 call 0051B9F2 ;
00443425 |. 59 pop ecx
00443426 |. 3945 FC cmp dword ptr [ebp-4], eax
00443429 |. 74 04 je short 0044342F
0044342B |. 33C0 xor eax, eax
0044342D |. EB 09 jmp short 00443438
0044342F |> 8B45 E4 mov eax, dword ptr [ebp-1C]
00443432 |. C600 2D mov byte ptr [eax], 2D
00443435 |. 6A 01 push 1
00443437 |. 58 pop eax
00443438 |> 5F pop edi
00443439 |. C9 leave
0044343A \. C2 0400 retn 4
这里就是注册的流程。。。
注册码是xxxxx-xxxxxx-xxxxx形式给出的
注册分3部分 第一部分 是固定的 都是SI3US
004432D9 /$ 55 push ebp
004432DA |. 8BEC mov ebp, esp
004432DC |. 83EC 20 sub esp, 20
004432DF |. 57 push edi
004432E0 |. 6A 2D push 2D
004432E2 |. FF75 08 push dword ptr [ebp+8]
004432E5 |. E8 26870D00 call 0051BA10 ; spilte -
004432EA |. 59 pop ecx
004432EB |. 59 pop ecx
004432EC |. 8945 F8 mov dword ptr [ebp-8], eax
004432EF |. 837D F8 00 cmp dword ptr [ebp-8], 0
004432F3 |. 75 07 jnz short 004432FC
004432F5 |. 33C0 xor eax, eax
004432F7 |. E9 3C010000 jmp 00443438
004432FC |> 8B55 F8 mov edx, dword ptr [ebp-8]
004432FF |. 2B55 08 sub edx, dword ptr [ebp+8]
00443302 |. BF A8495A00 mov edi, 005A49A8 ; ASCII "SI3US"
00443307 |. 83C9 FF or ecx, FFFFFFFF
0044330A |. 33C0 xor eax, eax
0044330C |. F2:AE repne scas byte ptr es:[edi]
0044330E |. F7D1 not ecx
00443310 |. 49 dec ecx
00443311 |. 3BD1 cmp edx, ecx
00443313 |. 74 07 je short 0044331C
00443315 |. 33C0 xor eax, eax
00443317 |. E9 1C010000 jmp 00443438
0044331C |> BF A8495A00 mov edi, 005A49A8 ; ASCII "SI3US"
下面是一些检查注册好代码这里有个全局数据
第一部分其实就是 SI3US
-----------------------------------------------------------------------
第2部分 主要部分 前面的检查路过
004433F5 |> \8B45 E4 mov eax, dword ptr [ebp-1C]
004433F8 |. 40 inc eax
004433F9 |. 8945 F4 mov dword ptr [ebp-C], eax
004433FC |. 8B7D F4 mov edi, dword ptr [ebp-C]
004433FF |. 83C9 FF or ecx, FFFFFFFF
00443402 |. 33C0 xor eax, eax
00443404 |. F2:AE repne scas byte ptr es:[edi]
00443406 |. F7D1 not ecx
00443408 |. 49 dec ecx
00443409 |. 83F9 05 cmp ecx, 5
0044340C |. 74 04 je short 00443412
0044340E |. 33C0 xor eax, eax
00443410 |. EB 26 jmp short 00443438
00443412 |> FF75 F0 push dword ptr [ebp-10]
00443415 |. E8 CB1B0B00 call 004F4FE5 // 这个函数进去
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
004F4FE5 /$ 55 push ebp
004F4FE6 |. 8BEC mov ebp, esp
004F4FE8 |. 83EC 10 sub esp, 10
004F4FEB |. FF75 08 push dword ptr [ebp+8]
004F4FEE |. E8 FF690200 call 0051B9F2 // 这个函数进去见下面
004F4FF3 |. 59 pop ecx
004F4FF4 |. 8945 F0 mov dword ptr [ebp-10], eax
004F4FF7 |. 8B45 F0 mov eax, dword ptr [ebp-10]
004F4FFA |. 8945 FC mov dword ptr [ebp-4], eax
004F4FFD |. 8365 F4 00 and dword ptr [ebp-C], 0
004F5001 |. 8B45 08 mov eax, dword ptr [ebp+8]
004F5004 |. 8945 F8 mov dword ptr [ebp-8], eax
004F5007 |. EB 07 jmp short 004F5010
004F5009 |> 8B45 F8 /mov eax, dword ptr [ebp-8]
004F500C |. 40 |inc eax
004F500D |. 8945 F8 |mov dword ptr [ebp-8], eax
004F5010 |> 8B45 F8 mov eax, dword ptr [ebp-8]
004F5013 |. 0FB600 |movzx eax, byte ptr [eax]
004F5016 |. 85C0 |test eax, eax
004F5018 |. 74 2C |je short 004F5046
004F501A |. 8B45 F8 |mov eax, dword ptr [ebp-8]
004F501D |. 0FB600 |movzx eax, byte ptr [eax]
004F5020 |. 8B4D F4 |mov ecx, dword ptr [ebp-C]
004F5023 |. 33048D B0495A>|xor eax, dword ptr [ecx*4+5A49B0]
004F502A |. 8B4D FC |mov ecx, dword ptr [ebp-4]
004F502D |. 8D0488 |lea eax, dword ptr [eax+ecx*4]
004F5030 |. 8945 FC |mov dword ptr [ebp-4], eax
004F5033 |. 8B45 F4 |mov eax, dword ptr [ebp-C]
004F5036 |. 40 |inc eax
004F5037 |. 8945 F4 |mov dword ptr [ebp-C], eax
004F503A |. 837D F4 0A |cmp dword ptr [ebp-C], 0A
004F503E |. 75 04 |jnz short 004F5044
004F5040 |. 8365 F4 00 |and dword ptr [ebp-C], 0
004F5044 |>^ EB C3 \jmp short 004F5009
004F5046 |> 8B45 FC mov eax, dword ptr [ebp-4]
004F5049 |. 33D2 xor edx, edx
004F504B |. B9 A0860100 mov ecx, 186A0
004F5050 |. F7F1 div ecx
004F5052 |. 8BC2 mov eax, edx
004F5054 |. C9 leave
004F5055 \. C2 0400 retn 4
。。。。。。。。。。。。。。。。。。
0051B9F2 /$ FF7424 04 push dword ptr [esp+4]
0051B9F6 |. E8 6CFFFFFF call 0051B967 //进去
0051B9FB |. 59 pop ecx
0051B9FC \. C3 retn
。。。。。。。。。。。。。。。。。。。。。。。。。。。
0051B967 /$ 53 push ebx
0051B968 |. 55 push ebp
0051B969 |. 56 push esi
0051B96A |. 57 push edi
0051B96B |. 8B7C24 14 mov edi, dword ptr [esp+14]
0051B96F |> 833D 9C9C5B00>/cmp dword ptr [5B9C9C], 1
0051B976 |. 7E 0F |jle short 0051B987
0051B978 |. 0FB607 |movzx eax, byte ptr [edi]
0051B97B |. 6A 08 |push 8
0051B97D |. 50 |push eax
0051B97E |. E8 DB090000 |call 0051C35E
0051B983 |. 59 |pop ecx
0051B984 |. 59 |pop ecx
0051B985 |. EB 0F |jmp short 0051B996
0051B987 |> 0FB607 |movzx eax, byte ptr [edi]
0051B98A |. 8B0D 909A5B00 |mov ecx, dword ptr [5B9A90] ; Insight3.005B9A9A
0051B990 |. 8A0441 |mov al, byte ptr [ecx+eax*2]
0051B993 |. 83E0 08 |and eax, 8
0051B996 |> 85C0 |test eax, eax
0051B998 |. 74 03 |je short 0051B99D
0051B99A |. 47 |inc edi
0051B99B |.^ EB D2 \jmp short 0051B96F
0051B99D |> 0FB637 movzx esi, byte ptr [edi]
0051B9A0 |. 47 inc edi
0051B9A1 |. 83FE 2D cmp esi, 2D
0051B9A4 |. 8BEE mov ebp, esi
0051B9A6 |. 74 05 je short 0051B9AD
0051B9A8 |. 83FE 2B cmp esi, 2B
0051B9AB |. 75 04 jnz short 0051B9B1
0051B9AD |> 0FB637 movzx esi, byte ptr [edi]
0051B9B0 |. 47 inc edi
0051B9B1 |> 33DB xor ebx, ebx
0051B9B3 |> 833D 9C9C5B00>/cmp dword ptr [5B9C9C], 1
0051B9BA |. 7E 0C |jle short 0051B9C8
0051B9BC |. 6A 04 |push 4
0051B9BE |. 56 |push esi
0051B9BF |. E8 9A090000 |call 0051C35E // 这里进去看看
0051B9C4 |. 59 |pop ecx
0051B9C5 |. 59 |pop ecx
0051B9C6 |. EB 0B |jmp short 0051B9D3
0051B9C8 |> A1 909A5B00 |mov eax, dword ptr [5B9A90]
0051B9CD |. 8A0470 |mov al, byte ptr [eax+esi*2]
0051B9D0 |. 83E0 04 |and eax, 4
0051B9D3 |> 85C0 |test eax, eax
0051B9D5 |. 74 0D |je short 0051B9E4
0051B9D7 |. 8D049B |lea eax, dword ptr [ebx+ebx*4]
0051B9DA |. 8D5C46 D0 |lea ebx, dword ptr [esi+eax*2-30]
0051B9DE |. 0FB637 |movzx esi, byte ptr [edi]
0051B9E1 |. 47 |inc edi
0051B9E2 |.^ EB CF \jmp short 0051B9B3
0051B9E4 |> 83FD 2D cmp ebp, 2D
0051B9E7 |. 8BC3 mov eax, ebx
0051B9E9 |. 75 02 jnz short 0051B9ED
0051B9EB |. F7D8 neg eax
0051B9ED |> 5F pop edi
0051B9EE |. 5E pop esi
0051B9EF |. 5D pop ebp
0051B9F0 |. 5B pop ebx
0051B9F1 \. C3 retn
这里
0051B9B3 |> 833D 9C9C5B00>/cmp dword ptr [5B9C9C], 1
0051B9BA |. 7E 0C |jle short 0051B9C8
0051B9BC |. 6A 04 |push 4
0051B9BE |. 56 |push esi
0051B9BF |. E8 9A090000 |call 0051C35E // 这里
0x5B9C9C的数据一出来就被初始化为 1,而我下了内存访问断点也一直没有改变所有。这里的函数0051C35E就不会被跑到
但是这个函数的功能是支持unicode的注册。里面也是自己处理把unicode转化为多字节码。不过我们没有到时候就空了
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
第2部分的主要过程。
1)0051B9F2 函数是asctohex 。
2)然后在004F4FE5 里做运算
3)生成一个5为数 和 第3部分把字符变成16进制 数据 做比较
注意里面的几个内存数据 是我们要运算用到的
1)0051B9F2里面
004F5020 |. 8B4D F4 |mov ecx, dword ptr [ebp-C]
004F5023 |. 33048D B0495A>|xor eax, dword ptr [ecx*4+5A49B0]
2)004F4FE5
0051B9C8 |> A1 909A5B00 |mov eax, dword ptr [5B9A90]
0051B9CD |. 8A0470 |mov al, byte ptr [eax+esi*2]
3)还有一个是在字符检查里面
004433E3 |. 8B4D E8 |mov ecx, dword ptr [ebp-18]
004433E6 |. 3B0C85 488C53>|cmp ecx, dword ptr [eax*4+538C48]
------------------------------------------------------------
over
代码
主要是对它的函数的封装 使用了mfc 主要是为了支持剪切板功能
#include "stdafx.h"
#include "string.h"
#include "stdio.h"
#include <stdlib.h>
DWORD D_5B9C9C = 1;
unsigned char S_5A49B0[] =
"\x96\x00\x00\x00\x95\x00\x00\x00\x10\x00\x00\x00\x23\x00\x00\x00\
\x07\x00\x00\x00\x15\x00\x00\x00\x08\x00\x00\x00\x03\x00\x00\x00\
\x10\x00\x00\x00\x11\x00\x00\x00\x63\x3A\x5C\x76\x33\x35\x5C\x73\
\x65\x72\x69\x61\x6C\x2E\x63\x00\x63\x3A\x5C\x76\x33\x35\x5C\x73";
DWORD S_538C48[]=
{
0x00003039,0x0001E240,0x00039447,0x0005464E,
0x0600F855,0x0008AA52,0x000A5BF5,0x000980D0,
0x0B00ADD0,0x000980D0,0x00030448,0x00030379,
0x0800AF93,0x00030379,0x000007B9,0x000F2F90,
0x0900FF66,0x0008AA52,0x0000F3A0,0x00030379,
0x0800AA52,0x000062AF,0x000002AD,0x765C3A63,
0x5C743533,0x626C6F6F,0x505C786F,0x4978656C,
0x5C50786F,0x4978656C,0x00632E4C,0x765C3A63,
0x5C743533,0x626C6F6F,0x505C786F,0x4978656C,
0x63002E4C,0x765C3A63,0x745C3533,0x626C6F6F,
0x5C55786F,0x496C6974,0x00632E4C,0x765C3A63,
0x5C743533,0x626C6F6F,0x555C786F,0x496C6974,
0x63002E4C,0x765C3A63,0x745C3533,0x626C6F6F,
0x5C55786F,0x496C6974,0x00632E4C,0x765C3A63,
0x5C743533,0x626C6F6F,0x535C786F,0x495F6C6C,
0x63002E4C,0x765C3A63,0x745C3533,0x626C6F6F
};
char* S_5B9A90 =
"\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\
\x20\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x20\x00\x20\x00\
\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\
\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\
\x48\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\
\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\
\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\
\x84\x00\x84\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\
\x10\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x01\x00\
\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\
\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\
\x01\x00\x01\x00\x01\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\
\x10\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x02\x00\
\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\
\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\
\x02\x00\x02\x00\x02\x00\x10\x00\x10\x00\x10\x00\x10\x00\x20\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
char serial[256]={0};
void Get_FirstSerial();
int Get_004F4FE5(char * serial);
void Check_0051B9F2(char* serial);
int AscToHex_0051B9F2(char* serial);
void ATOH_0051B967(char*);
void G_0051C35E(int ,char*);
int Check(int key);
void Convert_Str(char*);
using namespace std;
int _tmain()
{
char temp[256] = {0};
printf("输 入 长 度 6 位 的 字 符 和 数 字 !\n");
while(gets(temp))
{
if(strlen(temp) == 6)
break;
}
Convert_Str(temp);
Get_FirstSerial();
int hexkey=AscToHex_0051B9F2(temp);
if(!Check(hexkey))
{
printf(".................\n");
system("pause");
return 0;
}
int len =strlen(serial);
sprintf(&serial[len],"%s%s","-",temp);
int key2 = Get_004F4FE5(temp);
itoa(key2,temp,10);
len =strlen(serial);
sprintf(&serial[len],"%s%s","-",temp);
printf("%s\n",serial);
//copy to clipboard
if(OpenClipboard(NULL))
{
HANDLE hClip;
char *pBuff;
EmptyClipboard();
hClip = GlobalAlloc(GMEM_MOVEABLE,strlen(serial) + 1);
pBuff = (char*)GlobalLock(hClip);
strcpy(pBuff,serial);
GlobalUnlock(hClip);
SetClipboardData(CF_TEXT,hClip);
CloseClipboard();
}
printf("序列号已经复制到剪切板, 按ctrl + v 粘贴!\n");
system("pause");
return 0;
}
void Get_FirstSerial()
{
strcpy(serial,"SI3US");
}
int Get_004F4FE5(char * serial)
{
_asm
{
push dword ptr [ebp+0x8]
call AscToHex_0051B9F2
pop ecx
mov dword ptr [ebp-0x10], eax
mov eax, dword ptr [ebp-0x10]
mov dword ptr [ebp-0x4], eax
and dword ptr [ebp-0xC], 0
mov eax, dword ptr [ebp+0x8]
mov dword ptr [ebp-0x8], eax
jmp short L004F5010
L004F5009: mov eax, dword ptr [ebp-0x8]
inc eax
mov dword ptr [ebp-0x8], eax
L004F5010: mov eax, dword ptr [ebp-0x8]
movzx eax, byte ptr [eax]
test eax, eax
je short L004F5046
mov eax, dword ptr [ebp-0x8]
movzx eax, byte ptr [eax]
mov ecx, dword ptr [ebp-0xC]
xor eax, dword ptr [S_5A49B0+ecx*4]
mov ecx, dword ptr [ebp-0x4]
lea eax, dword ptr [eax+ecx*4]
mov dword ptr [ebp-4], eax
mov eax, dword ptr [ebp-0xC]
inc eax
mov dword ptr [ebp-0xC], eax
cmp dword ptr [ebp-0xC], 0xA
jnz short L004F5044
and dword ptr [ebp-0xC], 0
L004F5044: jmp short L004F5009
L004F5046: mov eax, dword ptr [ebp-0x4]
xor edx, edx
mov ecx, 0x186A0
div ecx
mov eax, edx
}
}
int AscToHex_0051B9F2(char* key)
{
_asm
{
push dword ptr [ebp+0x8]
call ATOH_0051B967
pop ecx
}
}
void ATOH_0051B967(char * str)
{
_asm
{
push ebx
push ebp
push esi
push edi
mov edi, dword ptr [ebp+0x8]
L0051B96F: cmp D_5B9C9C, 1
jle short L0051B987
movzx eax, byte ptr [edi]
push 0x8
push eax
L0051B97E: call G_0051C35E
pop ecx
pop ecx
jmp short L0051B996
L0051B987: movzx eax, byte ptr [edi]
mov ecx, S_5B9A90
mov al, byte ptr [ecx+eax*2]
and eax, 0x8
L0051B996: test eax, eax
je short L0051B99D
inc edi
jmp short L0051B96F
L0051B99D: movzx esi, byte ptr [edi]
inc edi
cmp esi, 0x2D
mov ebp, esi
je short L0051B9AD
cmp esi, 0x2B
jnz short L0051B9B1
L0051B9AD: movzx esi, byte ptr [edi]
inc edi
L0051B9B1: xor ebx, ebx
L0051B9B3: cmp D_5B9C9C, 1
jle short L0051B9C8
push 4
push esi
L0051B9BF: call G_0051C35E
pop ecx
pop ecx
jmp short L0051B9D3
L0051B9C8: mov eax, S_5B9A90
mov al, byte ptr [eax+esi*2]
and eax, 4
L0051B9D3: test eax, eax
je short L0051B9E4
lea eax, dword ptr [ebx+ebx*4]
lea ebx, dword ptr [esi+eax*2-0x30]
movzx esi, byte ptr [edi]
inc edi
jmp short L0051B9B3
L0051B9E4: cmp ebp, 0x2D
mov eax, ebx
jnz short L0051B9ED
neg eax
L0051B9ED: pop edi
pop esi
pop ebp
pop ebx
}
}
int Check(int key)
{
_asm
{
mov eax ,dword ptr [ebp+0x8]
mov dword ptr [ebp-0x18], eax
and dword ptr [ebp-0x14], 0
jmp short L004433DA
L004433D3: mov eax, dword ptr [ebp-0x14]
inc eax
mov dword ptr [ebp-0x14], eax
L004433DA: cmp dword ptr [ebp-0x14], 0x17
jnb short L004433F5
mov eax, dword ptr [ebp-0x14]
mov ecx, dword ptr [ebp-0x18]
cmp ecx, dword ptr [eax*4+S_538C48]
jnz short L004433F3
xor eax, eax
jmp short L00443438
L004433F3: jmp short L004433D3
L004433F5:
L00443438:
}
}
void G_0051C35E(int ,char*)
{
}
void Convert_Str(char * str)
{
char *cp;
for ( cp = str ; *cp ; ++cp )
if ( ('a' <= *cp) && (*cp <= 'z') )
*cp -= 'a' - 'A';
}
-------------------------------------------
谢谢各位大侠路过。。。。。。。。。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [求助]ios 推送 5252
- [原创]Source Insight 3.5逆向分析 8017
- [原创]易我数据恢复2.0/2.1 7133
- [原创]一个小软件的详细分析 4044