躲猫猫!验证机制隐藏在API中高级技术
SMC是一种局部代码加密技术,通过对一段代码进行加密来达到增加逆向工程难度或者免杀的目的。编写SMC代码不是汇编语言的专利。——《加密与解密 第三版》是的,SMC不仅能使用汇编上实现,还能很容易的使用VC实现,但是有一个比较致命缺陷:要精准的定位某个函数非常麻烦,所以我们就要以区块为加密的基础单位。
预备知识
需要一点点的PE结构基础就ok啦。
加密算法
既然是加密,就必然需要加密算法。Internet上有许多优秀的开源加密算法,在这篇文章中我将使用自己编写的加密算法。
加密原理简单,是大家耳熟能详的异或加密。
异或的运算方法是一个二进制运算:
1^1=0
0^0=0
1^0=1
0^1=1
两者相等为0,不等为1.
对于一个字符来说,都可以用二进制码来表示.如A:01000001
字符的异或就是对每一位进行二进制运算.
用于加密算法时,假设你要加密的内容为A,密钥为B,则可以用异或加密:
C=A^B
在数据中保存C就行了.
用的时候:
A=B^C
即可取得原加密的内容,所以只要知道密钥,就可以完成加密和解密
根据原理可以推导出,加密函数也自带解密功能。if(key==2)
{
MessageBox(XXX,"注册失败!","err",MB_OK);
}else
{
//这个只是假的成功吧。
MessageBox(0,"注册成功!","err",MB_OK)
}注意观察第一个参数,这个是我们的后门标记。
逆向者一般都会跳过带”失败“特征的分支…..
假如我们HOOK MessageBoxA这个函数,并留下了进入验证机制的后门….
在 MessageBox(XXX,”注册失败!”,”err”,MB_OK); 中触发后门,触发条件是XXX=后门设置的某个值…
一旦跳过了这一个分支,那么就等于跳过了进入注册机制的路…..呵呵,你懂得…
然后显示注册失败什么的 就可以在验证完后改变MessageBox的参数现实提示。
HOOK操作代码最后放到隐秘一点的地方,比如异常处理函数..
下面是完整的验证DLL代码,写地很简单。
//By
void HookMessageBox();
BOOL APIENTRY DllMain( HMODULE hModule,
DWORDul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
HookMessageBox();
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
char *err = "注册失败!";
char *regok ="注册成功!";
char * FunAddr = NULL;
void HookMessageBox();
int __stdcall REG(int key)
{
if (key==0xcccccccc)
{
return 1;
}else
{
return 0;
}
}
__declspec(naked) void MyMessagebox()
{
_asm
{
push ebp
mov ebp,esp
cmp ,0xAA
jne next
push
call REG
push ebx
mov ebx,0
mov ,ebx
mov ,ebx
pop ebx
cmp eax,1
jne iferr
mov eax,regok
mov ,eax
jmp next
iferr:
mov eax,err
mov ,eax
next:
mov eax,FunAddr
add eax,5
jmp eax
}
}
void HookMessageBox()
{
unsigned char JmpCode;
int addr2;
DWORD oldProtect;
FunAddr=(char *)GetProcAddress(GetModuleHandleA("User32.dll"),"MessageBoxA");
if (!FunAddr)
{
MessageBoxA(0,"error!","",MB_OK);
ExitProcess(-1);
}
JmpCode=0xE9;
addr2 = (int)MyMessagebox-(int)FunAddr-5;
*((int*)&JmpCode)=addr2;
VirtualProtect(FunAddr,5,PAGE_EXECUTE_READWRITE,&oldProtect);
memcpy(FunAddr,JmpCode,5);
VirtualProtect(FunAddr,5,oldProtect,NULL);
} 看不懂,还是占个沙发 出个视频啊 可修改参数达到逆向的目的! 既然没人评分,哎 支持下楼主,希望多出教程 大神能帮我逆向不,数据在服务器不知咋解决,有偿加球球号 一九五九九三零九五三 感谢版主的分享 这个必须要收起来,非常实用
页:
[1]
2