目标程序: IntumiCal V 1。0126
下载页面: http://www.intumi.com/downloads/IntumiCal_10_126.zip
软件语言: 英文
软件类别: 国外软件 / 共享版 / 系统其它
应用平台: PocketPC
软件介绍: IntumiCal is a replacement for the built-in Pocket PC calendar.
We found Pocket Outlook's user interface too clumsy, and other alternatives try to be everything to everybody. There was just nothing as simple and elegant as the Palm calendar available for the Pocket PC, so we sat down to create a no-nonsense, easy to use, and nice looking calendar.
IntumiCal's powerful, yet easily accessible user interface has been deliberately and carefully designed to make day-to-day calendaring tasks a breeze. And of course, IntumiCal is fully compatible with ActiveSync and Outlook.
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教
【调试环境】:WinXP、IDA pro 4.8 Microsoft eMbedded Visual C++ 4.0、Microsoft eMbedded Visual C++ 4.0 Service Pack 4 、 Pocket PC 2003 SDK、Windows Mobile 2003 Second Edition 模拟器包 for Pocket PC
还有Visual Studio 2005(不是必须)、010editor 、Charmed。
―――――――――――――――――――――――――――――――――
【分析过程】:
1、搭建调试环境与基本介绍
http://www.csdn.net/subject/WMDevTools/
上面写得很清楚,就按照Windows Mobile 2003 Second Edition的开发环境搭建就行了。
如果有条件就直接装vs2005调试起来更方便.
顺便到网上找一下arm的汇编指令解释。
2、沐浴
3、斋戒
4、祭天
5、做法、请出IDA pro反编译一下.
6、诵经。
7、IDA分析完毕后查看字符串信息
aMicrosoftBaseC unicode 0, <Microsoft Base Cryptographic Provider v1.0>,0
.data:00057A00 ; DATA XREF: .text:szProvidero
应该差不多就是与注册算法相关的信息了。
往上溯
.text:00030698 ; LPCWSTR szProvider
.text:00030698 szProvider DCD aMicrosoftBaseC ; DATA XREF: sub_30570+14r
.text:00030698 ; "Microsoft Base Cryptographic Provider v"...
继续往上溯
.text:00030570 sub_30570 ; CODE XREF: sub_30FB0+64p
.text:00030570
.text:00030570 pbData = -0x2C
.text:00030570 pdwDataLen = -0x28
.text:00030570 dwBufLen = -0x24
.text:00030570 var_20 = -0x20
.text:00030570 hProv = -0x1C
.text:00030570
.text:00030570 STMFD SP!, {R4-R8,LR}
.text:00030574 SUB SP, SP, #0x14 ; pbData
.text:00030578 MOV R4, R0
.text:0003057C MOV R5, R1
.text:00030580 MOV R7, R2
.text:00030584 LDR R2, =aMicrosoftBaseC ; szProvider //指向刚才那个字符串
.text:00030588 MOV R0, #0xF0000000
.text:0003058C STR R0, [SP,#0x2C+pbData]
.text:00030590 MOV R8, #0
.text:00030594 MOV R3, #1 ; dwProvType
.text:00030598 STR R8, [SP,#0x2C+hProv]
.text:0003059C MOV R1, #0 ; szContainer
.text:000305A0 ADD R0, SP, #0x2C+hProv ; phProv
.text:000305A4 BL CryptAcquireContextW
继续往上溯
这个就是算法call
.text:00030FB0 sub_30FB0 ; CODE XREF: sub_311F4+5Cp
.text:00030FB0 ; sub_312E0+24p
.text:00030FB0
.text:00030FB0 wcstr = -0x124
.text:00030FB0 var_120 = -0x120
.text:00030FB0 var_11C = -0x11C
.text:00030FB0 var_118 = -0x118
.text:00030FB0 var_114 = -0x114
.text:00030FB0 mbstr = -0x10C
.text:00030FB0
.text:00030FB0 STMFD SP!, {R4,R5,LR}
.text:00030FB4 SUB SP, SP, #0x118
.text:00030FB8 MOV R5, R0
.text:00030FBC LDR R1, =aIntumical20051
.text:00030FC0 ADD R0, SP, #0x124+wcstr
.text:00030FC4 BL CString::CString(ushort const *)
.text:00030FC8 MOV R2, #0x100 ; size_t
.text:00030FCC MOV R1, #0 ; int
.text:00030FD0 ADD R0, SP, #0x124+mbstr ; void *
.text:00030FD4 BL memset
.text:00030FD8 LDR R1, [SP,#0x124+wcstr] ; wcstr
.text:00030FDC MOV R2, #0x100 ; count
.text:00030FE0 ADD R0, SP, #0x124+mbstr ; mbstr
.text:00030FE4 BL wcstombs
.text:00030FE8 ADD R0, SP, #0x124+var_120
.text:00030FEC BL sub_30310
.text:00030FF0 LDR R1, [SP,#0x124+var_120] ; wcstr
.text:00030FF4 MOV R3, #8
.text:00030FF8 MOV R2, #8 ; count
.text:00030FFC STR R3, [SP,#0x124+var_118]
.text:00031000 ADD R0, SP, #0x124+var_114 ; mbstr
.text:00031004 BL wcstombs
.text:00031008 ADD R2, SP, #0x124+var_118
.text:0003100C ADD R1, SP, #0x124+var_114
.text:00031010 ADD R0, SP, #0x124+mbstr
.text:00031014 BL sub_30570 //生成注册码
.text:00031018 MOV R4, R0
.text:0003101C MOV R3, #1
.text:00031020 MOV R2, #4
.text:00031024 MOV R1, R4
.text:00031028 ADD R0, SP, #0x124+var_11C
.text:0003102C BL sub_3047C //字符串处理
.text:00031030 MOV R0, R4
.text:00031034 BL operator delete(void *)
.text:00031038 ADD R1, SP, #0x124+var_11C
.text:0003103C MOV R0, R5
.text:00031040 BL CString::CString(CString const &)
.text:00031044 ADD R0, SP, #0x124+var_11C
.text:00031048 BL CString::~CString(void)
.text:0003104C ADD R0, SP, #0x124+var_120
.text:00031050 BL CString::~CString(void)
.text:00031054 ADD R0, SP, #0x124+wcstr
.text:00031058 BL CString::~CString(void)
.text:0003105C MOV R0, R5
.text:00031060 ADD SP, SP, #0x118
.text:00031064 LDMFD SP!, {R4,R5,PC}
/////////////////////////////////////////////////////////////////////////////////////
//到此我们已经找到了算法休息一下
////////////////////////////////////////////////////////////////////////////////////
分析一下sub_30570
.text:00030570 sub_30570 ; CODE XREF: sub_30FB0+64p
.text:00030570
.text:00030570 pbData = -0x2C
.text:00030570 pdwDataLen = -0x28
.text:00030570 dwBufLen = -0x24
.text:00030570 var_20 = -0x20
.text:00030570 hProv = -0x1C
.text:00030570
.text:00030570 STMFD SP!, {R4-R8,LR}
.text:00030574 SUB SP, SP, #0x14 ; pbData
.text:00030578 MOV R4, R0
.text:0003057C MOV R5, R1
.text:00030580 MOV R7, R2
.text:00030584 LDR R2, =aMicrosoftBaseC ; szProvider
.text:00030588 MOV R0, #0xF0000000
.text:0003058C STR R0, [SP,#0x2C+pbData]
.text:00030590 MOV R8, #0
.text:00030594 MOV R3, #1 ; dwProvType
.text:00030598 STR R8, [SP,#0x2C+hProv]
.text:0003059C MOV R1, #0 ; szContainer
.text:000305A0 ADD R0, SP, #0x2C+hProv ; phProv
.text:000305A4 BL CryptAcquireContextW
.text:000305A8 CMP R0, #0
.text:000305AC BEQ GoToDead
.text:000305B0 LDR R0, [SP,#0x2C+hProv]
.text:000305B4 MOV R1, R4
.text:000305B8 BL sub_3069C
.text:000305BC MOVS R6, R0
.text:000305C0 BEQ GoToDead
.text:000305C4 LDR R0, [R7]
.text:000305C8 ADD R1, SP, #0x2C+var_20
.text:000305CC STR R1, [SP,#0x2C+pdwDataLen]
.text:000305D0 MOV R3, #0 ; dwFlags
.text:000305D4 STR R0, [SP,#0x2C+var_20]
.text:000305D8 MOV R2, #1 ; Final
.text:000305DC STR R0, [SP,#0x2C+dwBufLen]
.text:000305E0 MOV R1, #0 ; hHash
.text:000305E4 MOV R0, R6 ; hKey
.text:000305E8 STR R8, [SP,#0x2C+pbData]
.text:000305EC BL CryptEncrypt
.text:000305F0 CMP R0, #0
.text:000305F4 BEQ GoToDead
.text:000305F8 LDR R0, [SP,#0x2C+var_20]
.text:000305FC BL operator new(uint)
.text:00030600 LDR R2, [SP,#0x2C+var_20] ; size_t
.text:00030604 MOV R1, #0 ; int
.text:00030608 MOV R4, R0
.text:0003060C BL memset
.text:00030610 LDR R2, [R7] ; size_t
.text:00030614 MOV R1, R5 ; void *
.text:00030618 MOV R0, R4 ; void *
.text:0003061C BL memcpy
.text:00030620 LDR R0, [R7]
.text:00030624 LDR R3, [SP,#0x2C+var_20]
.text:00030628 MOV R2, #1 ; Final
.text:0003062C STR R0, [SP,#0x2C+var_20]
.text:00030630 ADD R0, SP, #0x2C+var_20
.text:00030634 STR R3, [SP,#0x2C+dwBufLen]
.text:00030638 MOV R1, #0 ; hHash
.text:0003063C STR R0, [SP,#0x2C+pdwDataLen]
.text:00030640 MOV R3, #0 ; dwFlags
.text:00030644 MOV R0, R6 ; hKey
.text:00030648 STR R4, [SP,#0x2C+pbData]
.text:0003064C BL CryptEncrypt
.text:00030650 CMP R0, #0
.text:00030654 BNE loc_3066C
.text:00030658 MOV R0, R4
.text:0003065C BL operator delete(void *)
.text:00030660
.text:00030660 GoToDead ; CODE XREF: sub_30570+3Cj
.text:00030660 ; sub_30570+50j ...
.text:00030660 MOV R0, R8
.text:00030664 ADD SP, SP, #0x14
.text:00030668 LDMFD SP!, {R4-R8,PC}
.text:0003066C ; ---------------------------------------------------------------------------
.text:0003066C
.text:0003066C loc_3066C ; CODE XREF: sub_30570+E4j
.text:0003066C LDR R0, [SP,#0x2C+var_20]
.text:00030670 STR R0, [R7]
.text:00030674 MOV R0, R6 ; hKey
.text:00030678 BL CryptDestroyKey
.text:0003067C LDR R0, [SP,#0x2C+hProv] ; hProv
.text:00030680 CMP R0, #0
.text:00030684 MOVNE R1, #0 ; dwFlags
.text:00030688 BLNE CryptReleaseContext
.text:0003068C MOV R0, R4
.text:00030690 ADD SP, SP, #0x14
.text:00030694 LDMFD SP!, {R4-R8,PC}
.text:00030694 ; End of function sub_30570
DWORD dwProvType = PROV_RSA_FULL;
DWORD dwFlags = 0;
HCRYPTPROV hProv=NULL;
HCRYPTHASH hHash=NULL;
wchar_t szContainer[] = NULL;
wchar_t szProvider[] = L"Microsoft Base Cryptographic Provider v1.0";
if(!CryptAcquireContextW(&hProv,NULL,szProvider,dwProvType,dwFlags))
{
ASSERT(0);
}
ASSERT(hProv);
ALG_ID Algid = CALG_MD5;//0x8003;
////////////////////////////
//BL sub_3069C
if(!CryptCreateHash(hProv,Algid,0,0,&hHash))
{
ASSERT(0);
}
if(!CryptHashData(hHash,szInpuString,nLen,0))
{
ASSERT(0);
}
DWORD dwDataLen = 0x00000010;
BYTE *bData;
//////////////////////////
CryptEncrypt(HCRYPTKEY hKey,0, true, 0,BYTE* pbData,&dwDataLen, DWORD dwBufLen);
bData = new BYTE[dwDataLen];
CryptEncrypt(HCRYPTKEY hKey,0, true, 0,BYTE* pbData,&dwDataLen, DWORD dwBufLen);
注册码就这样出来了
具体数值调试一下就出来了 .text:00031014 BL sub_30570
.text:00031018 MOV R4, R0
.text:0003101C MOV R3, #1
.text:00031020 MOV R2, #4
.text:00031024 MOV R1, R4
.text:00031028 ADD R0, SP, #0x124+var_11C
.text:0003102C BL sub_3047C
.text:00031030 MOV R0, R4
.text:00031034 BL operator delete(void *)
.text:00031038 ADD R1, SP, #0x124+var_11C
.text:0003103C MOV R0, R5
.text:00031040 BL CString::CString(CString const &)
.text:00031044 ADD R0, SP, #0x124+var_11C
.text:00031048 BL CString::~CString(void)
.text:0003104C ADD R0, SP, #0x124+var_120
.text:00031050 BL CString::~CString(void)
.text:00031054 ADD R0, SP, #0x124+wcstr
.text:00031058 BL CString::~CString(void)
.text:0003105C MOV R0, R5
.text:00031060 ADD SP, SP, #0x118
断点设置在00031030,看一下r3寄存器看他偏移0x0c的地方就是注册码的unicode
pediy一下,让他弹出注册码。
.text:00031030 ADD R0, R3, #0xC
.text:00031034 MOV R3, #0 ; uType
.text:00031038 MOV R2, R0 ; lpCaption
.text:0003103C MOV R1, R0 ; lpText
.text:00031040 MOV R0, #0 ; hWnd
.text:00031044 BL MessageBoxW
修改方法
先用lodepe的flc转化一下要修改的地址,用010editor打开,
.text:00031030 0C 00 83 E2 ADD R0, R3, #0xC
第一个字节0c代表要加的数字 第二个字节00的高位表示目的寄存器,第三个字节83中的低位表示源寄存器,第四个字节表示操作符
.text:00031034 00 30 A0 E3 MOV R3, #0 ; uType
.text:00031038 00 20 A0 E1 MOV R2, R0 ; lpCaption
.text:0003103C 00 10 A0 E1 MOV R1, R0 ; lpText
.text:00031040 00 00 A0 E3 MOV R0, #0 ; hWnd
.text:00031044 F1 77 00 EB BL MessageBoxW
到现在还不知道BL的偏移是怎么算的就用Charmed修改一下就行了。Charmed虽说可以直接修改成汇编但是在我的店拿上它的成功是随机的。-_-''郁闷
/////////////////////////////////////////////////////////////////////////////////////////////////
//下面开始写loader
为了开发调试的快一点安装了一下vs2005
记得是ppc的工程
直接开工
STARTUPINFO si;
PROCESS_INFORMATION pi;
wchar_t exe[MAX_PATH],*filepath;
HANDLE hFile;
GetModuleFileName(GetModuleHandle(NULL),exe,MAX_PATH);
filepath = wcsrchr(exe,L'\\');
*filepath =0;
wcscat(exe,L"\\IntumiCal.exe");
DWORD fk;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
byte destcode[] = {0x0C,0x00,0x83,0xE2,//add r0,r3,#0c
0x00,0x30,0xA0,0xE3,//mov r3,#0
0x00,0x20,0xA0,0xE1,//mov r2,r0
0x00,0x10,0xA0,0xE1,//mov r1,r0
0x00,0x00,0xA0,0xE3,//mov r0,#0
0xF1,0x77,0x00,0xEB};//messagebox
// Start the child process.
if(!CreateProcess( exe, // No module name (use command line).
NULL,// Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
CREATE_SUSPENDED, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi )
)
{
DWORD i = GetLastError();
::MessageBox(NULL, TEXT("CreateProcess failed."),TEXT("Error"), MB_OK);
//return 0;
}
else
{
WriteProcessMemory(pi.hProcess,(LPVOID)0x31030,destcode,24,&fk);
ResumeThread(pi.hThread);
}
记住ppc是没有
DWORD GetCurrentDirectory(
DWORD nBufferLength,
LPTSTR lpBuffer
);
好的到此收工,注册机太麻烦。。。主要是懒得再看代码了-_-''用loader就可以了。
---------------------------------------------------------------------------------------------
WiNrOOt
winroot@gmail.com
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)