|
SMC是一种局部代码加密技术,通过对一段代码进行加密来达到增加逆向工程难度或者免杀的目的。
编写SMC代码不是汇编语言的专利。——《加密与解密 第三版》是的,SMC不仅能使用汇编上实现,还能很容易的使用VC实现,但是有一个比较致命缺陷:要精准的定位某个函数非常麻烦,所以我们就要以区块为加密的基础单位。
[B]预备知识[/B]
需要一点点的PE结构基础就ok啦。
[B]加密算法[/B]
既然是加密,就必然需要加密算法。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,
- DWORD ul_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 [ebp+20],0xAA
- jne next
- push [ebp+8]
- call REG
- push ebx
- mov ebx,0
- mov [ebp+8],ebx
- mov [ebp+20],ebx
- pop ebx
- cmp eax,1
- jne iferr
- mov eax,regok
- mov [ebp+12],eax
- jmp next
- iferr:
- mov eax,err
- mov [ebp+12],eax
- next:
- mov eax,FunAddr
- add eax,5
- jmp eax
- }
- }
- void HookMessageBox()
- {
- unsigned char JmpCode[5];
- int addr2;
- DWORD oldProtect;
- FunAddr=(char *)GetProcAddress(GetModuleHandleA("User32.dll"),"MessageBoxA");
- if (!FunAddr)
- {
- MessageBoxA(0,"error!","",MB_OK);
- ExitProcess(-1);
- }
- JmpCode[0]=0xE9;
- addr2 = (int)MyMessagebox-(int)FunAddr-5;
- *((int*)&JmpCode[1])=addr2;
- VirtualProtect(FunAddr,5,PAGE_EXECUTE_READWRITE,&oldProtect);
- memcpy(FunAddr,JmpCode,5);
- VirtualProtect(FunAddr,5,oldProtect,NULL);
- }
复制代码 |
评分
-
参与人数 15 | HB +20 |
THX +4 |
收起
理由
|
小声点我布隆
| + 1 |
|
[吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩! |
花盗睡鼠
| + 2 |
+ 1 |
[吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守! |
sjtkxy
| + 1 |
+ 1 |
|
虚心学习
| + 1 |
|
[吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意! |
24567
| + 2 |
|
|
Soul1999
| + 1 |
|
|
zxjzzh
| + 2 |
|
[吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少! |
消逝的过去
| + 2 |
|
|
l278785481
| + 1 |
|
|
lies
| + 1 |
|
|
mengzhisuoliu1
| + 1 |
|
|
mengzhisuoliu
| + 1 |
|
|
m0bil3_xT
| + 1 |
|
评分=感恩!简单却充满爱!感谢您的作品! |
Aniz
| |
+ 1 |
学破解论坛1周年了,感谢大家的付出与关注。学破解论坛助你呼风唤雨!!! |
官理猿
| + 3 |
+ 1 |
躲猫猫抓咪咪 |
查看全部评分
|