【文章标题】: 第一个-手机游戏爆破
【文章作者】: wangdell
【软件名称】: TextTwist.exe
【下载地址】: 自己搜索下载
【编写语言】: arm
【使用工具】: IDA WM6SDK UE
【操作平台】: wince
--------------------------------------------------------------------------------
【详细过程】
老婆手机中很多小游戏,都需要注册。一直想看看wince到底是怎么回事。弄了两天,终于搞懂一些。刚开始看指令,
好象不太难,以为很简单,但里面是非明码比较,无法追码,算法看了半天也没看懂,可能是用了什么现成的算法库。
有时间再细研究吧,手机游戏的处女破,就不和她缠绵了,先爆破一下。hiahia.
1、准备
1.1IDA 打开Texttwister.exe。静态分析。
1.2开Activesync。文件=>连接设置 中 选择DMA。
1.3开启WM6SDK带的设仿真器管理器,选Pocket pc 20003 SE仿真程序,右键“连接”。
1.4选Pocket pc 20003 SE仿真程序,右键“插入底座”。等待activysync和仿真器连接和同步。
1.5真机中试运行,在程序底部tools->register菜单中,可进入注册对话框,提示输入用户名和密码。
2、调试
在IDA的imports中浏览api,看到DialogBoxIndirectParamW.按x查调用处,并在其上尝试设断。最终找到
.text:00015B28 MOV R3, #0
.text:00015B2C MOV R1, R0 ; hDialogTemplate
.text:00015B30 STR R3, [SP,#0x29C+dwInitParam]
.text:00015B34 LDR R3, =regdlgporc ; lpDialogFunc
.text:00015B38 MOV R2, R6 ; hWndParent
.text:00015B3C LDR R0, [R4] ; hInstance
.text:00015B40 BL DialogBoxIndirectParamW
为注册对话框调用处。
进入regdlgproc中看到
.text:00015988 SUB SP, SP, #0x35C
.text:0001598C MOV R3, #WM_INITDIALOG
.text:00015990 MOV R4, R0
.text:00015994 CMP R1, R3
.text:00015998 BEQ loc_15A18
.text:0001599C MOVL R3, WM_COMMAND
.text:000159A4 CMP R1, R3
.text:000159A8 BNE loc_159C4
.text:000159AC MOV R3, R2,LSL#16
.text:000159B0 MOV R5, R3,LSR#16
.text:000159B4CMP R5, #1
.text:000159B8 BEQ loc_159CC
.text:000159BC CMP R5, #2
.text:000159C0 BEQ loc_159CC
.text:000159C4
.text:000159C4 loc_159C4 ; CODE XREF: regdlgporc+24j
.text:000159C4 MOV R0, #0
.text:000159C8 B loc_15AA8
.text:000159CC ; ---------------------------------------------------------------------------
.text:000159CC
.text:000159CC loc_159CC ; CODE XREF: regdlgporc+34j
.text:000159CC ; regdlgporc+3Cj
.text:000159CC LDR R2, =name ; lpString
.text:000159D0 MOV R3, #0x64 ; 'd' ; nMaxCount
.text:000159D4 MOV R1, #0x65 ; 'e' ; nIDDlgItem
.text:000159D8 MOV R0, R4 ; hDlg
.text:000159DC BL GetDlgItemTextW
.text:000159E0 LDR R2, =code ; lpString
.text:000159E4 MOV R3, #0x64 ; 'd' ; nMaxCount
.text:000159E8 MOV R1, #0x66 ; 'f' ; nIDDlgItem
.text:000159EC MOV R0, R4 ; hDlg
.text:000159F0 BL GetDlgItemTextW
.text:000159F4 MOV R1, R5 ; nResult
.text:000159F8 MOV R0, R4 ; hDlg
.text:000159FC BL EndDialog
.text:00015A00 MOV R1, #1 ; st
.text:00015A04 MOV R0, R4 ; hwnd
.text:00015A08 BL SHSipPreference
.text:00015A0C B loc_15AA4
用ida的grahview较易看出,其根据消息是#WM_INITDIALOG或WM_COMMAND分别处理。
在其中的两个GetDlgItemTextW分别是获得name和code处。
在相应位置设断。
f9运行,ida提示与移动设备连接,并提示需下载到移动设备中,确定后,程序开始运行,中断后,单步跟踪来到
.text:00015B78 MOV R3, R0,LSL#16
.text:00015B7C MOVS R5, R3,ASR#16
.text:00015B80 NOP
.text:00015B84 MOV R1, #1
.text:00015B88 MOV R0, R7
.text:00015B8C BL codecpy
.text:00015B90 B loc_15BB4
.text:00015B94 ; ---------------------------------------------------------------------------
.text:00015B94 MOVL R3, 0xFFFFFFEA
.text:00015B98 CMP R5, R3
.text:00015B9C BNE loc_15BB0
.text:00015BA0 MOVL R0, 0x1B6C
.text:00015BA8 BL sub_155D0
.text:00015BAC B loc_15BB4
.text:00015BB0 ; ---------------------------------------------------------------------------
.text:00015BB0
.text:00015BB0 loc_15BB0 ; CODE XREF: sub_15AB8+E4j
.text:00015BB0 BL sub_15F8C
.text:00015BB4
.text:00015BB4 loc_15BB4 ; CODE XREF: sub_15AB8+D8j
.text:00015BB4 ; sub_15AB8+F4j
.text:00015BB4 CMP R5, #0
.text:00015BB8 BNE loc_15B04
.text:00015BBC BL sub_1876C
.text:00015BC0
.text:00015BC0 loc_15BC0 ; CODE XREF: sub_15AB8+98j
.text:00015BC0 MOV R0, #0
.text:00015BC4
.text:00015BC4 loc_15BC4 ; CODE XREF: sub_15AB8+40j
.text:00015BC4 ADD SP, SP, #0x288
.text:00015BC8 LDMFD SP!, {R4-R7,PC}
00015BB4处是关键比较,如不等,则跳回再次调用注册对话框。
向上翻
.text:00015B40 BL DialogBoxIndirectParamW
.text:00015B44 MOV R3, R0,LSL#16
.text:00015B48 MOV R3, R3,ASR#16
.text:00015B4CCMP R3, #1
.text:00015B50 BNE loc_15BC0
.text:00015B54 CMP R7, #0
.text:00015B58 BEQ loc_15B70
.text:00015B5C MOV R0, R7
.text:00015B60 BL codecheck_0
看到15b60处,应为关键函数 跟进codecheck_0函数。
.text:0001A6A8 codecheck_0 ; CODE XREF: sub_15AB8+A8p
.text:0001A6A8 ; sub_19B38+14p ...
.text:0001A6A8
.text:0001A6A8 name1 = -0x30C
.text:0001A6A8 var_28C = -0x28C
.text:0001A6A8 name = -0x288
.text:0001A6A8
.text:0001A6A8 STMFD SP!, {R4,LR}
.text:0001A6AC SUB SP, SP, #0x304
.text:0001A6B0 MOV R4, R0
.text:0001A6B4 MOV R3, #0x284
.text:0001A6B8 ADD R0, SP, #0x30C+var_28C
.text:0001A6BC STR R3, [SP,#0x30C+var_28C]
.text:0001A6C0 BL regkey
.text:0001A6C4 ADD R1, SP, #0x30C+name ; wchar_t *
.text:0001A6C8 ADD R0, SP, #0x30C+name1 ; wchar_t *
.text:0001A6CC BL wcscpy
.text:0001A6D0 MOV R2, #1
.text:0001A6D4 ADD R1, SP, #0x30C+name1
.text:0001A6D8 MOV R0, R4
.text:0001A6DC BL codecheck
.text:0001A6E0 ADD SP, SP, #0x304
.text:0001A6E4 LDMFD SP!, {R4,PC}
看到1a6dc处为关键函数。
这里爆破吧,更改
.text:0001A6DC 4A FD FF EB BL codecheck
为
.text:0001A6DC 00 00 A0 E3 MOV R0, #0
重新运行,任意即可注册成功。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2009年03月14日 1:13:24
【文章标题】: 第二个-手机游戏追码
【文章作者】: wangdell
【软件名称】: 美女麻将.exe
【软件大小】: 421K
【下载地址】: 自己搜索下载
【保护方式】: 无
【编写语言】: MFC?
【使用工具】: IDA ActiveSync WM6SDK
【操作平台】: Wince
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
又看了一个手机游戏,这个比较简单,内存中明码比较,适合我等新手。
1.准备
准备方法与上一篇相同。
1.1IDA 打开"美女麻将.exe"。静态分析。
1.2开Activesync。文件=>连接设置 中 选择DMA。
1.3开启WM6SDK带的设仿真器管理器,选Pocket pc 20003 SE仿真程序,右键“连接”。
1.4选Pocket pc 20003 SE仿真程序,右键“插入底座”。等待activysync和仿真器连接和同步。
1.5真机中试运行,注意到程序启动有提示注册,时间限制为14天。进入注册对话框后,输入假码,会弹出messagebox,
提示错误。
2.分析
在IDA中imports中浏览api,看到几个可疑函数
.idata:0002B0A4 ; int __stdcall lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
.idata:0002B0A4 IMPORT __imp_lstrcmpiW ; DATA XREF: .text:off_28F70o
.idata:0002B258 ; __declspec(dllimport) int __cdecl AfxMessageBox(unsigned int, unsigned int, unsigned int)
.idata:0002B258 IMPORT __imp__AfxMessageBox__YAHIII_Z
.idata:0002B034 ; int __stdcall MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
.idata:0002B034 IMPORT __imp_MessageBoxW ; DATA XREF: .text:off_28E20o
按x,在相关调用处翻找代码。发现下面的可以代码:
.text:00027FA0 LDR R1, =a105d088a0595 ; lpString2
.text:00027FA4 ADD R0, SP, #0x32C+String1 ; lpString1
.text:00027FA8 BL lstrcmpiW
.text:00027FAC CMP R0, #0
.text:00027FB0 BNE loc_28008
.text:00027FB4 MOV R0, #0xE1
.text:00027FB8 BL sub_11374
.text:00027FBC MOV R1, R0 ; lpFormat
.text:00027FC0 ADD R2, SP, #0x32C+String1
.text:00027FC4 ADD R0, SP, #0x32C+Buffer ; lpBuffer
.text:00027FC8 BL wsprintfW
.text:00027FCC MOV R1, #0x810
.text:00027FD0 ADD R2, SP, #0x32C+Buffer
.text:00027FD4 ORR R1, R1, #6
.text:00027FD8 MOV R0, R5
.text:00027FDC BL _SetDlgItemText_CWnd__QAAXHPBG_Z ; CWnd::SetDlgItemText(int,ushort const *)
.text:00027FE0 MOVL R1, 0x814
.text:00027FE8 MOV R0, R5
.text:00027FEC BL _GetDlgItem_CWnd__QBAPAV1_H_Z ; CWnd::GetDlgItem(int)
.text:00027FF0 MOV R1, #0
.text:00027FF4 BL _ShowWindow_CWnd__QAAHH_Z ; CWnd::ShowWindow(int)
.text:00027FF8 ADD R0, SP, #0x32C+var_28C
.text:00027FFC BL __1CDialog_tbc__UAA_XZ ; CDialog_tbc::~CDialog_tbc(void)
.text:00028000 ADD SP, SP, #0x320
.text:00028004 LDMFD SP!, {R4,R5,PC}
.text:00028008 ; ---------------------------------------------------------------------------
.text:00028008
.text:00028008 loc_28008 ; CODE XREF: sub_27F4C+64j
.text:00028008 MOVL R2, 0xFFFFFFFF ; unsigned int
.text:0002800C MOV R1, #0 ; unsigned int
.text:00028010 MOV R0, #0xE2 ; unsigned int
.text:00028014 BL _AfxMessageBox__YAHIII_Z ; AfxMessageBox(uint,uint,uint)
注意到此处有用到strcmp和AfxMessageBox这两个函数。
在00027FA0代码中的=a105d088a0595处双击跟随来到
.data:0002B340 a105d088a0595 unicode 0, <105D-088A-0595>,0 ; DATA XREF: .text:lpString2o
这里就是真码"105D-088A-0595"
在真机中输入这个注册码后,注册成功。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2009年03月14日 16:25:52
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
上传的附件: