我的360破解考题答案
直接貼上答案中提供的文檔,如下(別人博客中文章編輯得十分漂亮,各種高亮,但這個對我來說太難了。。):
?
運行“破解考題.exe”后,使用遠程注入工具“RemoteDll.exe”將“patch.dll”注入到進程“破解考題.exe”,之后即可使用“keygen.exe”生成注冊碼進行注冊。
如:
MyNameIsMrWrong
6B707743323168447730652B5A68315639572F74566E75564D3251364F48305432522B6F4441697848334F766749494E5846365249575647363873326A516A756F326B62
MrWrong
45784F625156694C304D70355A68315639572F74566E75564D3251364F48305432522B6F4441697848334F766749494E5846365249575647363873326A516A756F326B62
代碼開發(fā)環(huán)境:win7 x64 sp1
程序不完全分析如下:1.首先脫掉壓縮殼便于分析。
2.脫殼后分析發(fā)現(xiàn),有如下代碼:
if ( CreateMutexW(0, 0, Name) )
{
if ( GetLastError() == 0xB7 )
{
CreateThread(0, 0, sub_401BC0, 0, 0, 0); //創(chuàng)建線程,線程內(nèi)還會創(chuàng)建線程,解密用于校驗的部分代碼,
}
else //是第一個實例,則以調(diào)試方式運行自己的副本
{
Filename = 0;
memset(&v10, 0, 0x206u);
memset(&StartupInfo.lpReserved, 0, 0x40u);
StartupInfo.cb = 68;
GetModuleFileNameW(0, &Filename, 0x208u);
if ( CreateProcessW(&Filename, 0, 0, 0, 0, 1u, 0, 0, &StartupInfo, &ProcessInformation) )
{
DebugEvent.dwDebugEventCode = 0;
memset(&DebugEvent.dwProcessId, 0, 0x5Cu);
while ( WaitForDebugEvent(&DebugEvent, 0xFFFFFFFF) )
{
if ( DebugEvent.dwDebugEventCode == 8 ) //單步調(diào)試副本,直到副本output一個DebugString
break;
ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, 0x10002u);
}
DebugSetProcessKillOnExit(0);
DebugActiveProcessStop(ProcessInformation.dwProcessId);
ExitProcess(0);
}
}
}
3.用于校驗的部分代碼是通過文件的crc32校驗以及哈希值加密的,如果改變文件則無法正確解密。正確解密后通過與地址00541702處 call VirtualProtect,修改此段動態(tài)申請內(nèi)存為PAGE_EXECUTE_READWRITE
權限。我并不打算在這之前修改程序中的任何數(shù)據(jù),所以這一塊東西并不擔心,就此打住。
4.解密出來的這部分代碼分析(注冊碼校驗過程):
(1)注冊碼全是數(shù)字,兩兩組合后為一段字符串,記為”A“,對A進行base64解密(base64解密函數(shù)為相對于這塊動態(tài)申請的內(nèi)存偏移為0x1000,記為sub_off_1000),base64解密后,得到的數(shù)據(jù)記為”B“。
(2)”B”將通過函數(shù)sub_off_1A90解密得到"C",內(nèi)部固定使用秘鑰"lingdux_keygen",是512位的加解密方式,但此解密函數(shù)我未弄明白是什么算法,僅懷疑是AES512,(固不下鉤子的注冊機無法給出)。
(3)計算Username字符串的MD5值,記為“D”。
(4)對于“C”,需滿足如下關系。
C[0] == D[0];
C[1] == D[2];
C[2] == D[4];
C[3] == D[6];
C[5] == D[8];
C[6] == D[10];
C[7] == D[12];
C[8] == D[14];
(5)使用函數(shù)sub_off_1DD0+秘鑰“l(fā)ingdux”,解密一串二進制(為弄明白的二進制串,記為”Q“),得到固定字符串:”Success“,由于sub_off_1A90函數(shù)未弄明白,寫出注冊機的想法心灰意冷,并且上班工作繁忙,這里就不管他了。
但是這個"Q"肯定是由”C“的后面部分變形而來。
(6)計算字符串”Success“的MD5值,得到二進制序列: 505a83f220c02df2f85c3810cd9ceb38,并與程序中存儲的二進制序列比較。如果不是則功虧一簣。
注冊機無法做出,就將沒弄明白的地方HOOK住,變成已知的。
如下:
int __stdcall hook_off_1a90(void)
{
BYTE* p; //[in] & [out]
_asm
{
mov p, ecx
}
//做注冊機時,可對p中的數(shù)據(jù)進行加密,我沒有進行加密了,直接原封不動。
// some_encrypt(p,64);
return 1;
}
還有一處hook,是為了hook_off_1a90的時機,即在即將調(diào)用上文中”校驗的部分代碼“時。
00401A20 ; DWORD __stdcall sub_401A20(LPVOID lpThreadParameter)
00401A20 lpThreadParameter= dword ptr 4
00401A20
00401A20 push offset dword_5B40A8
00401A25 call dword_5B40A0 //此處下刀
00401A2B add esp, 4
00401A2E xor eax, eax
00401A30 retn 4
00401A30 StartAddress endp
鉤子源碼部分如下:
int __stdcall hook_5b40a0(int np)
{
_asm
{
pushad
pushfd
}
static BOOL patched = FALSE;
if(!patched)
{
patched = TRUE;
DWORD addr = (DWORD)g_5b40a0 - 0x1F20 + 0x2167 + 1;
DWORD call_offset = (DWORD)hook_off_1a90 - addr - 4;
*(DWORD*)addr = call_offset; //hooked hook_off_1a90
}
_asm
{
popfd
popad
}
int ret = g_5b40a0(np);
return ret;
}
其它部分和原注冊算法一致,僅在未知之處略施手段,變未知為已知。
時間有限,遠程注入工具則使用一款經(jīng)典的工具”RemoteDll.exe“。
學海無涯,失誤之處敬請諒解。
by:MrWrong 郵箱:rongguozhen@foxmail.com 20140428
?
文件:?http://files.cnblogs.com/MrWrong/360.rar
?
轉載于:https://www.cnblogs.com/MrWrong/p/3734638.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的我的360破解考题答案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c/c++文件相关
- 下一篇: LESS-Middleware:Node