分析GPU程序流程
定位函数
启动程序
开始执行
线程暂定
选定GPU线程
定位代码
有些情况可能定位不到
可以试着这样找
关键两个函数 CreateRemoteThread / ResumeThread
7C80B6F2 /$ 6A 10 push 0x10
7C80B6F4 |. 68 30B7807C push kernel32.7C80B730
7C80B6F9 |. E8 D86DFFFF call kernel32.7C8024D6
7C80B6FE |. 8365 FC 00 and [local.1],0x0
7C80B702 |. 64:A1 18000000 mov eax,dword ptr fs:[0x18]
7C80B708 |. 8945 E0 mov [local.8],eax
7C80B70B |. 8178 10 001E0000 cmp dword ptr ds:[eax+0x10],0x1E00
7C80B712 |. 75 0F jnz short kernel32.7C80B723
7C80B714 |. 803D 0850887C 00 cmp byte ptr ds:[0x7C885008],0x0
7C80B71B |. 75 06 jnz short kernel32.7C80B723
7C80B71D |. FF15 F812807C call dword ptr ds:[<&ntdll.CsrNewThread>] ; ntdll.CsrNewThread
7C80B723 |> FF75 0C push [arg.2]
7C80B726 |. FF55 08 call [
arg.1] ------->
CreateRemoteThread 调用的线程函数
7C80B729 |. 50 push eax ; /ExitCode
7C80B72A \> E8 C9090000 call kernel32.ExitThread ; \ExitThread
如何定位GPU函数
ds:[01573838]=035B1000 (nvcuda.cuInit)
01573838 035B1000 nvcuda.cuInit
0157383C 00000000
01573840 035B1310 nvcuda.cuDeviceGet
01573844 035B14B0 nvcuda.cuDeviceGetCount
01573848 035B1640 nvcuda.cuDeviceGetName
0157384C 035B17F0 nvcuda.cuDeviceComputeCapability
01573850 035C06E0 nvcuda.cuDeviceTotalMem
01573854 035B1B50 nvcuda.cuDeviceGetProperties
01573858 035B1CF0 nvcuda.cuDeviceGetAttribute
0157385C 035C0880 nvcuda.cuCtxCreate
01573860 035B2390 nvcuda.cuCtxDetach
01573864 035B2D30 nvcuda.cuCtxSynchronize
01573868 035B3840 nvcuda.cuModuleLoadData
0157386C 035B3D50 nvcuda.cuModuleUnload
01573870 035B3EE0 nvcuda.cuModuleGetFunction
01573874 035C0A30 nvcuda.cuModuleGetGlobal
01573878 035B4250 nvcuda.cuModuleGetTexRef
0157387C 035C0D90 nvcuda.cuMemAlloc
01573880 035C1100 nvcuda.cuMemFree
01573884 035C1790 nvcuda.cuMemcpyHtoD
01573888 035C1940 nvcuda.cuMemcpyDtoH
0157388C 035C3640 nvcuda.cuMemsetD8
01573890 035C39A0 nvcuda.cuMemsetD32
01573894 035BC730 nvcuda.cuFuncSetBlockShape
01573898 035C4740 nvcuda.cuTexRefSetAddress
0157389C 035BDD40 nvcuda.cuTexRefSetFormat
015738A0 035BE240 nvcuda.cuTexRefSetFlags
015738A4 035BCA90 nvcuda.cuParamSetSize
015738A8 035BCC30 nvcuda.cuParamSeti
015738AC 035BD660 nvcuda.cuParamSetTexRef
015738B0 035BD2F0 nvcuda.cuLaunchGrid
015738B4 00B60048
找到cuInit()
找到cuModuleLoadData
找cubin
elf格式定位 结尾
__________________________________________________________________________________________________________
01030685 |> \53 push ebx
01030686 |. 8D7E 08 lea edi,dword ptr ds:[esi+0x8]
01030689 |. 57 push edi
0103068A |. FF15 00CE1601 call dword ptr ds:[0x116CE00] ; nvcuda.cuModuleLoadData
01030690 |. 53 push ebx
01030691 |. 85C0 test eax,eax
01030693 |. 74 15 je short AccentOP.010306AA
01030695 |. E8 5A4E0100 call AccentOP.010454F4
0103069A |. 83C4 04 add esp,0x4
0103069D |. B8 2F010000 mov eax,0x12F
cuModuleLoadData
名称
cuModuleLoadData – 载入模块的数据
概要
CUresult cuModuleLoadData(CUmodule* mod,const void*
image);
说明
获得指针image,并将对应模块mod载入当前上下文。指针的获得方法如下:映射一个cubin文件、将cubin文件作为文本字符串传递,或者将一个cubin对象整合到可执行资源之中,并利用WindowsâĂŹ FindResource()等操作系统调用来获取指针。
__________________________________________________________________________________________________________
010306B4 68 ECF90A01 push AccentOP.010AF9EC ; ASCII "kernel_o"
010306B9 51 push ecx
010306BA 8D56 0C lea edx,dword ptr ds:[esi+0xC]
010306BD 52 push edx
010306BE FF15 08CE1601 call dword ptr ds:[0x116CE08] ; nvcuda.cuModuleGetFunction
010306C4 85C0 test eax,eax
010306C6 74 0D je short AccentOP.010306D5
010306D7 |. 68 F8F90A01 push AccentOP.010AF9F8 ; ASCII "
_we7742i"
010306DC |. 50 push eax
010306DD |. 6A 00 push 0x0
010306DF |. 8D4E 14 lea ecx,dword ptr ds:[esi+0x14]
010306E2 |. 51 push ecx
010306E3 |. FF15 0CCE1601 call dword ptr ds:[0x116CE0C] ;
cuModuleGetGlobal 05400000
010306E9 |. 85C0 test eax,eax
010306EB |. 74 0D je short AccentOP.010306FA
010306ED |> B8 39010000 mov eax,0x139
010306F2 |. 5F pop edi
010306F3 |. 5B pop ebx
010306F4 |. 8BE5 mov esp,ebp
010306F6 |. 5D pop ebp
010306F7 |. C2 0400 retn 0x4
010306FA |> 8B17 mov edx,dword ptr ds:[edi]
010306FC |. 68 04FA0A01 push AccentOP.010AFA04 ; ASCII "
_we7742x"
01030701 |. 52 push edx
01030702 |. 6A 00 push 0x0
01030704 |. 8D46 18 lea eax,dword ptr ds:[esi+0x18]
01030707 |. 50 push eax
01030708 |. FF15 0CCE1601 call dword ptr ds:[0x116CE0C] ; nvcuda.
cuModuleGetGlobal 054000004
0103070E |. 85C0 test eax,eax
01030710 |.^ 75 DB jnz short AccentOP.010306ED
01030712 |. 8B4E 1C mov ecx,dword ptr ds:[esi+0x1C]
01030715 |. C1E1 07 shl ecx,0x7
01030718 |. 51 push ecx
01030719 |. 8D56 10 lea edx,dword ptr ds:[esi+0x10]
0103071C |. 52 push edx
0103071D |. FF15 14CE1601 call dword ptr ds:[0x116CE14] ; nvcuda.
cuMemAlloc 05500000
01030723 |. 85C0 test eax,eax ;
cuModuleGetFunction
名称
cuModuleGetFunction – 返回函数句柄
概要
CUresult cuModuleGetFunction(CUfunction* func,CUmodule mod,const char* funcname);
说明
以*func的形式返回位于模块mod中名为funcname的函数的句柄。如果不存在具有此名称的函数,cuModuleGetFunction()将返回CUDA_ERROR_NOT_FOUND。
__________________________________________________________________________________________________________
010306D7 68 F8F90A01 push AccentOP.010AF9F8 ; ASCII "_we7742i"
010306DC 50 push eax
010306DD 6A 00 push 0x0
010306DF 8D4E 14 lea ecx,dword ptr ds:[esi+0x14]
010306E2 51 push ecx
010306E3 FF15 0CCE1601 call dword ptr ds:[0x116CE0C] ; nvcuda.cuModuleGetGlobal
010306E9 85C0 test eax,eax
010306EB 74 0D je short AccentOP.010306FA
010306FA 8B17 mov edx,dword ptr ds:[edi]
010306FC 68 04FA0A01 push AccentOP.010AFA04 ; ASCII "_we7742x"
01030701 52 push edx
01030702 6A 00 push 0x0
01030704 8D46 18 lea eax,dword ptr ds:[esi+0x18]
01030707 50 push eax
01030708 FF15 0CCE1601 call dword ptr ds:[0x116CE0C] ; nvcuda.cuModuleGetGlobal
0103070E 85C0 test eax,eax
01030710 ^ 75 DB jnz short AccentOP.010306ED
cuModuleGetGlobal
名称
cuModuleGetGlobal – 从模块返回一个全局指针
概要
CUresult cuModuleGetGlobal(CUdeviceptr* devPtr,unsigned int* bytes,CUmodule mod,const char* globalname);
说明
分别以*devPtr和*bytes的形式返回模块mod中名称为globalname的全局变量的基址指针和大小。如果不存在具有此名称的变量,则cuModuleGetGlobal()将返回CUDA_ERROR_NOT_FOUND。参数devPtr和bytes都是可选的。如果其中任一参数的值为空,则该参数将被忽略。
__________________________________________________________________________________________________________
01030712 8B4E 1C mov ecx,dword ptr ds:[esi+0x1C]
01030715 C1E1 07 shl ecx,0x7
01030718 51 push ecx
01030719 8D56 10 lea edx,dword ptr ds:[esi+0x10]
0103071C 52 push edx
0103071D FF15 14CE1601 call dword ptr ds:[0x116CE14] ; nvcuda.cuMemAlloc
01030723 85C0 test eax,eax
01030725 74 0D je short AccentOP.01030734
cuMemAlloc
名称
cuMemAlloc – 分配设备存储器
概要
CUresult cuMemAlloc(CUdeviceptr* devPtr,unsigned int count);
说明
向设备分配count字节的线性存储器,并以*devPtr的形式返回指向已分配存储器的指针。已分配的存储器可与任何类型的变量对齐。存储器不会被清除。如果count为0,cuMemAlloc()将返回CUDA_ERROR_INVALID_VALUE。
0341FA30 00B5D8A8
0341FA34
00120000
__________________________________________________________________________________________________________
关键过程开始
0103064D |. /EB 1B jmp short AccentOP.0103066A
0103064F |> |83F8 14 cmp eax,0x14
01030652 |. |72 0C jb short AccentOP.01030660
01030654 |. |8D5424 10 lea edx,dword ptr ss:[esp+0x10]
01030658 |. |52 push edx
01030659 |. |B9 48C60F01 mov ecx,AccentOP.010FC648
0103065E |. |EB 0A jmp short AccentOP.0103066A
01030660 |> |8D4424 10 lea eax,dword ptr ss:[esp+0x10]
01030664 |. |50 push eax
01030665 |. |B9 687B0F01 mov ecx,AccentOP.010F7B68
0103066A |> \E8 31BA0000 call AccentOP.0103C0A0 ; copyCubin
0103066F |. 8BD8 mov ebx,eax
01030671 |. 83C4 08 add esp,0x8
01030674 |. 85DB test ebx,ebx
01030676 |. 75 0D jnz short AccentOP.01030685
01030678 |. B8 83000000 mov eax,0x83
0103067D |. 5F pop edi
0103067E |. 5B pop ebx
0103067F |. 8BE5 mov esp,ebp
01030681 |. 5D pop ebp
01030682 |. C2 0400 retn 0x4
01030685 |> 53 push ebx ;<------------------cubin
01030686 |. 8D7E 08 lea edi,dword ptr ds:[esi+0x8]
01030689 |. 57 push edi
0103068A |. FF15 00CE1601 call dword ptr ds:[0x116CE00] ; nvcuda.cuModuleLoadData
01030690 |. 53 push ebx
01030691 |. 85C0 test eax,eax
01030693 |. 74 15 je short AccentOP.010306AA
准备数据
start
__________________________________________________________________________________________________________
01030770 /$ 83EC 08 sub esp,0x8
01030773 |. 8B4E 28 mov ecx,dword ptr ds:[esi+0x28]
01030776 |. 8B56 10 mov edx,dword ptr ds:[esi+0x10]
01030779 |. 55 push ebp
0103077A |. 57 push edi
0103077B |. 8B7E 24 mov edi,dword ptr ds:[esi+0x24]
0103077E |. 8BC7 mov eax,edi
01030780 |. 6BC0 33 imul eax,eax,0x33
01030783 |. C1F8 08 sar eax,0x8
01030786 |. 894424 0C mov dword ptr ss:[esp+0xC],eax
0103078A |. 8B46 1C mov eax,dword ptr ds:[esi+0x1C]
0103078D |. C1E0 07 shl eax,0x7
01030790 |. 50 push eax
01030791 |. 51 push ecx
01030792 |. 52 push edx
01030793 |. 33ED xor ebp,ebp
01030795 |. 897C24 14 mov dword ptr ss:[esp+0x14],edi
01030799 |. FF15 1CCE1601 call dword ptr ds:[0x116CE1C] ; nvcuda.cuMemcpyHtoD
0103079F |. 85C0 test eax,eax
010307A1 |. 74 0D je short AccentOP.010307B0
cuMemcpyHtoD
名称
cuMemcpyHtoD – 将存储器从主机复制到设备
概要
CUresult cuMemcpyHtoD(CUdeviceptr
dstDevPtr,const void *srcHostPtr,unsigned
int count);
CUresult cuMemcpyHtoDAsync(CUdeviceptr dstDevPtr,const void *srcHostPtr,unsigned int count,CUstream stream);
说明
从主机存储器复制到设备存储器。dstDevPtr和srcHostPtr分别指定目标和源的基址。Count指定要复制的字节数。
cuMemcpyHtoDAsync()是异步的,可通过传递一个非零的stream参数将其关联到一个流。它仅对分页锁定的主存储器有效,如果传入指向可分页存储器的指针,那么将返回一个错误。
03CCF934
05500000
03CCF938 05390020
03CCF93C
00120000
长度:0x00120000
需要准备数据
05390000 50 00 B5 00 00 00 36 02 00 00 00 00 00 00 00 00 P.?..6........
05390010 00 10 12 00 00 10 12 00 00 10 00 00 00 0B 00 00 ........
..
05390020
B9C88DE6 鎹裙
05390024
C11CC4D0 心
05390028
466E1890 ?nF
0539002C
175DD57F 誡 文件中读取的salt 0x10
05390030 50004100 .A.P unicode 格式密码字符
05390034
80000000 ...€
05390038 00000000 ....
0539003C 00000000 ....
05390040 00000000 ....
05390044 00000000 ....
05390048 00000000 ....
0539004C 00000000 ....
05390050 00000000 ....
05390054 00000000 ....
05390058 00000000 ....
0539005C 000000
A0 ?..
05390060 00000000 ....
05390064 00000000 ....
05390068 00000000 ....
0539006C 00000000 ....
05390070 00000000 ....
05390074 00000000 ....
05390078 00000000 ....
0539007C 00000000 ....
05390080 00000000 ....
05390084 00000000 ....
05390088 00000000 ....
0539008C 00000000 ....
05390090 00000000 ....
05390094 00000000 ....
05390098 00000000 ....
0539009C 00000000 ....
053900A0 B9C88DE6 鎹裙
053900A4 C11CC4D0 心
053900A8 466E1890 ?nF
053900AC 175DD57F 誡
053900B0 50004200 .B.P
053900B4 80000000 ...€
053900B8 00000000 ....
053900BC 00000000 ....
053900C0 00000000 ....
053900C4 00000000 ....
053900C8 00000000 ....
053900CC 00000000 ....
053900D0 00000000 ....
053900D4 00000000 ....
053900D8 00000000 ....
053900DC 000000A0 ?..
053900E0 00000000 ....
053900E4 00000000 ....
053900E8 00000000 ....
053900EC 00000000 ....
053900F0 00000000 ....
053900F4 00000000 ....
053900F8 00000000 ....
053900FC 00000000 ....
05390100 00000000 ....
05390104 00000000 ....
05390108 00000000 ....
0539010C 00000000 ....
05390110 00000000 ....
05390114 00000000 ....
05390118 00000000 ....
0539011C 00000000 ....
05390020 E6 8D C8 B9 D0 C4 1C C1 90 18 6E 46 7F D5 5D 17 鎹裙心翋nF誡
05390030 00 41 00 50 00 00 00 80 00 00 00 00 00 00 00 00 .A.P...€........
05390040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
05390050 00 00 00 00 00 00 00 00 00 00 00 00 A0 00 00 00 ............?..
05390060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
05390070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
05390080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
05390090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
053900A0 E6 8D C8 B9 D0 C4 1C C1 90 18 6E 46 7F D5 5D 17 鎹裙心翋nF誡
053900B0 00 42 00 50 00 00 00 80 00 00 00 00 00 00 00 00 .B.P...€........
053900C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
053900D0 00 00 00 00 00 00 00 00 00 00 00 00 A0 00 00 00 ............?..
053900E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
053900F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
05390100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
05390110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
数据源头
01030C61 > \8B97 58030000 mov edx,dword ptr ds:[edi+0x358]
01030C67 . C787 48030000>mov dword ptr ds:[edi+0x348],0x4
01030C71 > 5B pop ebx
01030C72 . 8997 40030000 mov dword ptr ds:[edi+0x340],edx
01030C78 . C787 44030000>mov dword ptr ds:[edi+0x344],0x0
01030C82 . 897D 00 mov dword ptr ss:[ebp],edi
01030C85 . 5F pop edi
01030C86 . 5E pop esi
01030C87 . 33C0 xor eax,eax
01030C89 . 5D pop ebp
01030C8A . C3 retn
00B5F7E0 00000080 .
00B5F7E4 0000C350 썐.
00B5F7E8 00000000 ..
00B5F7EC 000007D7 ߗ.
00B5F7F0 05060020 Ԇ
00B5F7F4 00002400 ␀.
00B5F7F8 00002400 ␀.
00B5F7FC 00000002 .
00B5F800 02E383F8 菸ˣ
00B5F804 00000000 ..
00B5F808 04E66798 枘Ӧ
00B5F80C 04E66B98 殘Ӧ
00B5F810 05500000 .Ր
00B5F814 05400000 .Հ
00B5F818 05400004 Հ
00B5F81C 00002400 ␀.
00B5F820 000000B2 ².
00B5F824 00000164 Ť.
00B5F828 05060020 Ԇ
00B5F82C 00000040 @.
00B5F830 0071000A .q
00B5F834 000C016F ů.
00B5F838 00620061 ab
00B5F83C 00640063 cd
00B5F840 00660065 ef
00B5F844 00680067 gh
00B5F848 006A0069 ij
00B5F84C 006C006B kl
00B5F850 006E006D mn
00B5F854 0070006F op
00B5F858 00720071 qr
00B5F85C 00740073 st
00B5F860 00760075 uv
00B5F864 00780077 wx
00B5F868 007A0079 yz
00B5F86C 00730000 .s
00B5F870 0072002E .r
00B5F874 006C0075 ul
00B5F878 002F0020 /
00B5F87C 003A0064 d:
00B5F880 000A000A ..
00B5F884 000C0179 Ź.
00B5F888 00620061 ab
00B5F88C 00640063 cd
00B5F890 00660065 ef
00B5F894 00680067 gh
00B5F898 006A0069 ij
00B5F89C 006C006B kl
00B5F8A0 006E006D mn
00B5F8A4 0070006F op
00B5F8A8 00720071 qr
00B5F8AC 00740073 st
00B5F8B0 00760075 uv
00B5F8B4 00780077 wx
00B5F8B8 007A0079 yz
00B5F8BC 000D0000 ..
00B5F8C0 002F000A ./
00B5F8C4 003A0061 a:
00B5F8C8 00200072 r
00B5F8CC 0072002F /r
00B5F8D0 000A000E .
00B5F8D4 00610032 2a
00B5F8D8 00B501E8 Ǩµ
00B5F8DC 00B501E8 Ǩµ
00B5F8E0 006C0075 ul
00B5F8E4 002F0020 /
00B5F8E8 003A0064 d:
00B5F8EC 006D002A *m
00B5F8F0 00640065 ed
00B5F8F4 00750069 iu
00B5F8F8 005F006D m_
00B5F8FC 006E0065 en
00B5F900 0064002E .d
00B5F904 00630069 ic
00B5F908 002F0020 /
00B5F90C 003A0064 d:
00B5F910 0073002A *s
00B5F914 0061006D ma
00B5F918 006C006C ll
00B5F91C 0065005F _e
00B5F920 002E006E n.
00B5F924 00690064 di
00B5F928 000D0063 c.
00B5F92C 0000000A ..
00B5F930 00000000 ..
00B5F934 00000000 ..
00B5F938 00000000 ..
00B5F93C 00000000 ..
00B5F940 000E0009 .
00B5F944 000C0141 Ł.
010307B0 |> \8B4E 14 mov ecx,dword ptr ds:[esi+0x14]
010307B3 |. 6A 04 push 0x4
010307B5 |. 8D4424 18 lea eax,dword ptr ss:[esp+0x18]
010307B9 |. 50 push eax
010307BA |. 51 push ecx
010307BB |. FF15 1CCE1601 call dword ptr ds:[0x116CE1C] ; nvcuda.cuMemcpyHtoD
010307C1 |. 85C0 test eax,eax
010307C3 |.^ 75 DE jnz short AccentOP.010307A303CCF934
05400000
03CCF938 03CCF954 ---------------
03CCF954 000007D7
03CCF93C 00000004
__________________________________________________________________________________________________________
010307C5 |. 8B46 18 mov eax,dword ptr ds:[esi+0x18]
010307C8 |. 6A 04 push 0x4
010307CA |. 8D5424 1C lea edx,dword ptr ss:[esp+0x1C]
010307CE |. 52 push edx
010307CF |. 50 push eax
010307D0 |. FF15 1CCE1601 call dword ptr ds:[0x116CE1C] ; nvcuda.cuMemcpyHtoD
010307D6 |. 85C0 test eax,eax
010307D8 |.^ 75 C9 jnz short AccentOP.010307A3
03CCF934
05400004
03CCF938 03CCF958 ---------------
03CCF958 00000080
03CCF93C 0000000
4
03CCF954 000007D7
03CCF958 00000080
03CCF95C 00002400
03CCF960 0000005B
03CCF964 02360020
03CCF968 00000000
03CCF96C 00000000
03CCF970 00000000
03CCF974 00000000
03CCF978 00000000
03CCF97C 00000000
03CCF980 00000000
03CCF984 00000000
03CCF988 00000000
03CCF98C 00000000
03CCF990 00000000
__________________________________________________________________________________________________________
01030808 |> \8B0D F4BA1601 mov ecx,dword ptr ds:[0x116BAF4]
0103080E |. 85C9 |test ecx,ecx
01030810 |. 0F85 BA000000 |jnz AccentOP.010308D0
01030816 |. 8B5424 0C |mov edx,dword ptr ss:[esp+0xC] ; 46
0103081A |. 03FD |add edi,ebp
0103081C |. 8D0417 |lea eax,dword ptr ds:[edi+edx] ; 1AA
0103081F |. 3BC3 |cmp eax,ebx ; 1AA,C350
01030821 |. 7D 04 |jge short AccentOP.01030827
01030823 |. 3BFB |cmp edi,ebx ; 164,C350
01030825 |. 7E 02 |jle short AccentOP.01030829
01030827 |> 8BFB |mov edi,ebx
01030829 |> 8B4E 10 |mov ecx,dword ptr ds:[esi+0x10] ; 05500000
0103082C |. 8B56 0C |mov edx,dword ptr ds:[esi+0xC] ; 46
0103082F |. 51 |push ecx
01030830 |. 6A 00 |push 0x0
01030832 |. 52 |push edx
01030833 |. FF15 40CE1601 |call dword ptr ds:[0x116CE40] ; nvcuda.cuParamSeti
01030839 |. 85C0 |test eax,eax
03CCF934 03F34008
03CCF938 00000000
03CCF93C 05500000
01030841 |. 8B46 0C |mov eax,dword ptr ds:[esi+0xC]
01030844 |. 55 |push ebp ;____________________上次的164_________
01030845 |. 6A 04 |push 0x4
01030847 |. 50 |push eax
01030848 |. FF15 40CE1601 |call dword ptr ds:[0x116CE40] ; nvcuda.cuParamSeti
0103084E |. 85C0 |test eax,eax
03CCF934 03F34008
03CCF938
00000004
03CCF93C
00000000
01030856 |. 8B4E 0C |mov ecx,dword ptr ds:[esi+0xC]
01030859 |. 57 |push edi ;____________________当前的164_______
0103085A |. 6A 08 |push 0x8
0103085C |. 51 |push ecx
0103085D |. FF15 40CE1601 |call dword ptr ds:[0x116CE40] ; nvcuda.cuParamSeti
03CCF934 03F34008
03CCF938
00000008
03CCF93C
0000016401030867 |. 8B56 0C |mov edx,dword ptr ds:[esi+0xC]
0103086A |. 53 |push ebx ;_________总数C350______
0103086B |. 6A 0C |push 0xC
0103086D |. 52 |push edx
0103086E |. FF15 40CE1601 |call dword ptr ds:[0x116CE40] ; nvcuda.cuParamSeti
01030874 |. 85C0 |test eax,eax
01030876 |. 75 65 |jnz short AccentOP.010308DD
03CCF934 03F34008
03CCF938
0000000C
03CCF93C
0000C350cuParamSeti
名称
cuParamSeti – 为函数的参数列表添加一个整型参数
概要
CUresult cuParamSeti(CUfunction func,int offset,unsigned int value);
说明
设置一个整型参数,该参数将在下一次调用对应于func的内核时指定。Offset是字节偏移量。
__________________________________________________________________________________________________________
01030878 |. 8B46 0C |mov eax,dword ptr ds:[esi+0xC]
0103087B |. 6A 10 |push 0x10
0103087D |. 50 |push eax
0103087E |. FF15 3CCE1601 |call dword ptr ds:[0x116CE3C] ; nvcuda.cuParamSetSize
01030884 |. 85C0 |test eax,eax
01030886 |. 75 62 |jnz short AccentOP.010308EA
03CCF938 03F34008
03CCF93C
00000010
cuParamSetSize
名称
cuParamSetSize – 设置函数的参数大小
概要
CUresult cuParamSetSize(CUfunction func,unsigned int numbytes);
说明
通过numbytes设置函数func的函数参数所需的总大小,以字节为单位。
__________________________________________________________________________________________________________
01030888 |. 8B4E 2C |mov ecx,dword ptr ds:[esi+0x2C]
0103088B |. 8B56 0C |mov edx,dword ptr ds:[esi+0xC]
0103088E |. 6A 01 |push 0x1
01030890 |. 6A 01 |push 0x1
01030892 |. 51 |push ecx
01030893 |. 52 |push edx
01030894 |. FF15 2CCE1601 |call dword ptr ds:[0x116CE2C] ; nvcuda.cuFuncSetBlockShape
0103089A |. 85C0 |test eax,eax
0103089C |. 75 59 |jnz short AccentOP.010308F7
03CCF930 03F34008
03CCF934 000000
40
03CCF938 000000
01
03CCF93C 000000
01
cuFuncSetBlockShape
名称
cuFuncSetBlockShape – 为函数设置块维度
概要
CUresult cuFuncSetBlockShape(CUfunction func,int x,int y,int z);
说明
指定在func给定的内核启动时所创建的线程块的X、Y和Z维度。
__________________________________________________________________________________________________________0103089E |. 8B46 1C |mov eax,dword ptr ds:[esi+0x1C]
010308A1 |. 33D2 |xor edx,edx
010308A3 |. F776 2C |div dword ptr ds:[esi+0x2C]
010308A6 |. 6A 01 |push 0x1
010308A8 |. 50 |push eax
010308A9 |. 8B46 0C |mov eax,dword ptr ds:[esi+0xC]
010308AC |. 50 |push eax
010308AD |. FF15 48CE1601 |call dword ptr ds:[0x116CE48] ; nvcuda.cuLaunchGrid
010308B3 |. 85C0 |test eax,eax
010308B5 |. 75 4D |jnz short AccentOP.01030904
03CCF934 03F34008
03CCF938 000000
90
03CCF93C 00000001
cuLaunchGrid
名称
cuLaunchGrid – 启动CUDA函数
概要
CUresult cuLaunchGrid(CUfunction func,int grid_width,int grid_height);
CUresult cuLaunchGridAsync(CUfunction func,int grid_width,int grid_height,CUstream stream);
说明
在大小为grid_width x grid_height的块网格上调用内核。每个块包含此前通过调用cuFuncSetBlockShape()指定的多个线程。
cuLaunchGridAsync()是可选的,可通过传入非零stream参数关联到一个流。
__________________________________________________________________________________________________________
010308B7 |. FF15 FCCD1601 |call dword ptr ds:[0x116CDFC] ; nvcuda.cuCtxSynchronize
010308BD |. 85C0 |test eax,eax
010308BF |. 75 50 |jnz short AccentOP.01030911
cuCtxSynchronize
名称
cuCtxSynchronize – 阻塞操作,直至上下文的任务完成
概要
CUresult cuCtxSynchronize(void);
说明
在设备完成之前请求的所有任务之前阻塞操作。如果之前的某项任务失败,cuCtxSynchronize()将返回一个错误。
__________________________________________________________________________________________________________
目前要处理的问题:
1.分析问题
1.分析出准备数据的结构 ,写出相应数据处理代码
暂时是由 16字节数据+尝试密码组成
2.有几个函数功能暂时不明 ,先尝试写代码进行测试
3.末端有几个循环来设置下次的核函数 参数
2.去测试cubin模块
GPU执行之前数据
04E90020 F55CD693 撝\
04E90024 56CB92AE 畳薞
04E90028 CB0D6548 He.
04E9002C F5FF81DA 趤
04E90030 41008000 .€.A
04E90034 00000000 ....
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
04E90058 00000000 ....
04E9005C 00000090 ?..
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
04E9009C 00000000 ....
GPU执行后的结果
04E90020 F9714353 SCq
04E90024 A0888200 .倛
04E90028 B6C36237 7b枚
04E9002C 5A3655C7 荱6Z
04E90030 92C90A4B K.蓲
04E90034 00000000 ....
04E90038 00000000 ....
04E9003C 00000000 ....
04E90040 F18DD142 B褝
04E90044 8CA7AE31 1
04E90048 3A1ABB7C |?:
04E9004C E0CEE303 阄
04E90050 87B3FCFC 硣
04E90054 00000000 ....
04E90058 00000000 ....
04E9005C 00000090 ?..
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
04E9009C 00000000 ....
memcpy(buf2,inputD+8+32*i,20);
返回运算数据置换后作为buf2执行CPU下的运算,不分析了
AESInit(buf2, 0x80u, &aesContext);
AESEat(pEncryptInf->m368_key, buf4, &aesContext);
AESEat(pEncryptInf->m3A8_key, buf1, &aesContext);
AESEat(pEncryptInf->m3B8_key, &buf1[16], &aesContext);
o7MD5Init(&mdContext);
o7MD5Update(&mdContext, buf4, pEncryptInf->m320_nKeySize);
o7MD5GetFinalData(buf2, &mdContext);
return memcmp(buf1, buf2, 20) == 0;
说下前面准备数据构成
int *inputD(int*)malloc(4*0x48000);// 4* 48000=0x00120000
// ------------------内部循环准备数据-------------------------------------
// 0x2400 * 0x80 =0x120000
每个密码的所占数据区 0x80 总数据区0x120000
循环次数为0x2400
for(int inside=0;inside<0x120000;inside+=0x80)
01031006 > \8B5C24 1C mov ebx,dword ptr ss:[esp+0x1C] ; 密码位数; Cases 2,4 of switch 01030FF0
0103100A . C1E0 07 shl eax,0x7 ; 0 1>>>>0x80
0103100D . 0386 40030000 add eax,dword ptr ds:[esi+0x340] ; +偏移
01031013 . 8B7C24 18 mov edi,dword ptr ss:[esp+0x18] ; 密码ASCII码
01031017 . 8BE8 mov ebp,eax ; 数据开始位置
01031019 . 8B46 10 mov eax,dword ptr ds:[esi+0x10] ; salt F55CD693 依次放入
2位密码
0103103E . 8D55 10 lea edx,dword ptr ss:[ebp+0x10] ; 转置
01031041 > 8B1C8F mov ebx,dword ptr ds:[edi+ecx*4] ; 00410041
01031044 . 0FCB bswap ebx ; 41004100
01031046 . 891A mov dword ptr ds:[edx],ebx
01031048 . 41 inc ecx
01031049 . 83C2 04 add edx,0x4
0103104C . 3BC8 cmp ecx,eax
0103104E .^ 7C F1 jl short AccentOP.01031041
01031050 . 8B5C24 1C mov ebx,dword ptr ss:[esp+0x1C]
01031054 > F6C3 01 test bl,0x1
01031057 . 74 1D je short AccentOP.01031076
中间有注意两个判断
一个位数判断
按4字节分配
一个奇偶判断
确定0x80分配
ELF文件的确认
设备上的变量确认
循环传递核函数参数确认
int HostPre2=0x000007D7;
int HostPre3=0x00000080;
CUdevice cuDevice=0;
CUdeviceptr device_input1 =0;
CUdeviceptr device_input2 =0;
CUdeviceptr device_result =0;
CUdeviceptr device_M1=0;//05500000
CUdeviceptr device_M2=0;
CUdeviceptr device_M3=0;
CUdeviceptr device_M4=0;
cuDeviceGet(&cuDevice,0);
CUcontext cuContext;
cuCtxCreate(&cuContext,0,cuDevice);
CUmodule cuModule;
// cuModuleLoad(&cuModule,"od.cubin");
rc=cuModuleLoadData(&cuModule, codemem); //00B5F478 &cuModule----> cuModule 03CCFC38
if(rc!=CUDA_SUCCESS)
{
fprintf(stderr, "There is error on cuModuleLoadData(%ld)./n", rc);
/* free all resource */
cuCtxDestroy(cuContext);
return 0;
}
CUfunction kernel_o;
cuModuleGetFunction(&kernel_o,cuModule,"kernel_o"); //00B5F47C &kernel_o----------> kernel_o 04C8B1D8 , cuModule 03CCFC38
cuModuleGetGlobal(&device_input1,0,cuModule,"_we7742i"); //00B5F484 &device_input1-----> device_input1 05400000 ,0, cuModule 03CCFC38
cuModuleGetGlobal(&device_input2,0,cuModule,"_we7742x"); //00B5F488 &device_input2-----> device_input2 05400004 ,0, cuModule 03CCFC38
cuMemAlloc(&device_M1,0x00120000); //00B5F480 &device_M1---------> device_M1 05500000
//4* 48000=0x00120000
cuMemcpyHtoD(device_M1,inputD,0x00120000);
cuMemcpyHtoD(device_input1,&HostPre2,4);
cuMemcpyHtoD(device_input2,&HostPre3,4);
for(int i=0x164 ;i<0xC350+0x164;i+=0x164)
{
cuParamSeti(kernel_o,0,0x05500000);
cuParamSeti(kernel_o,4,i-0x164); //上次的 0 0x164
if (i+0x46>0xC350)
cuParamSeti(kernel_o,8,0xC350); //
else
{
cuParamSeti(kernel_o,8,i); //当次的 0x164 0x2c8
}
cuParamSeti(kernel_o,0xC,0xC350);//总数
cuParamSetSize(kernel_o,0x10);
cuFuncSetBlockShape(kernel_o,0x40,1,1);
cuLaunchGrid(kernel_o,0x90,1);
cuCtxSynchronize();
}
cuMemcpyDtoH(inputD,device_M1,0x00120000);
// free(codemem);
cuCtxDestroy(cuContext);
cuMemFree(device_result);
程序是使用CUDA驱动API方式处理,高级API方式分析也类似,可以参考CUDA 参考手册.doc
[课程]FART 脱壳王!加量不加价!FART作者讲授!