.text:00000012 ; =============== S U B R O U T I N E =======================================
.text:00000012
.text:00000012
.text:00000012 sub_12 proc near
.text:00000012
.text:00000012 SubStr = byte ptr 8 //局部变量 类型char
.text:00000012 arg_5 = byte ptr 9 //局部变量 类型char
.text:00000012 arg_6 = byte ptr 0Ah //局部变量 类型char
.text:00000012 arg_7 = byte ptr 0Bh //局部变量 类型char
.text:00000012 arg_8 = byte ptr 0Ch //局部变量 类型char
.text:00000012 Str = byte ptr 88h //局部变量 类型char
.text:00000012 arg_85 = byte ptr 89h //局部变量 类型char
.text:00000012 arg_18C = dword ptr 190h //传入的参数 类型char*
.text:00000012
.text:00000012 mov ecx, 40h ; '@' 40H十进制是64
.text:00000017 xor eax, eax
.text:00000019 lea edi, [esp+arg_85]
.text:00000020 mov [esp+Str], dl //Str赋值只有这个
.text:00000027 mov ebx, [esp+arg_18C] //ebx下面窜扫描用到
.text:0000002E rep stosd //将EAX中的值存入ES:EDI所指目标串中,同时EDI按DF的值自动加4或减4. 若加上前缀REP,每存储一次ECX减1,直到ECX为零时结束
.text:00000030 stosw
.text:00000032 stosb
.text:00000033 mov al, 54h ; 'T'
.text:00000035 mov edi, ebx //函数参数KEY
.text:00000037 mov [esp+SubStr], al
.text:0000003B mov [esp+arg_7], al //多余的
.text:0000003F or ecx, 0FFFFFFFFh //ecx=0FFFFFFFFh
.text:00000042 xor eax, eax
.text:00000044 repne scasb //搜索目标字符 ax/al 搜索数据 esx:edi 目标串 cx 串长度,就是在KEY中找字符'T'
.text:00000046 not ecx //ecx=0
.text:00000048 dec ecx //ecx=-1
.text:00000049 mov [esp+arg_5], 45h ; 'E' //多余的
.text:0000004E cmp ecx, edx //edx是什么,下面还要用到
.text:00000050 mov [esp+arg_6], 53h ; 'S' //多余的
.text:00000055 mov [esp+arg_8], dl //多余的
.text:00000059 jle short loc_7A //(有符号数比较)小于或等于转移
.text:0000005B lea edx, [esp+Str]
.text:00000062 push esi //保存esi的值
.text:00000063 mov eax, ebx // ebx是KEY地址
.text:00000065 sub edx, ebx /edx是什么
.text:00000067 mov esi, ecx //ecx是'T'出现的位置?
.text:00000069
.text:00000069 loc_69: ; CODE XREF: sub_12+65j
.text:00000069 mov bl, [eax] 取KEY字符到bl
.text:0000006B xor bl, 5 //5d的二进制是101b
.text:0000006E mov cl, bl
.text:00000070 mov [eax], bl
.text:00000072 mov [edx+eax], cl
.text:00000075 inc eax
.text:00000076 dec esi //esi是引用计数
.text:00000077 jnz short loc_69
.text:00000079 pop esi //恢复esi的值
.text:0000007A
.text:0000007A loc_7A: ; CODE XREF: sub_12+47j
.text:0000007A lea eax, [esp+SubStr]
.text:0000007E lea ecx, [esp+Str]
.text:00000085 push eax ; SubStr
.text:00000086 push ecx ; Str
.text:00000087 call _strstr //在字符串Str中查找子串SubStr 如果找到则返回指向子串SubStr第一次出现处的指针,如果没有找到,则返回NULL
.text:0000008C add esp, 8
.text:0000008F neg eax //0 - eax ->eax。当eax = 0时,CF清0,当eax != 0时, CF置1
.text:00000091 sbb eax, eax //eax - eax - CF ->eax。当eax = 0时,结果eax = 0,当eax != 0时,eax为0,否则eax非0
.text:00000093 pop edi
.text:00000094 neg eax //0 - eax ->eax。当eax = 0时,CF清0,当eax != 0时, CF置1
.text:00000096 mov ds:?IsOemVersion@@3KA, eax ; ulong IsOemVersion
.text:0000009B xor eax, eax
.text:0000009D pop ebx
.text:0000009E add esp, 184h
.text:000000A4 retn
.text:000000A4 sub_12 endp ; sp-analysis failed
.text:000000A4
.text:000000A4 ; ---------------------------------------------------------------------------
还有这个函数的调用是这样的
DWORD RegestOEM(char *Key);
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)