首页
社区
课程
招聘
[原创]分析GPU程序流程
发表于: 2013-1-23 02:11 16133

[原创]分析GPU程序流程

2013-1-23 02:11
16133
分析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  000000A0  ?..
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.010307A3


03CCF934   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   00000004

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   00000164

01030867  |.  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   0000C350

cuParamSeti
名称
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   00000040
03CCF938   00000001
03CCF93C   00000001

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   00000090
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作者讲授!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (21)
雪    币: 3187
活跃值: (2478)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
GPU还没看过,先沙发...
2013-1-23 03:14
0
雪    币: 2155
活跃值: (29)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
这个。。。以前还真木有见识过。。。首见啊。。。顶LZ
2013-1-23 08:48
0
雪    币: 130
活跃值: (61)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
CUDA不错
2013-1-23 08:50
0
雪    币: 107
活跃值: (326)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个很犀利...谢谢楼主分享
2013-1-23 11:02
0
雪    币: 93944
活跃值: (200219)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
6
Thanks for share.
2013-1-23 11:41
0
雪    币: 7971
活跃值: (3650)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
此乃大神也~~~~~ 犀利呀!
2013-1-23 16:23
0
雪    币: 4580
活跃值: (992)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
混合运算是趋势,必须学习
2013-1-23 16:39
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
9
先收下,慢慢看。
2013-1-23 20:42
0
雪    币: 92
活跃值: (209)
能力值: ( LV6,RANK:95 )
在线值:
发帖
回帖
粉丝
10
其实看什么都不知道,不过肯定是大神
2013-1-23 21:13
0
雪    币: 154
活跃值: (91)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
11
mark,感谢lz
2013-1-23 21:47
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
12
很犀利……
1234
2013-1-23 21:57
0
雪    币: 104
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
- - ,只能膜拜
不能模仿。。。
看着很犀利
备注做的不错
挺好的,不过我感觉也没啥特殊的
貌似gpu我感觉就是能做2.3d的运算。。。
其实我不太了解,百度看不懂。
2013-1-23 22:39
0
雪    币: 1318
活跃值: (149)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
Thanks for share.
2013-1-24 21:00
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
Thanks for share.
2013-1-24 23:06
0
雪    币: 163
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
谢谢楼主分享
2013-1-25 16:53
0
雪    币: 227
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这个新啊!GPU现在很强了!
2013-1-25 19:09
0
雪    币: 859
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
太........厉害了
2013-1-26 00:27
0
雪    币: 168
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
貌似楼主分析的是host部分,不是device,device程序的重点是ptx汇编没有涉及,据我理解CUDART和WIN32API应该无本质区别,都是dll封装的
2013-2-5 16:28
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
有点长,收藏学习了
2013-2-5 18:53
0
雪    币: 219
活跃值: (1634)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
21
很犀利...谢谢楼主分享
2013-2-7 21:13
0
雪    币: 347
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
果断收藏
感谢分享~
2013-2-7 21:23
0
游客
登录 | 注册 方可回帖
返回
//